【问题标题】:adding children groups dynamically using ansible使用 ansible 动态添加子组
【发布时间】:2019-08-27 08:33:43
【问题描述】:

我想动态复制以下静态清单:

novaclient ansible_connection=local

[masters]
192.168.13.236

[nodes]
192.168.13.201
192.168.13.237

[cluster:children]
masters
nodes

阅读 ansible 文档,add_host 模块似乎是合适的候选者,因为它旨在将主机(或者组)添加到 ansible-playbook 内存清单。这是我的做法:

- hosts: all

  connection: local

  vars:
    ips_per_group:
      - ["masters", "192.168.13.236"]
      - ["nodes"  , "192.168.13.201"]
      - ["nodes"  , "192.168.13.237"]

  tasks:

    - name: add host dynamically
      add_host:
        name: "{{ item[1] }}"
        groups: "{{ item[0] }}" 
      loop: "{{ ips_per_group }}"

    - name: add masters and nodes groups to cluster group
      add_host:
        name: "{{ item[0] }}"
        groups: "cluster"
      loop: "{{ ips_per_group }}"

    - name: test
      debug:
        var: groups

运行该剧本会触发以下警告:

 [WARNING]: Found both group and host with same name: masters
 [WARNING]: Found both group and host with same name: nodes

据我了解,这些警告来自以下事实:mastersnodes 尚未声明为 cluster 组的 children。尝试以下语法:

- name: add masters and nodes groups to cluster group
  add_host:
    name: "{{ item }}"
    groups: "cluster:children"
  loop:
    - masters

由于groups 名称中的冒号而触发以下警告:

 [WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details

你有什么想法在没有任何警告的情况下这样做吗?

谢谢

【问题讨论】:

    标签: ansible


    【解决方案1】:

    当我尝试您的示例并重新阅读文档时,我很惊讶它不起作用。

    但是在阅读了module's source 之后,我并没有真正看到任何实际实现将组添加为子项的内容(或者至少是干净的,因此来自the inventory data management class 的警告)

    但是您仍然可以通过一次将主机添加到所有需要的组来获得所需的结果,这将在最后给出相同的结果(检查 groups var 与包含子声明的静态清单,它与我的相同在下面提供)

    ---
    - hosts: localhost
      gather_facts: false
    
      vars:
        ips_per_group:
          - ["masters", "192.168.13.236"]
          - ["nodes"  , "192.168.13.201"]
          - ["nodes"  , "192.168.13.237"]
    
      tasks:
        - name: Add host dynamically
          add_host:
            name: "{{ item[1] }}"
            groups:
              - "{{ item[0] }}"
              - cluster
          loop: "{{ ips_per_group }}"
    
        - name: See result
          debug:
            var: groups
    

    请注意,如果您仍想将其保留在单独的任务中并利用已创建的组作为子组,您可以这样做:

      tasks:
    
        - name: Add host dynamically
          add_host:
            name: "{{ item[1] }}"
            groups:
              - "{{ item[0] }}"
          loop: "{{ ips_per_group }}"
    
        - name: Add masters and nodes to cluster group
          add_host:
            name: "{{ item }}"
            groups:
              - cluster
          loop: "{{ ['masters', 'nodes'] |
            map('extract', groups) |
            list | flatten | unique }}"
    

    无论您选择哪种解决方案,这都是结果组(前提是您在开始时有一个空库存)

    TASK [See result] *******************************************************************************************************************************************************************************************************************************************************
    ok: [localhost] => {
        "groups": {
            "all": [
                "192.168.13.236",
                "192.168.13.201",
                "192.168.13.237"
            ],
            "cluster": [
                "192.168.13.236",
                "192.168.13.201",
                "192.168.13.237"
            ],
            "masters": [
                "192.168.13.236"
            ],
            "nodes": [
                "192.168.13.201",
                "192.168.13.237"
            ],
            "ungrouped": []
        }
    }
    

    【讨论】:

    • 您的解决方案完全符合我的要求。非常感谢
    【解决方案2】:

    可以使用group_by – Create Ansible groups based on facts。修改后的数据结构使示例更简单,下面的剧本展示了它是如何工作的。

    - name: 1.Create my_groups
      hosts: localhost
      gather_facts: false
      vars:
        ips_per_group:
          192.168.13.236:
            my_groups: ['masters']
            my_children_group: 'cluster'
          192.168.13.201:
            my_groups: ['nodes']
            my_children_group: 'cluster'
          192.168.13.237:
            my_groups: ['nodes']
            my_children_group: 'cluster'
      tasks:
        - name: add host dynamically
          add_host:
            name: "{{ item.key }}"
            groups: "{{ item.value.my_groups }}" 
            group_children: "{{ item.value.my_children_group }}"
          loop: "{{ ips_per_group|dict2items }}"
        - debug:
            var: groups
    
    - name: 2.Create children for group masters
      hosts: masters
      gather_facts: false
      tasks:
        - name: add hosts to children groups
          group_by:
            key: "{{ group_children }}"
        - debug:
            var: groups
    
    - name: 3.Create children for group nodes
      hosts: nodes
      gather_facts: false
      tasks:
        - name: add hosts to children groups
          group_by:
            key: "{{ group_children }}"
        - debug:
            var: groups
    
    - name: 4.Test group cluster
      hosts: cluster
      gather_facts: false
      tasks:
        - debug:
            var: group_children
        - debug:
            var: groups
    
    - name: 5.Print groups
      hosts: localhost
      tasks:
        - debug:
            var: groups
    

    播放“5.Print groups”给

    "groups": {
        "all": [
            "192.168.13.201", 
            "192.168.13.236", 
            "192.168.13.237"
        ], 
        "cluster": [
            "192.168.13.236", 
            "192.168.13.201", 
            "192.168.13.237"
        ], 
        "masters": [
            "192.168.13.236"
        ], 
        "nodes": [
            "192.168.13.201", 
            "192.168.13.237"
        ], 
        "ungrouped": []
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 2018-05-26
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      相关资源
      最近更新 更多