如何用Ansible遍历列表构建指定SFTP目录结构?
用Ansible生成指定嵌套SFTP目录结构
现有变量定义
vars: sftp_users: - name: user1 authorized: [user1.pub] append: True home: /cdrstorage/sftp/user1 sftp_directories: - folder1 - folder2 - name: user2 authorized: [user2.pub] append: True home: /cdrstorage/sftp/user2 sftp_directories: - folder3 sftp_subdirectories: - source - processed - rejected
需求目标
为每个SFTP用户生成嵌套目录结构,每个用户的sftp_directories下都要包含通用的sftp_subdirectories子目录,最终结构如下:
/cdrstorage/sftp/user1/folder1/source /cdrstorage/sftp/user1/folder1/processed /cdrstorage/sftp/user1/folder1/rejected /cdrstorage/sftp/user1/folder2/source /cdrstorage/sftp/user1/folder2/processed /cdrstorage/sftp/user1/folder2/rejected /cdrstorage/sftp/user2/folder3/source /cdrstorage/sftp/user2/folder3/processed /cdrstorage/sftp/user2/folder3/rejected
最优实现方案
可以通过subelements结合product过滤器,在单个file模块任务中完成所有目录的创建,无需额外的变量预处理。具体Playbook代码如下:
- name: 创建SFTP嵌套目录结构 hosts: your_target_hosts vars: sftp_users: - name: user1 authorized: [user1.pub] append: True home: /cdrstorage/sftp/user1 sftp_directories: - folder1 - folder2 - name: user2 authorized: [user2.pub] append: True home: /cdrstorage/sftp/user2 sftp_directories: - folder3 sftp_subdirectories: - source - processed - rejected tasks: - name: 创建所有嵌套SFTP目录 file: path: "{{ user.home }}/{{ directory }}/{{ subdir }}" state: directory mode: '0755' owner: "{{ user.name }}" group: "{{ user.name }}" loop: "{{ sftp_users | subelements('sftp_directories') | product(sftp_subdirectories) }}" loop_control: label: "{{ user.name }}/{{ directory }}/{{ subdir }}" vars: user: "{{ item.0.0 }}" directory: "{{ item.0.1 }}" subdir: "{{ item.1 }}"
方案说明
subelements过滤器:将sftp_users列表中的每个用户与其对应的sftp_directories子列表展开,生成形如(用户对象, 目录名)的元组列表。product过滤器:把上述元组列表与sftp_subdirectories列表做笛卡尔积,得到所有需要创建的目录组合:((用户对象, 目录名), 子目录名)。- 变量提取:通过
vars字段从循环项中拆分出用户、主目录、子目录信息,拼接成完整的目录路径。 - loop_control:用
label简化输出日志,只显示关键的目录路径,避免冗余信息。
这种方式既简洁又能准确关联每个用户的专属目录,避免了手动嵌套循环的繁琐,也解决了之前使用with_nested时无法正确关联用户与私有目录的问题。
内容的提问来源于stack exchange,提问作者lokyiu
相关产品推荐
相关产品推荐

