Ansible优化咨询:单任务批量创建用户in/out目录的最优方案
问题
需要优化Ansible角色,因为要部署超过1000个用户,每个用户创建时需同步创建多个目录,当前两次遍历用户字典的方式耗时过长。
现有users.yml配置如下:
ftp_users: testuser1: public_key: "public key" password: "sha string" home: /home/testuser1 customer_type: linux testuser2: public_key: "public key" password: "sha string" home: /home/testuser2 customer_type: windows
当前使用两个独立任务遍历用户字典创建目录:
- name: Create required out-folder for jailed users. become: true ansible.builtin.file: owner: "{{ item.key }}" group: ftpusers mode: 0770 path: "/home/{{ item.value.customer_type }}/{{ item.key }}/out" state: directory loop: "{{ ftp_users | dict2items }}" when: "'state' not in item.value or item.value.state == 'present'" - name: Create required in-folder for jailed users. become: true ansible.builtin.file: owner: "{{ item.key }}" group: ftpusers mode: 0770 path: "/home/{{ item.value.customer_type }}/{{ item.key }}/in" state: directory loop: "{{ ftp_users | dict2items }}" when: "'state' not in item.value or item.value.state == 'present'"
希望合并为一个任务,无需两次遍历整个字典,询问使用nested_loops还是product过滤器更合适,并需要示例。
解决方案
使用**product过滤器**更合适,它可以将用户列表与目录后缀列表做笛卡尔积,实现一次遍历完成所有目录的创建,避免重复遍历1000个用户的开销。
示例代码如下:
- name: Create required in/out folders for jailed users become: true ansible.builtin.file: owner: "{{ item.0.key }}" group: ftpusers mode: 0770 path: "/home/{{ item.0.value.customer_type }}/{{ item.0.key }}/{{ item.1 }}" state: directory loop: "{{ (ftp_users | dict2items) | product(['in', 'out']) }}" when: "'state' not in item.0.value or item.0.value.state == 'present'"
代码说明:
(ftp_users | dict2items)将用户字典转换为列表形式,每个元素包含用户的key和value| product(['in', 'out'])将用户列表与目录后缀列表做笛卡尔积,生成每个用户对应两个目录的组合- 遍历过程中,
item.0指代用户数据,item.1指代目录后缀(in或out) - 保留原有的
when条件,确保只处理状态为present的用户
内容的提问来源于stack exchange,提问作者sangul
相关产品推荐
相关产品推荐

