как назначить UID из заданного диапазона в задаче ansible

Вопрос или проблема

У меня есть задача ansible для создания пользователя, и вместо указания UID класса, как показано ниже, он должен выбирать из свободного диапазона между (1000-1099) и назначать следующий доступный UID в последовательном порядке, как это сделать?

- name: создать пользователя и группу
    user:
     name: user
     shell: /bin/bash
     uid: 1000
     comment: системный администратор

с помощью_sequences это то, что вам нужно:

- name: создать пользователя и группу
  user:
    name: user
    shell: /bin/bash
    uid: "{{ item }}"
    comment: системный администратор
  with_sequence: start=1000 end=1099

При отсутствии пользовательского каталога нет центрального органа по именам и идентификаторам пользователей. (Может стоит рассмотреть возможность внедрения аутентификации в каталоге в какой-то момент.)

Поддерживайте список пользователей с их UID в переменной, переопределяя на уровнях group_vars или host_vars, где это необходимо. Возможно, для группы abc используйте файл vars group_vars/abc/users.yml:

---
users:
  - uid: 1000
    name: user
    comment: "системный администратор"
  - uid: 1001
    name: alice
    comment: "Элис Алвин"
  - uid: 1002
    name: beth
    comment: "Бет Бьорн"
  - uid: 1003
    name: Chris
    comment: "Крис Сайверс"

Задача выглядит примерно так:

---
- name: создать пользователей
  loop: "{{ users }}"
  user:
    name: "{{ item.name }}"
    shell: /bin/bash
    uid: "{{ item.uid }}"
    comment: "{{ item.comment }}"

Остается несколько задач, чтобы сделать этот плейбук подходящим для вашей цели:

  • Составьте список групп и создайте их аналогичным образом.
  • Создайте переопределения для переменной users для групп, у которых есть конфликтующие GID или UID.

Ответ или решение

Для того чтобы назначить UID (идентификатор пользователя) из заданного диапазона (например, от 1000 до 1099) в задаче Ansible, можно использовать несколько подходов. Основная цель — находить и назначать следующие доступные UID, что позволит избежать конфликтов с уже существующими пользователями.

Шаги для решения проблемы

1. Определение списка уже существующих UIDs

Для начала вам необходимо собрать информацию о существующих пользователях и их UID. Это можно сделать с помощью команды getent passwd, которая вернет список всех пользователей и их UID. Для этого вам потребуется создать задачу, которая будет хранить значения существующих UID в переменной:

- name: Get existing UIDs
  command: getent passwd | cut -d: -f3
  register: existing_uids

- set_fact:
    existing_uid_list: "{{ existing_uids.stdout_lines | map('int') | list }}"

2. Генерация списка доступных UIDs

С помощью сгенерированного ранее списка существующих UID, можно сформировать список доступных UID в заданном диапазоне (1000–1099). Для этого воспользуемся фильтрацией:

- name: Generate available UIDs
  set_fact:
    available_uids: "{{ range(1000, 1100) | difference(existing_uid_list) }}"

3. Создание пользователей с последовательным назначением UID

Теперь, когда у нас есть список доступных UIDs, мы можем создать пользователей в цикле. Используем модуль user и передаем доступные UID в качестве элемента:

- name: Create users with available UIDs
  user:
    name: "{{ item.name }}"
    shell: /bin/bash
    uid: "{{ item.uid }}"
    comment: "{{ item.comment }}"
  loop: "{{ users | selectattr('uid', 'in', available_uids) | list }}"

4. Определение списка пользователей для создания

Перед выполнением предыдущей задачи необходимо определить список пользователей, который будет включать информацию о каждом пользователе (имя, UID, комментарий):

users:
  - name: user
    comment: "System Admin"
  - name: alice
    comment: "Alice Alvin"
  - name: beth
    comment: "Beth Biorn"
  - name: chris
    comment: "Chris Civers"

Полный пример плейбука

---
- hosts: all
  tasks:
    - name: Get existing UIDs
      command: getent passwd | cut -d: -f3
      register: existing_uids

    - set_fact:
        existing_uid_list: "{{ existing_uids.stdout_lines | map('int') | list }}"

    - name: Generate available UIDs
      set_fact:
        available_uids: "{{ range(1000, 1100) | difference(existing_uid_list) }}"

    - name: Define users
      set_fact:
        users:
          - name: user
            comment: "System Admin"
          - name: alice
            comment: "Alice Alvin"
          - name: beth
            comment: "Beth Biorn"
          - name: chris
            comment: "Chris Civers"

    - name: Create users with available UIDs
      user:
        name: "{{ item.name }}"
        shell: /bin/bash
        uid: "{{ available_uids.pop(0) }}"
        comment: "{{ item.comment }}"
      loop: "{{ users }}"
      when: available_uids | length > 0

Заключение

Данный подход позволяет динамически определять доступные UID из заданного диапазона и автоматически назначать их пользователям, избегая конфликтов. Поддерживайте актуальность списка пользователей и их прав для эффективного управления доступом в вашей системе. Успехов в использовании Ansible для автоматизации управления пользователями!

Оцените материал
Добавить комментарий

Капча загружается...