有没有办法在剧本中重新设置 "hosts" 变量?

Is there a way to re-set the "hosts" variable within a playbook?

我的任务是创建一个剧本,我在其中执行以下操作:

目前,我有以下 (snippet):

剧本:

- name: "Playbook"
  gather_facts: false
  hosts: "localhost"
  tasks: 
    - name: "add host"
      add_host:
        name: "{{ vlan_target }}"
    - name: "debug"
      debug:
        msg: "{{ inventory_hostname }}" 

默认文件将 target_host 定义为空字符串 "",然后在另一个角色任务中对其进行评估,如下所示 (snippet):

角色:

- set_fact: 
    vlan_object: "vlan | trim | from_json | first"

- name: "set facts based on IP address"
  set_fact:
    vlan_name: "{{ vlan_object.name }}"
    vlan_target: "{{ vlan_object.target }}"
  delegate_to: localhost

我想要实现的是更改 hosts: 变量,以便我可以使用正确的目标,因为 IP/VLAN 应该驻留在特定设备上。

我曾尝试将上述任务放在 add_host 之上,甚至放在同一个剧本中,如下所示:

- name: "Set_variables"
  hosts: "localhost"
  tasks:
    - name: "Set target host"
      import_role:
        name: test
        tasks_from: target_selector

- name: "Playbook"
  gather_facts: false
  hosts: "localhost"

在上面的剧本中添加一个 debug 子句设置了正确的目标,但它没有在下面重新使用,让我认为变量不是全局设置的,而是在 运行 .

我正在寻找一种方法来根据我传递给剧本的变量来设置目标。

有人有这方面的经验吗?

全局事实不是问题,at best you can assign a fact to all hosts in the play,但由于您希望使用上述事实来添加主机,因此这不是您用例的解决方案。

不过,您可以通过 hostvars special variable 访问其他主机的事实。它是一个字典,其中的键是主机名。

角色的使用与您手头的问题无关,所以,在下面的演示中,我们将其放在一边。

鉴于剧本:

- hosts: localhost
  gather_facts: no
  
  tasks: 
    - set_fact:
        ## fake object, since we don't have the structure of your JSON 
        vlan_object:
          name: foo
          target: bar

    - set_fact:
        vlan_name: "{{ vlan_object.name }}"
        vlan_target: "{{ vlan_object.target }}"
      run_once: true

    - add_host:
        name: "{{ vlan_target }}"

- hosts: "{{ hostvars.localhost.vlan_target }}"
  gather_facts: no

  tasks:
    - debug:
        var: ansible_play_hosts

这会产生

PLAY [localhost] *************************************************************

TASK [set_fact] **************************************************************
ok: [localhost]

TASK [set_fact] **************************************************************
ok: [localhost]

TASK [add_host] **************************************************************
changed: [localhost]

PLAY [bar] *******************************************************************

TASK [debug] *****************************************************************
ok: [bar] => 
  ansible_play_hosts:
  - bar