我有一个Ansible手册,其中包含创建一些Azure云资源的角色。组变量用于设置创建这些资源的参数。清单文件包含多个组,这些组引用该子组作为后代节点。
问题在于,由于目标是用于运行云操作的localhost,因此 all 会立即拾取组变量。这是库存:
[cloud:children]
cloud_instance_a
cloud_instance_b
[cloud_instance_a:children]
azure_infrastructure
[cloud_instance_b:children]
azure_infrastructure
[azure_infrastructure]
127.0.0.1 ansible_connection=local ansible_python_interpreter=python
该剧本包含一个azure_infrastructure游戏,该游戏引用了要运行的实际角色。
该角色对localhost运行两次,但每次加载来自cloud_instance_a和cloud_instance_b的组变量时都会发生这种情况。我希望它运行两次,但第一次加载cloud_instance_a变量,第二次加载cloud_instance_b变量。
有没有这样做?从本质上讲,我正在为localhost寻找伪主机,这使得它认为这些是不同的目标。我能够解决这个问题的唯一方法是创建两个不同的库存。
答案 0 :(得分:1)
有点难以猜测你的剧本是怎样的,无论如何......
请记住,库存主机/组变量是主机绑定的,因此任何主机始终只有一组库存变量(不同组中定义的变量会相互覆盖)。
如果您想在控制台上执行某些任务或播放,可以使用connection: local
进行播放,或使用local_action:
进行任务。
例如,对于此hosts文件:
[group1]
server1
[group2]
server2
[group1:vars]
testvar=aaa
[group2:vars]
testvar=zzz
你可以这样做:
- hosts: group1:group2
connection: local
tasks:
- name: provision
azure: ...
- hosts: group1:group2
tasks:
- name: install things
apk: ...
或者这个:
- hosts: group1:group2
gather_facts: no
tasks:
- name: provision
local_action: azure: ...
- name: gather facts
setup:
- name: install things
apk:
在此示例中,testvar=aaa
为server1
,testvar=zzz
为server2
。
仍然从控制主机执行azure
动作。
在第二个示例中,您应该关闭事实收集并手动调用setup
以防止Ansible连接到可能未设置的服务器。