Ansible:在列表的每个项目中填充新字段

Ansible:在列表的每个项目中填充新字段

我是 Ansible 和 Python 的新手。我有一份清单:

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

我想为每个“my_items”创建一个 pureftpd 虚拟用户。

该角色等待这样的变量:

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 }}"

然后,我可以将我的全新字典发送给我的角色:

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

请注意,我在本地主机上工作,但 Unix 用户(显然)仅在远程创建,因此 getent_passwd[item.unix_user] 未定义,导致出现神秘的错误消息(强制转换为 Unicode:需要字符串或缓冲区,找到列表)。

相关内容