首页 > 解决方案 > 包含模式虚拟机名称的列表以排除剧本

问题描述

我有一些应该从所有剧本中排除的虚拟机。我创建具有主要任务的角色:

vars:
  exclusion_patterns:
    - pattern1
    - pattern2
tasks:
  - name: End play for exclusion hosts
    meta: end_host
    with_items: "{{ exclusion_patterns }}"
    when: "{{ item }} in inventory_hostname"

接下来,我想在第一个任务剧本中导入这个角色,并使用inventory_hostname中“exclusion_patterns”中的模式跳过vm。但是 Ansible 得到错误:未定义变量项。任何变种?

标签: ansible

解决方案


1)让我们创建排除主机列表并循环列表。

- hosts: all_hosts_to_select_from
  vars:
    exclusion_patterns:
      - pattern1
      - pattern2
  tasks:
    - name: Create list of excluded hosts
      set_fact:
        excluded_hosts: "{{ excluded_hosts|default([]) + ansible_play_hosts_all|
                                                         select('match', item)|
                                                         list }}"
      loop: "{{ exclusion_patterns }}"
      run_once: true
    - name: End play for exclusion hosts
      meta: end_host
      loop: "{{ excluded_hosts }}"
      run_once: true

(未测试)

2)也可以在第一次播放中创建包含主机的库存组并在第二次使用它。

- name: No.1 Create group of included hosts
  hosts: all_hosts_to_select_from
  vars:
    exclusion_patterns:
      - pattern1
      - pattern2
    included_hosts: "{{ ansible_play_hosts_all }}"
  tasks:
    - name: Remove excluded hosts fromt the list
      set_fact:
        included_hosts: "{{ included_hosts|
                            difference(ansible_play_hosts_all|
                                       select('match', item)|
                                       list)
                            }}"
      loop: "{{ exclusion_patterns }}"
      run_once: true
    - name: Create group of included hosts
      add_host:
        name: "{{ item }}"
        groups: group_of_included_hosts
      loop: "{{ included_hosts }}"
      run_once: true

- name: No.2 Run group of included hosts
  hosts: group_of_included_hosts
  tasks:
    - name: List ansible_play_hosts_all
      debug:
        var: ansible_play_hosts_all
      run_once: true

(未测试)


推荐阅读