63

在 Ansible 2.1 中,我有一个角色被需要访问主机文件变量的剧本调用。关于如何访问它的任何想法?

我正在尝试访问以下库存文件部分ansible_ssh_host中的 :test1host

[test1]
test-1 ansible_ssh_host=abc.def.ghi.jkl ansible_ssh_port=1212

[test2]
test2-1 ansible_ssh_host=abc.def.ghi.mno ansible_ssh_port=1212

[test3]
test3-1 ansible_ssh_host=abc.def.ghi.pqr ansible_ssh_port=1212
test3-2 ansible_ssh_host=abc.def.ghi.stu ansible_ssh_port=1212

[all:children]
test1
test2
test3

我尝试通过以下方式访问该角色:

{{ hostvars.ansible_ssh_host }} 

{{ hostvars.test1.ansible_ssh_host }}

我收到此错误:

fatal: [localhost]: FAILED! => {"failed": true, "msg": "'ansible.vars.hostvars.HostVars object' has no attribute 'ansible'"}
4

6 回答 6

70

你在正确的轨道上hostvars
魔术变量用于访问有关其他主机的信息。

hostvars是以清单主机名作为键的散列。
要访问每个主机的字段,请使用hostvars['test-1'],hostvars['test2-1']等。

ansible_ssh_host自 2.0 起已弃用,取而代之的是。 所以你应该首先从清单主机参数中删除“_ssh”(即变成“ansible_user”、“ansible_host”和“ansible_port”),然后在你的角色中调用它:ansible_host

{{ hostvars['your_host_group'].ansible_host }}
于 2016-10-13T19:33:51.587 回答
26
[host_group]
host-1 ansible_ssh_host=192.168.0.21 node_name=foo
host-2 ansible_ssh_host=192.168.0.22 node_name=bar

[host_group:vars]
custom_var=asdasdasd

您可以使用以下方式访问主机组变量:

{{ hostvars['host_group'].custom_var }}

如果您需要来自特定主机的特定值,您可以使用:

{{ hostvars[groups['host_group'][0]].node_name }}
于 2018-03-23T13:04:23.330 回答
22

您应该可以直接使用变量名

ansible_ssh_host

或者您可以通过 hostvars 而无需使用魔法变量逐字指定主机 inventory_hostname

hostvars[inventory_hostname].ansible_ssh_host
于 2017-12-12T04:06:21.567 回答
5

我也为此苦苦挣扎。我的具体设置是:您的 host.ini(使用现代名称):

[test3]
test3-1 ansible_host=abc.def.ghi.pqr ansible_port=1212
test3-2 ansible_host=abc.def.ghi.stu ansible_port=1212

加上一个 play fill_file.yml

---
- remote_user: ec2-user
  hosts: test3
  tasks:
   - name: fill file
     template:
       src: file.j2
       dest: filled_file.txt

加上一个模板 file.j2 ,比如

{% for host in groups['test3'] %}
   {{ hostvars[host].ansible_host }}
{% endfor %}

这对我有用,结果是

abc.def.ghi.pqr
abc.def.ghi.stu

我不得不承认它是 ansible 2.7,而不是 2.1。该模板是https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html中示例的变体。

接受的答案在我的设置中不起作用。有模板

{{ hostvars['test3'].ansible_host }}

我的游戏失败了 "AnsibleUndefinedVariable: \"hostvars['test3']\" is undefined" 。

备注:我尝试了一些变体,但失败了,偶尔会出现“ansible.vars.hostvars.HostVars object has no element”;其中一些可能可以通过他们所说的来解释。在https://github.com/ansible/ansible/issues/13343#issuecomment-160992631

hostvars 模拟字典 [...]。hostvars 也是延迟加载的

于 2019-03-21T17:15:27.780 回答
2

非常感谢这篇笔记对我很有用!能够发送在 ansible playbook 中 /group_var/vars 下定义的变量,如下所示。

任务:
-名称:检查服务帐户密码到期
-命令:

sh /home/monit/get_ldap_attr.sh {{ item }} {{ LDAP_AUTH_USR }}
于 2019-05-16T07:02:17.983 回答
1

在 Ansible 的 Github 问题之一上,我还发现了一种很好且简单的方法来解决主机变量

看起来你也可以这样做:

 - debug:
    msg: "{{ ansible_ssh_host }}"
于 2018-11-22T09:50:28.537 回答