Ansible组变量评估与本地操作

时间:2016-11-02 21:52:37

标签: ansible ansible-inventory

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

1 个答案:

答案 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=aaaserver1testvar=zzzserver2
仍然从控制主机执行azure动作。

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