在Ansible中合并2个组

在Ansible中合并2个组,ansible,Ansible,我在ansible的库存中有2个主机组,如下所示: [loadbalancer-add] 172.23.130.97 172.23.130.98 [loadbalancer-remove] 172.23.130.99 172.23.130.100 [loadbalancer] 172.23.130.97 172.23.130.99 172.23.130.98 172.23.130.100 我想合并这些组,将它们传递给loadbalancer API,以便添加服务器,然后删除服务器。因此,我

我在ansible的库存中有2个主机组,如下所示:

[loadbalancer-add]
172.23.130.97
172.23.130.98

[loadbalancer-remove]
172.23.130.99
172.23.130.100
[loadbalancer]
172.23.130.97
172.23.130.99
172.23.130.98
172.23.130.100
我想合并这些组,将它们传递给loadbalancer API,以便添加服务器,然后删除服务器。因此,我需要合并这些组以创建一个组,如下所示:

[loadbalancer-add]
172.23.130.97
172.23.130.98

[loadbalancer-remove]
172.23.130.99
172.23.130.100
[loadbalancer]
172.23.130.97
172.23.130.99
172.23.130.98
172.23.130.100
我有以下任务,但它没有产生正确的输出

- name: Merge Dictionaries
  gather_facts: false
  hosts: localhost
  become: true
  no_log: false

  tasks:
    - add_host:
        name: "{{ item }}"
        ansible_ssh_port: 2020
        action: remove
        group: loadbalancer
      with_items:
        - "{{ groups['loadbalancer-remove'] }}"
        - "{{ groups['loadbalancer-add'] }}"
      delegate_to: localhost
这就产生了

[loadbalancer]
172.23.130.99
172.23.130.100
172.23.130.97
172.23.130.98
有可能得到我需要的输出吗


谢谢

也许这就是你需要的:

[loadbalancer-add]
172.23.130.97
172.23.130.98

[loadbalancer-remove]
172.23.130.99
172.23.130.100

[loadbalancer:children]
loadbalancer-remove
loadbalancer-add
所以现在你可以作为一个群体来引用

groups['loadbalancer']*

我确实找到了这样做的方法。这可能不是最好的方法,但我的解决方案是:

- name: Merge Dictionaries
  gather_facts: false
  hosts: localhost
  no_log: false

  vars:
    merged_lb_hosts: |
      {% if (groups['loadbalancer-add'] | length) >= (groups['loadbalancer-remove'] | length) %}
        {% for i in range(0, groups['loadbalancer-add'] | length) -%}
          {{ groups['loadbalancer-add'][i] | default('') }}:add|{{ groups['loadbalancer-remove'][i] | default('') }}:remove|
        {%- endfor %}
      {% else %}
        {% for i in range(0, groups['loadbalancer-remove'] | length) -%}
          {{ groups['loadbalancer-add'][i] | default('') }}:add|{{ groups['loadbalancer-remove'][i] | default('') }}:remove|
        {%- endfor %}
      {% endif %}

  tasks:
    - debug: msg="{{ merged_lb_hosts }}"
    - add_host:
        name: "{{ item.split(':')[0] }}"
        action: "{{ item.split(':')[1] }}"
        ansible_ssh_port: 2020
        group: loadbalancer
      with_items:
        - "{{ (merged_lb_hosts | trim()).split('|') }}"
      when: "{{item.split(':')[0] != ''}}"
这将获取添加和删除组,并将它们合并到一个名为
merged\u lb\u hosts

add_host
任务将使用_items部分拆分其中的该变量,以创建一个可编辑列表


它感觉很粗糙,但它完成了我所追求的工作

啊,对不起,这是一个打字错误,我现在就修复它。很抱歉,我已经更新了问题。我希望最后的列表首先从LB中删除一个主机(即从
loadbalancer删除
中删除一个项目,然后添加一个主机以添加到LB)(例如,
loadbalancer add
中的一个项目。我的问题的顺序有点错误,现在我已经纠正了。嗨,谢谢你的回答。我不认为这会像我需要的那样合并列表,它会将一个列表附加到另一个列表。