-1

我有一个 Ansible 剧本,其中包含用于创建一些 Azure 云资源的角色。组变量用于设置创建这些资源的参数。库存文件包含多个组,这些组引用该播放作为后代节点。

问题在于,由于运行云操作的目标是 localhost,所有组变量都会立即被拾取。这是库存:

[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 寻找一个伪主机,让它认为这些是不同的目标。我能够解决此问题的唯一方法是创建两个不同的库存。

4

1 回答 1

1

无论如何,很难猜出你的剧本是什么样子......

请记住,清单主机/组变量是主机绑定的,因此任何主机始终只有一组清单变量(不同组中定义的变量相互覆盖)。

如果您想在您的控制机器上执行一些任务或播放,您可以使用connection: localfor play 或local_action:for tasks。

例如,对于这个 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中 forserver1testvar=zzzfor server2
仍然azure从控制主机执行动作。

在第二个示例中,您应该关闭事实收集并setup手动调用以防止 Ansible 连接到可能未配置的服务器。

于 2016-11-03T07:57:44.717 回答