如何迭代ansible字典中的变量

How to iterate over variables in an ansible dictionary

我有一个角色应该使用 Jinja2 模板将 NGINX 配置分散到不同的服务器上,参考 defaults/main 中指定的变量,请告诉我如何写一个循环以正确迭代这些变量,尝试通过 with_items 和 with_nested,但没有任何反应。
defaults/main 文件如下所示:

allservers:
  server1:
    - { src: 'templates/sites-enabled/api.j2',                       dest: '/etc/nginx/sites-enabled/api.conf' }                               
    - { src: 'templates/sites-enabled/citizens.j2',                  dest: '/etc/nginx/sites-enabled/citizens.conf' }
    - { src: 'templates/sites-enabled/control.j2',                   dest: '/etc/nginx/sites-enabled/control.conf' }
    - { src: 'templates/sites-enabled/documents.j2',                 dest: '/etc/nginx/sites-enabled/documents.conf' }
    - { src: 'templates/sites-enabled/orders.j2',                    dest: '/etc/nginx/sites-enabled/orders.conf' }
    - { src: 'templates/sites-enabled/logs.j2',                      dest: '/etc/nginx/sites-enabled/logs.conf' }

  server2:
    - { src: 'templates/sites-enabled/permissions.j2',               dest: '/etc/nginx/sites-enabled/permissions.conf' }
    - { src: 'templates/sites-enabled/documents.j2',                 dest: '/etc/nginx/sites-enabled/documents.conf' }
    - { src: 'templates/sites-enabled/default.j2',                   dest: '/etc/nginx/sites-enabled/default' }
    - { src: 'templates/sites-enabled/orders.j2',                    dest: '/etc/nginx/sites-enabled/orders.conf' }
    - { src: 'templates/sites-enabled/settings.j2',                  dest: '/etc/nginx/sites-enabled/settings.conf' }

我假设您不想更改您的数据结构,并且 server1server2 指的是您清单中的主机。

---                                                                             
- hosts: server1:server2                                                        
  remote_user: ansible                                                          
  vars:                                                                         
    allservers:                                                                 
      server1:                                                                  
          - { src: "/tmp/file1", dest: "/tmp"}                                  
          - { src: "/tmp/file2", dest: "/tmp"}                                  
          - { src: "/tmp/file3", dest: "/tmp"}                                  
      server2:                                                                  
          - { src: "/tmp/file4", dest: "/tmp"}                                  
          - { src: "/tmp/file5", dest: "/tmp"}                                  
          - { src: "/tmp/file6", dest: "/tmp"}    


  tasks:
    - name: Copy template
      template:
        src: "{{ item.src }}"
        dest: "{{ item.dest }}"
      when: inventory_hostname in allservers.keys()
      with_items:
        - "{{ allservers[inventory_hostname] }}"

另一个解决方案是包含一个任务 (copy_template.yml),您将使用 with_dict: allservers.

对其进行迭代

playbook.yml

---                                                                             
- hosts: server1:server2                                                        
  remote_user: ansible                                                          
  vars:                                                                         
    allservers:                                                                 
      server1:                                                                  
          - { src: "/tmp/file1", dest: "/tmp"}                                  
          - { src: "/tmp/file2", dest: "/tmp"}                                  
          - { src: "/tmp/file3", dest: "/tmp"}                                  
      server2:                                                                  
          - { src: "/tmp/file4", dest: "/tmp"}                                  
          - { src: "/tmp/file5", dest: "/tmp"}                                  
          - { src: "/tmp/file6", dest: "/tmp"}                                  
  tasks:                                                                        
    - include: copy_template.yml                                                
      vars:                                                                     
        server: "{{ item.key }}"                                                
      with_dict:                                                                
        - "{{ allservers }}" 

copy_template.yml

---                                                                             
- debug:                                                                        
    msg: "{{ template.src }}  and  {{ template.dest }}"                         
  loop: "{{ allservers[server] }}"                                  
  when: server == inventory_hostname                                            
  loop_control:                                                                 
    loop_var: template