You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:10:39