如何遍历Ansible字典变量以批量部署Nginx配置文件
解决方案
你的allservers变量属于字典嵌套列表结构,第一层key为服务器标识,第二层是对应服务器的Nginx配置项列表,之前使用with_items/with_nested不生效是因为没有正确匹配变量的嵌套结构。
以下为适配不同场景的正确写法(均兼容Ansible 2.5+版本,推荐优先使用loop语法替代旧版with_*语法):
场景1:给当前执行任务的目标主机分发对应配置
要求allservers的第一层key和你的inventory主机名保持一致,在tasks/main.yml中编写如下template任务即可:
- name: 分发Nginx站点配置 ansible.builtin.template: src: "{{ item.src }}" dest: "{{ item.dest }}" owner: root group: root mode: '0644' loop: "{{ allservers[inventory_hostname] }}" notify: 重启Nginx
该写法会自动识别当前执行任务的主机是server1还是server2,自动加载对应配置列表循环执行。
场景2:从控制端一次性遍历所有服务器的所有配置项
使用subelements过滤器处理嵌套结构即可:
- name: 批量分发所有服务器的Nginx配置 ansible.builtin.template: src: "{{ item.1.src }}" dest: "{{ item.1.dest }}" delegate_to: "{{ item.0 }}" # 委派任务到对应目标服务器执行 owner: root group: root mode: '0644' loop: "{{ allservers | dict2items | subelements('value') }}"
这里的item.0对应allservers的第一层key(即server1/server2),item.1对应具体的配置项。
旧版with_*语法兼容写法
如果需要使用旧版with_*语法,对应场景2可以用with_subelements实现:
- name: 旧版语法批量分发配置 template: src: "{{ item.1.src }}" dest: "{{ item.1.dest }}" delegate_to: "{{ item.0 }}" owner: root group: root mode: '0644' with_subelements: - "{{ allservers | dict2items }}" - value
内容的提问来源于stack exchange,提问作者Aldem
相关产品推荐
相关产品推荐

