如何在Ansible中遍历用户列表,合并多目录创建任务?
合并Ansible FTP目录创建任务的实现方案
需求:为每个FTP客户端创建主目录,同时在每个主目录下生成import和export子目录,现有三个重复的file任务,需合并为单个任务完成。
原有任务代码
- name: "Create directories for virtual users" ansible.builtin.file: dest: "/var/ftp_clients/{{ item.name }}" state: directory mode: 0755 owner: ftp group: ftp with_items: "{{ ftp_users }}" - name: "Create import dir for virtual users" ansible.builtin.file: dest: "/var/ftp_clients/{{ item.name }}/import" state: directory mode: 0755 owner: ftp group: ftp with_items: "{{ ftp_users }}" - name: "Create export for virtual users" ansible.builtin.file: dest: "/var/ftp_clients/{{ item.name }}/export" state: directory mode: 0755 owner: ftp group: ftp with_items: "{{ ftp_users }}"
对应变量定义
ftp_users: - name: client1 password: toto - name: client2 password: toto - name: client3 password: toto
合并后的实现方案
使用Ansible的product过滤器生成用户与目录后缀的笛卡尔积,通过单个file任务完成所有目录创建:
- name: Create main and subdirectories for virtual FTP users ansible.builtin.file: dest: "/var/ftp_clients/{{ item.0.name }}{{ item.1 }}" state: directory mode: 0755 owner: ftp group: ftp loop: "{{ ftp_users | product(['', '/import', '/export']) | list }}"
方案说明
product过滤器将ftp_users列表与包含空字符串、/import、/export的列表做笛卡尔积,每个用户会生成3条路径:主目录、主目录/import、主目录/export- 单个
loop遍历所有生成的路径,一次性完成所有目录的创建 file模块的state: directory会自动处理父目录的创建,无需担心子目录依赖主目录的问题
内容的提问来源于stack exchange,提问作者Louis Gromb
相关产品推荐
相关产品推荐

