在 Ansible 剧本中访问库存主机变量
Accessing inventory host variable in Ansible playbook
在 Ansible 2.1 中,我有一个角色被需要访问主机文件变量的剧本调用。关于如何访问它有什么想法吗?
我正在尝试访问以下清单 host
文件的 test1
部分中的 ansible_ssh_host
:
[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'"}
关于 hostvars
,您的方向是正确的。
此 magic variable 用于访问有关其他主机的信息。
hostvars
是一个以库存主机名作为键的散列。
要访问每个主机的字段,请使用 hostvars['test-1']
、hostvars['test2-1']
等
ansible_ssh_host
自 2.0 以来 deprecated 有利于 ansible_host
。
因此,您应该首先从清单主机参数中删除“_ssh”(即变为“ansible_user”、“ansible_host”和“ansible_port”),然后在您的角色中调用它:
{{ hostvars['your_host_group'].ansible_host }}
你应该可以直接使用变量名
ansible_ssh_host
或者您可以通过 hostvars 而不必逐字指定主机
通过使用 magic variable inventory_hostname
hostvars[inventory_hostname].ansible_ssh_host
[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 }}
我还找到了一种很好的简单方法来处理 hostvars right on one of Ansible's Github issues
看起来你也可以这样做:
- debug:
msg: "{{ ansible_ssh_host }}"
我也为此苦苦挣扎。我的具体设置是:您的 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
加一出戏fill_file.yml
---
- remote_user: ec2-user
hosts: test3
tasks:
- name: fill file
template:
src: file.j2
dest: filled_file.txt
加一个模板文件.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[[=36=]]\" is undefined" 。
备注:我尝试了一些变化,但失败了,偶尔 "ansible.vars.hostvars.HostVars object has no element ";其中一些可以用他们所说的来解释。在 https://github.com/ansible/ansible/issues/13343#issuecomment-160992631
hostvars emulates a dictionary [...]. hostvars is also lazily loaded
非常感谢这篇笔记对我很有用!
能够发送 ansible 剧本中 /group_var/vars 下定义的变量
如下所示。
任务:
- 名称:检查服务帐户密码是否过期
- 命令:
sh /home/monit/get_ldap_attr.sh {{ item }} {{ LDAP_AUTH_USR }}
在 Ansible 2.1 中,我有一个角色被需要访问主机文件变量的剧本调用。关于如何访问它有什么想法吗?
我正在尝试访问以下清单 host
文件的 test1
部分中的 ansible_ssh_host
:
[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'"}
关于 hostvars
,您的方向是正确的。
此 magic variable 用于访问有关其他主机的信息。
hostvars
是一个以库存主机名作为键的散列。
要访问每个主机的字段,请使用 hostvars['test-1']
、hostvars['test2-1']
等
ansible_ssh_host
自 2.0 以来 deprecated 有利于 ansible_host
。
因此,您应该首先从清单主机参数中删除“_ssh”(即变为“ansible_user”、“ansible_host”和“ansible_port”),然后在您的角色中调用它:
{{ hostvars['your_host_group'].ansible_host }}
你应该可以直接使用变量名
ansible_ssh_host
或者您可以通过 hostvars 而不必逐字指定主机
通过使用 magic variable inventory_hostname
hostvars[inventory_hostname].ansible_ssh_host
[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 }}
我还找到了一种很好的简单方法来处理 hostvars right on one of Ansible's Github issues
看起来你也可以这样做:
- debug:
msg: "{{ ansible_ssh_host }}"
我也为此苦苦挣扎。我的具体设置是:您的 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
加一出戏fill_file.yml
---
- remote_user: ec2-user
hosts: test3
tasks:
- name: fill file
template:
src: file.j2
dest: filled_file.txt
加一个模板文件.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[[=36=]]\" is undefined" 。
备注:我尝试了一些变化,但失败了,偶尔 "ansible.vars.hostvars.HostVars object has no element ";其中一些可以用他们所说的来解释。在 https://github.com/ansible/ansible/issues/13343#issuecomment-160992631
hostvars emulates a dictionary [...]. hostvars is also lazily loaded
非常感谢这篇笔记对我很有用! 能够发送 ansible 剧本中 /group_var/vars 下定义的变量 如下所示。
任务:
- 名称:检查服务帐户密码是否过期
- 命令:
sh /home/monit/get_ldap_attr.sh {{ item }} {{ LDAP_AUTH_USR }}