Ansible: заполнение новых полей в каждом элементе списка

Ansible: заполнение новых полей в каждом элементе списка

Я полный новичок в Ansible и Python. У меня есть список:

my_items:
- name: item1
  unix_user: unixuser1
  homedir: /home/unixuser2
- name: item2
  unix_user: unixuser2
  homedir: /home/unixuser2

Я хотел бы создать виртуального пользователя pureftpd для каждого из «my_items».

Роль ожидает такую ​​переменную:

my_items:
- name: item1
  unix_user: unixuser1
  homedir: /home/unixuser2
  uid: 1001
  guid: 1001
- name: item2
  unix_user: unixuser2
  homedir: /home/unixuser2
  uid: 1002
  guid: 1002

Я знаю, как получить uid/guid (используя getent). Я могу добавить новые ключи/значения к каждому элементу:

- name: "Populate UID and GID in my_items"
  set_fact:
    item: "{{ item | combine( { 'uid': getent_passwd[item.unix_user][1], 'gid': getent_passwd[item.unix_user][2] }) }}"
  with_items: "{{ my_items }}"

Но, конечно, «глобальная» переменная my_items не обновляется.

Я попытался создать новый «словарь», но не могу усвоить столько концепций одновременно.

Любая помощь будет оценена по достоинству!

решение1

Мне наконец удалось это сделать.

- name: "getent variables"
  getent:
    database: passwd
    
- name: Create Dictionary for FTP accounts
  set_fact:
    ftp_accounts: >
       {{ ftp_accounts | default([]) + [{
           'name': item.unix_user,
           'password': item.ftp_password,
           'homedir': item.path,
           'uid': getent_passwd[item.unix_user][1],
           'guid': getent_passwd[item.unix_user][2]
          } ] }}
  with_items:
    "{{ my_items }}"

Затем я могу отправить свой новый dict на мою роль:

- name: gcoop-libre.pure-ftpd
  vars:
    pureftpd_virtual_users: "{{ ftp_accounts }}"

Будьте осторожны, я работал на локальном хосте, но пользователи Unix (очевидно) создаются только на удаленном компьютере, поэтому getent_passwd[item.unix_user] был неопределен, что приводило к появлению загадочного сообщения об ошибке (приведение к Unicode: нужна строка или буфер, список найден).

Связанный контент