Ansible-在运行时动态访问具有当前主机的hostvar

时间:2020-07-17 20:17:00

标签: dictionary ansible hostvars

使用Ansible 2.5.0。

问题::如何在运行时执行期间动态访问正在运行的当前主机的主机变量。

库存文件:

<!-- row -->
<div class="row">

  <!-- col -->
  <div class="col-6">
    <img src="https://i.stack.imgur.com/P59NF.png">
  </div>
  <!-- /col -->

  <!-- col -->
  <div class="col-4 sidebar">
    <h3>Sidebar Heading</h3>
  </div>
  <!-- /col -->

</div>
<!-- /row -->

我当前的任务:

[group_one]
host-1 ansible_host=1.2.3.4
host-2 ansible_host=5.6.7.8

[group_two]
host-3 ansible_host=2.4.6.8

这种结果是不希望的。在执行期间,仅使用主机1和2,但也添加了主机3的IP。

现在,我已经看过Ansible的magic variables,但是似乎没有可以满足我的需求的变量可以使用。

因为我希望在运行时使用变量,所以我不想设置变量- hosts: group_one tasks: - name: set fact for all ip's in play execution set_fact: all_ips: "{{ groups['all'] | map('extract', hostvars, ['ansible_host'] ) | join(',') }}" # outcome = 1.2.3.4,5.6.7.8,2.4.6.8 ,因为这样做会违反目的。

如何以这种方式配置Ansible,结果将是"{{ groups['group_one'] }}",而无需静态配置任何变量?

1 个答案:

答案 0 :(得分:1)

如果您不想使用ansible_play_hosts,则可以使用group_one magic variable作为对当前主机的动态引用。

ansible_play_hosts是当前播放中仍处于活动状态的所有主机的完整列表。

inventory.ini

[group_one]
host-1 ansible_host=1.2.3.4
host-2 ansible_host=5.6.7.8

[group_two]
host-3 ansible_host=2.4.6.8

foo.yaml

- hosts: group_one
  gather_facts: no

  tasks:
    - set_fact:
        all_ips: "{{ ansible_play_hosts | map('extract', hostvars, ['ansible_host']) | join(',') }}"
    - debug:
        msg: "{{ all_ips }}"
      run_once: yes
$ ansible-playbook -i inventory.ini foo.yaml 

PLAY [group_one] *****************************************************************************************************************************************************************************************************************************

TASK [set_fact] ******************************************************************************************************************************************************************************************************************************
ok: [host-1]
ok: [host-2]

TASK [debug] *********************************************************************************************************************************************************************************************************************************
ok: [host-1] => {
    "msg": "1.2.3.4,5.6.7.8"
}

PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
host-1                     : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host-2                     : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0