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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:25:17