代码之家  ›  专栏  ›  技术社区  ›  Rio

ansible with\带有逗号分隔item.values的项

  •  0
  • Rio  · 技术社区  · 7 年前

    我试图创建一个嵌套循环,在Ansible中使用逗号分隔的item.values。 变量: -我的资源

    - name: Create users files
      copy:
      dest: "/etc/vsftpd_users/{{ item.id }}"
      content: |
        local_root=/vol/{{ item.name }}
      with_items: 
      - "{{ my_resources.split(',') }}" 
    

    我的期望应该是如下所示,就像每个文件都是用适当的内容创建的一样。

    $ cat user1
    share1
    
    $ cat user2
    share1
    
    $ cat user4
    share2
    

    但是,使用上述脚本创建的文件如下所示

    -rw-r--r-- 1 root root 22 Oct 11 08:15 [u'user1', u'user2', u'user3']
    -rw-r--r-- 1 root root 29 Oct 11 08:15 [u'user4']
    

    2 回复  |  直到 7 年前
        1
  •  1
  •   Ignacio Millán    7 年前

    它可以通过 loop subelements lookup/query ,从版本2.5开始支持

    - hosts: localhost
      vars:
        users:
          - name: 'share1'
            id: "{{'user1,user2,user3'.split(',')}}"
          - name: 'share2'
            id: "{{'user4'.split(',')}}"
    
      tasks:
      - name: Create users file with content
        copy:
          dest: "/etc/vsftpd_users/{{ item.1 }}"
          content: |
            local_root=/vol/{{ item.0.name }}
        loop: "{{lookup('subelements', users, 'id', skip_missing=True)}}"
    
        2
  •  0
  •   Gabriel Pereira    7 年前

    Ansible不能在没有脚本的情况下处理过于复杂的数据结构; 为了方便起见,您应该将您的用户数据重新构造为一个带有单个ID的dict列表,如:

    - name: Create users file with content
      copy:
      dest: "/etc/vsftpd_users/{{ item.id }}"
      content: |
        local_root=/vol/{{ item.name }}
      with_items:
      - { name: 'share1', id: 'user1' }
      - { name: 'share1', id: 'user2' }
      - { name: 'share1', id: 'user3' }
      - { name: 'share2', id: 'user4' }