我有一个虚假的怀疑让我长时间陷入困境。我有一个非常平庸的库存文件,包含主机和变量:
[lb]
10.112.84.122
[tomcat]
10.112.84.124
[jboss5]
10.112.84.122
...
[tests:children]
lb
tomcat
jboss5
[default:children]
tests
[tests:vars]
data_base_user=NETWIN-4.3
data_base_password=NETWIN
data_base_encrypted_password=
data_base_host=10.112.69.48
data_base_port=1521
data_base_service=ssdenwdb
data_base_url=jdbc:oracle:thin:@10.112.69.48:1521/ssdenwdb
问题是我需要从inventory_vars / all文件中访问清单文件中的所有这些主机和变量。
我尝试了以下方式来访问主机IP:
{{ lb }}
"{{ hostvars[lb] }}"
"{{ hostvars['lb'] }}"
{{ hostvars[lb] }}
要访问我尝试的主机变量:
"{{ hostvars[tests].['data_base_host'] }}"
所有这些都是错的!!!任何人都可以帮我找出访问主机和变量的最佳做法,而不是从剧本中,而是从变量文件中找到它?
修改
确定。让我们澄清一下。
问题:在变量文件中使用库存文件中声明的主机,例如:group_vars / all。
示例:我有一个IP:10.112.83.37
的数据库主机。
库存文件:
[db]
10.112.83.37
在组中:vars / all文件我想使用该IP来构建变量。
group_vars / all file:
data_base_url=jdbc:oracle:thin:@{{ db }}:1521/ssdenwdb
在模板中,我使用group_vars / all文件中内置的变量。
模板文件:
oracle_url = {{ data_base_url }}
问题是group_vars / all文件中的{{ db }}
变量未被DB主机IP替换。用户只能编辑库存文件。
答案 0 :(得分:27)
- name: host
debug: msg="{{ item }}"
with_items:
- "{{ groups['tests'] }}"
这段代码将给出消息:
'10.112.84.122'
'10.112.84.124'
因为groups['tests']
基本上会返回唯一IP地址列表['10.112.84.122','10.112.84.124']
,而groups['tomcat'][0]
会返回10.112.84.124
。
答案 1 :(得分:20)
如果要以编程方式访问清单条目以将其包含在任务中,例如。您可以这样参考:
{{ hostvars.tomcat }}
这会返回一个包含与该主机相关的所有变量的结构。如果您只想要一个IP地址(或主机名),可以像这样引用它:
{{ hostvars.jboss5.ansible_ssh_host }}
以下是您可以参考的变量列表:click。此外,您可以声明一个变量并将其设置为例如剧本中某个步骤的结果。
- name: Change owner and group of some file
file: path=/tmp/my-file owner=new-owner group=new-group
register: chown_result
然后,如果您在tomcat
上执行此步骤,则可以从jboss5
访问此代码:
- name: Print out the result of chown
debug: msg="{{ hostvars.tomcat.chown_result }}"
答案 2 :(得分:14)
如果问题仍然存在,以防万一
您可以通过‘hostvars’
,‘group_names’
和‘groups’
安全变量来参考安全清单。
示例:
为了能够获取组“mygroup”中所有服务器的IP地址,请使用以下结构:
- debug: msg="{{ hostvars[item]['ansible_eth0']['ipv4']['address'] }}"
with_items:
- "{{ groups['mygroup'] }}"
答案 3 :(得分:3)
是的,nixlike的例子效果很好。
清单:
[docker-host]
myhost1 user=barbara
myhost2 user=heather
剧本:
---
- hosts: localhost
connection: local
tasks:
- name: loop debug inventory hostnames
debug:
msg: "the docker host is {{ item }}"
with_inventory_hostnames: docker-host
- name: loop debug items
debug:
msg: "the docker host is {{ hostvars[item]['user'] }}"
with_items: "{{ groups['docker-host'] }}"
输出:
ansible-playbook ansible / tests / vars-test-local.yml
播放[localhost]
任务[设置] ************************************************** *****************好的:[localhost]
TASK [循环调试库存主机名] ******************************************确定:[localhost] => (item = myhost2)=> { “item”:“myhost2”, “msg”:“docker host is myhost2”} ok:[localhost] => (item = myhost1)=> { “item”:“myhost1”, “msg”:“docker host is myhost1”}
TASK [循环调试项目] ************************************************** ****** ok:[localhost] => (item = myhost1)=> { “item”:“myhost1”, “msg”:“码头主机是barbara”} ok:[localhost] => (item = myhost2)=> { “item”:“myhost2”, “msg”:“码头主人是石南花”}
PLAY RECAP ************************************************** ******************* localhost:ok = 3 changed = 0 unreachable = 0
失败= 0
谢谢!
答案 4 :(得分:2)
考虑您之前的例子:
库存文件:
[db]
10.112.83.37
group_vars /所有
data_base_url=jdbc:oracle:thin:@{{ db }}:1521/ssdenwdb
模板文件:
oracle_url = {{ data_base_url }}
您可能希望用
替换group_vars / alldata_base_url="jdbc:oracle:thin:@{{ groups['db'][0] }}:1521/ssdenwdb"
答案 5 :(得分:0)
如果要在任务或角色中在/ etc / ansible / host下引用一个主机定义,则波纹管链接可能会有所帮助:
https://www.middlewareinventory.com/blog/ansible-get-ip-address/
答案 6 :(得分:-1)
如果您希望将文件放在group_vars下的文件中,只需将它们移到此处即可。 Vars可以放在清单([ group :vars]部分)中,也可以放在group_vars
或hosts_vars
下的文件中(最重要的是)。
例如,通过上面的示例,您可以移动文件tests
中的组group_vars/tests
的变量:
广告资源文件:
[lb]
10.112.84.122
[tomcat]
10.112.84.124
[jboss5]
10.112.84.122
...
[tests:children]
lb
tomcat
jboss5
[default:children]
tests
group_vars/tests
档案
data_base_user=NETWIN-4.3
data_base_password=NETWIN
data_base_encrypted_password=
data_base_host=10.112.69.48
data_base_port=1521
data_base_service=ssdenwdb
data_base_url=jdbc:oracle:thin:@10.112.69.48:1521/ssdenwdb