首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ansible中创建每个库存主机的变量列表

如何在ansible中创建每个库存主机的变量列表
EN

Stack Overflow用户
提问于 2022-03-24 20:09:45
回答 1查看 405关注 0票数 1

我有以下情况。

我有这样的清单(仅限于相关信息):

代码语言:javascript
复制
[management]
management-1 vhost_ip=10.0.0.1

[database]
db-1 vhost_ip=10.0.1.1
db-2 vhost_ip=10.0.1.2

[application]
app-1 vhost_ip=10.0.2.1
app-2 vhost_ip=10.0.2.2

现在我需要创作一个这样的剧本:

代码语言:javascript
复制
- name: Setup management server
  hosts: management
  become: true
  roles:
    - management
      database_ips:
        - 10.0.1.1
        - 10.0.1.1
      application_ips:
        - 10.0.2.1
        - 10.0.2.1

如您所见,我的管理角色需要一个按角色分组的所有IP的列表。

我的存货里已经有这些IP了。

有没有办法进行转换,以提取这些IP并将其转化为列表?所以我可以这样称呼它(基于高阶列表的伪代码):

代码语言:javascript
复制
  roles:
    - management
      database_ips: {{ groups['databse']->map->vhost_ip }}
      application_ips: {{ groups['application']->map->vhost_ip }}

还有可能做一些类似的事情,但使用这样一种更复杂的格式(将vhost_ip从inventory映射到参数中的ip,将alias映射到参数中的name ):

代码语言:javascript
复制
  roles:
    - management
      database_hosts:
        - name: db-1
          ip: 10.0.1.1
        - name: db-2
          ip: 10.0.1.1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-24 21:34:20

是的,使用应用于特殊变量 hostvars的一组合适的过滤器可以很容易地实现这一点。

我们要应用的一组过滤器是:

  • dict2items,这样我们就可以列出hostvars字典的列表,以便对其进行筛选。
  • 为了过滤特定节点中的节点,使用另一个特殊变量groups
  • 最后,将每个字典中的一个属性提取为一个简单列表的map

因此,我们最终得到了这些变量:

代码语言:javascript
复制
application_ips: >-
  {{
    hostvars  
    | dict2items 
    | selectattr('key', 'in', groups.application) 
    | map(attribute='value.vhost_ip')
  }} 
database_ips: >-
  {{
    hostvars  
    | dict2items 
    | selectattr('key', 'in', groups.database) 
    | map(attribute='value.vhost_ip')
  }}
management_ips: >-
  {{
    hostvars  
    | dict2items 
    | selectattr('key', 'in', groups.management) 
    | map(attribute='value.vhost_ip')
  }}

至于更复杂的需求,您可以使用json_queryJMESPath查询。

代码语言:javascript
复制
application_ips: >-
  {{
    hostvars  
    | dict2items 
    | selectattr('key', 'in', groups.application) 
    | json_query('[].{name: key, ip: value.vhost_ip}')
  }} 
database_ips: >-
  {{
    hostvars  
    | dict2items 
    | selectattr('key', 'in', groups.database) 
    | json_query('[].{name: key, ip: value.vhost_ip}')
  }}
management_ips: >-
  {{
    hostvars  
    | dict2items 
    | selectattr('key', 'in', groups.management) 
    | json_query('[].{name: key, ip: value.vhost_ip}')
  }}

考虑到剧本:

代码语言:javascript
复制
- hosts: all
  gather_facts: no

  tasks:
    - debug:
        msg: 
          application_ips: "{{ application_ips }}"
          database_ips: "{{ database_ips }}"
          management_ips: "{{ management_ips }}"
      vars:
        application_ips: >-
          {{
            hostvars  
            | dict2items 
            | selectattr('key', 'in', groups.application) 
            | map(attribute="value.vhost_ip")
          }} 
        database_ips: >-
          {{
            hostvars  
            | dict2items 
            | selectattr('key', 'in', groups.database) 
            | map(attribute="value.vhost_ip")
          }}
        management_ips: >-
          {{
            hostvars  
            | dict2items 
            | selectattr('key', 'in', groups.management) 
            | map(attribute="value.vhost_ip")
          }}
      run_once: true
      delegate_to: localhost

    - debug:
        msg: 
          application_ips: "{{ application_ips }}"
          database_ips: "{{ database_ips }}"
          management_ips: "{{ management_ips }}"
      vars:
        application_ips: >-
          {{
            hostvars  
            | dict2items 
            | selectattr('key', 'in', groups.application) 
            | json_query('[].{name: key, ip: value.vhost_ip}')
          }} 
        database_ips: >-
          {{
            hostvars  
            | dict2items 
            | selectattr('key', 'in', groups.database) 
            | json_query('[].{name: key, ip: value.vhost_ip}')
          }}
        management_ips: >-
          {{
            hostvars  
            | dict2items 
            | selectattr('key', 'in', groups.management) 
            | json_query('[].{name: key, ip: value.vhost_ip}')
          }}
      run_once: true
      delegate_to: localhost

这产生了:

代码语言:javascript
复制
TASK [debug] ******************************************************
ok: [node2 -> localhost] => 
  msg:
    application_ips:
    - 10.0.2.1
    - 10.0.2.2
    database_ips:
    - 10.0.1.1
    - 10.0.1.2
    management_ips:
    - 10.0.0.1

TASK [debug] ******************************************************
ok: [node2 -> localhost] => 
  msg:
    application_ips:
    - ip: 10.0.2.1
      name: app-1
    - ip: 10.0.2.2
      name: app-2
    database_ips:
    - ip: 10.0.1.1
      name: db-1
    - ip: 10.0.1.2
      name: db-2
    management_ips:
    - ip: 10.0.0.1
      name: management-1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71608812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档