Ansible:删除主机

Ansible: removing hosts

我知道可以通过以下任务添加主机:

- name: Add new instance to host group
  add_host:
    hostname: '{{ item.public_ip }}'
    groupname: "tag_Name_api_production"
  with_items: ec2.instances

但我似乎找不到从清单中删除主机的方法。有什么办法吗?

不幸的是,您似乎无法使用 Ansible 2 执行此操作。没有名为 remove_host 或其他模块的模块。

但是,使用 Ansible 2,您可以在游戏中刷新库存:

- meta: refresh_inventory

另一个想法可能是预先过滤主机。尝试将它们添加到组中,然后在最近的游戏中排除该组,例如:

- hosts: '!databases'

我们通常在使用多个 hosts: 部分的剧本中这样做。

- hosts: auth:!ocp
  roles:
    - ntp-server

- hosts: all:!auth:!ocp
  roles:
    - ntp-client

这将通过 !group 机制从考虑中删除主机组。特别是在第一个块中,我们删除了 !ocp 组,在第二个块中,我们同时删除了 !auth!ocp 组。

参考资料

无法删除主机,但可以选择在新创建的组上运行。

- name: kubectl
  hosts: localhost
  gather_facts: false

  tasks:
  - add_host:
      name: nextcloud
      ansible_connection: kubectl
      ansible_kubectl_context: cluster
      ansible_kubectl_namespace: default
      ansible_kubectl_pod: nextcloud-75fc7f5c6f-hxrq6
      groupname: "pods"

# only run on pods
- hosts: pods
  gather_facts: false
  tasks:
  - raw: pwd
    register: raw_result
  - debug:
      msg: "{{raw_result.stdout_lines[0]}}"

我刚遇到同样的问题。我对给定的剧本进行了 运行 converge 的测试(我无法修改),然后我需要 运行 相同的剧本,组中的主机数量较少。

我的解决方案是:

假设您有 target 组您想要缩小。

  1. 将最少数量的主机放入 target 组。
  2. 将其他主机放入 target_addon 组。
- hosts: target_addon
  tasks:
    - add_host:
        name: '{{ inventory_hostname }}'
        groups: [target]

- import_playbook: converge.yaml  # uses group `target` with added hosts

# Removing hosts added from target_addon group from group target by reloading inventory
- hosts: localhost
  tasks:
    - meta: refresh_inventory

- import_playbook: converge.yaml  # uses group `target` without added hosts

您可以停止播放这些主机:

- name: Remove unwanted hosts from play_hosts
  meta: end_host
  when: unwanted

当然,这假设 unwanted 变量存在于所有主机上并且设置正确。