代码之家  ›  专栏  ›  技术社区  ›  Geert Smelt

根据主机变量的值从Ansible库存中选择主机

  •  0
  • Geert Smelt  · 技术社区  · 1 年前

    我正在尝试使用Ansible设置一个客户端和服务器,它们需要相互连接(在本例中为Wireguard客户端和服务器)。由于服务器需要知道将连接到它的对等体,我希望收集一个主机列表,服务器将能够在其配置中为其创建对等条目。该列表应该是动态生成的(可能有多个客户端连接到同一服务器),并基于 target_server 分配给每个客户端的变量,其值应等于 inventory_hostname 不幸的是,我在下面的MWE中使用的jinja2表达式一直是空的,但我不确定如何改进它。

    行动手册

    - name: Set up Wireguard Server
      hosts: servers
      gather_facts: true
      tasks:
        - name: Figure out peers for this server
          become: false
          ansible.builtin.debug:
            var: item
          loop: "{{ groups['servers'] | select('match', 'target_server={{ inventory_hostname }}') | map('extract', hostvars, 'inventory_hostname') | list }}"
    

    库存

    servers:
      hosts:
        Wireguard-Server:
          ansible_host: 2.3.4.5
    
    clients:
      hosts:
        Wireguard-Client-1:
          ansible_host: 1.2.3.4
          target_server: Wireguard-Server
        Wireguard-Client-2:
          ansible_host: 4.3.2.1
          target_server: Different-Server
    

    日志

    TASK [Figure out peers for this server] ********************************************
    skipping: [Wireguard-Server] =>
      skipped_reason: No items in the list
    
    0 回复  |  直到 1 年前
        1
  •  2
  •   Vladimir Botka    1 年前

    创建客户端和target_server的字典

      clients: "{{ dict(groups.clients|
                        zip(groups.clients|
                            map('extract', hostvars, 'target_server'))) }}"
    

    给予

      clients:
        Wireguard-Client-1: Wireguard-Server
        Wireguard-Client-2: Different-Server
    

    使用它来选择匹配的客户端

      my_clients: "{{ clients|dict2items|
                      selectattr('value', 'eq', inventory_hostname)|
                      map(attribute='key') }}"
    

    给予

      my_clients:
      - Wireguard-Client-1
    

    完整的测试剧本示例

    - hosts: servers
    
      vars:
    
        clients: "{{ dict(groups.clients|
                          zip(groups.clients|
                              map('extract', hostvars, 'target_server'))) }}"
        my_clients: "{{ clients|dict2items|
                        selectattr('value', 'eq', inventory_hostname)|
                        map(attribute='key') }}"
    
      tasks:
    
        - debug:
            var: clients
    
        - debug:
            var: my_clients
    

    您可以从资源清册中选择匹配的所有主机 目标服务器

      my_clients: "{{ hostvars|dict2items|
                      selectattr('value.target_server', 'defined')|
                      selectattr('value.target_server', 'eq', inventory_hostname)|
                      map(attribute='key') }}"
    
    推荐文章