有没有办法在剧本中重新设置 "hosts" 变量?
Is there a way to re-set the "hosts" variable within a playbook?
我的任务是创建一个剧本,我在其中执行以下操作:
- 从 YAML 文件中获取信息(该文件包含有关 VLAN 的详细信息)
- 遍历 YAML 对象并验证哪个子网包含 IP,然后 return 对象
- 该对象还包含
inventory_hostname
的定义 运行 Ansible 剧本
目前,我有以下 (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
我的任务是创建一个剧本,我在其中执行以下操作:
- 从 YAML 文件中获取信息(该文件包含有关 VLAN 的详细信息)
- 遍历 YAML 对象并验证哪个子网包含 IP,然后 return 对象
- 该对象还包含
inventory_hostname
的定义 运行 Ansible 剧本
目前,我有以下 (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