Ansible-将清单主机和变量读取到组变量/all文件
我有一个虚拟的怀疑,使我陷入了很长一段时间。我有一个非常普通的清单文件,其中包含主机和变量:Ansible-将清单主机和变量读取到组变量/all文件,ansible,ansible-inventory,Ansible,Ansible Inventory,我有一个虚拟的怀疑,使我陷入了很长一段时间。我有一个非常普通的清单文件,其中包含主机和变量: [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
[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
问题是我需要从group_vars/all文件访问清单文件中的所有这些主机和变量
我尝试了以下方式来访问主机IP:
{{ lb }}
"{{ hostvars[lb] }}"
"{{ hostvars['lb'] }}"
{{ hostvars[lb] }}
要访问主机变量,我尝试了:
"{{ hostvars[tests].['data_base_host'] }}"
他们都错了!!!有谁能帮我找到访问主机和变量的最佳实践,不是从剧本而是从变量文件
编辑:
[lb]
10.112.84.122
[tomcat]
10.112.84.124
[jboss5]
10.112.84.122
...
[tests:children]
lb
tomcat
jboss5
[default:children]
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
嗯。让我们澄清一下
问题:在变量文件中使用清单文件中声明的主机,例如:group_vars/all
示例:我有一台数据库主机,IP:10.112.83.37
库存文件:
[db]
10.112.83.37
[db]
10.112.83.37
在group:vars/all文件中,我想使用该IP构建一个变量
组变量/所有文件:
data_base_url=jdbc:oracle:thin:@{{ db }}:1521/ssdenwdb
在模板中,我使用组\u vars/all文件中内置的变量
模板文件:
oracle_url = {{ data_base_url }}
oracle_url = {{ data_base_url }}
问题在于,group_vars/all文件中的
{{db}}
变量没有被db host IP替换。用户只能编辑资源清册文件。如果您想将您的VAR放在group_VAR下的文件中,只需将它们移到此处即可。Vars可以在清单([group:Vars]部分)中,也可以(最重要的是)在group\u Vars
或hosts\u Vars
下的文件中
例如,通过上面的示例,您可以在文件group\u 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
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
组变量/测试
文件:
[lb]
10.112.84.122
[tomcat]
10.112.84.124
[jboss5]
10.112.84.122
...
[tests:children]
lb
tomcat
jboss5
[default:children]
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
以防万一,如果问题仍然存在,
您可以通过'hostvars'
,'group\u names'
和'groups'
ansible变量来参考ansible清单
例如:
要获得组“mygroup”中所有服务器的ip地址,请使用以下结构:
- debug: msg="{{ hostvars[item]['ansible_eth0']['ipv4']['address'] }}"
with_items:
- "{{ groups['mygroup'] }}"
这段代码将给出以下信息:
'10.112.84.122'
'10.112.84.124'
as组['tests']
基本上返回一个唯一ip地址列表['10.112.84.122','10.112.84.124']
,而组['tomcat'][0]
返回10.112.84.124
,例如,如果您希望以编程方式访问清单条目以将其包含在任务中。您可以这样引用它:
{{ hostvars.tomcat }}
{{ hostvars.jboss5.ansible_ssh_host }}
- name: Print out the result of chown
debug: msg="{{ hostvars.tomcat.chown_result }}"
这将返回一个包含与该主机相关的所有变量的结构。如果您只需要一个IP地址(或主机名),可以这样引用它:
{{ hostvars.tomcat }}
{{ hostvars.jboss5.ansible_ssh_host }}
- name: Print out the result of chown
debug: msg="{{ hostvars.tomcat.chown_result }}"
以下是您可以参考的变量列表:。此外,您可以声明一个变量,并使用剧本中某个步骤的结果进行设置
- name: Change owner and group of some file
file: path=/tmp/my-file owner=new-owner group=new-group
register: chown_result
然后,如果您在tomcat
上播放此步骤,您可以从jboss5
访问它,如下所示:
{{ hostvars.tomcat }}
{{ hostvars.jboss5.ansible_ssh_host }}
- name: Print out the result of chown
debug: msg="{{ hostvars.tomcat.chown_result }}"
考虑到您前面的示例:
库存文件:
[db]
10.112.83.37
[db]
10.112.83.37
组变量/所有
data_base_url=jdbc:oracle:thin:@{{ db }}:1521/ssdenwdb
模板文件:
oracle_url = {{ data_base_url }}
oracle_url = {{ data_base_url }}
您可能希望将您的组\u vars/all替换为
data_base_url="jdbc:oracle:thin:@{{ groups['db'][0] }}:1521/ssdenwdb"
是的,尼克西克的例子非常有效
库存:
[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剧本ansible/tests/vars-test-local.yml
播放[本地主机]
任务[设置]
*******************************************************************确定:[本地主机]
任务[循环调试清单主机名]
******************************************确定:[localhost]=>(item=myhost2)=>{
“项目”:“myhost2”,
“msg”:“docker主机是myhost2”}确定:[localhost]=>(item=myhost1)=>{
“项目”:“myhost1”,
“msg”:“docker主机是myhost1”}
任务[循环调试项]
********************************************************确定:[localhost]=>(item=myhost1)=>{
“项目”:“myhost1”,
“msg”:“docker主机是barbara”}确定:[localhost]=>(item=myhost2)=>{
“项目”:“myhost2”,
“msg”:“docker主机是heather”}
重演
*********************************************************************localhost:ok=3 changed=0 unreachable=0
失败=0
谢谢 如果要在任务或角色中引用/etc/ansible/host下定义的一个主机,下面的链接可能会有所帮助:
我想你做不到。可以从操作和模板访问变量。我想您可以从这些变量生成一些配置文件吗?因此,利用它们的地方是在模板中。您能否详细说明为什么需要从group_vars.all“访问”它们?谢谢您的回复。好的,我想有一个中心文件,我把所有需要的变量放在这里。清单文件只包含主机IP,其余的都在组_vars.all文件中。但是其中一些变量(在group_vars.all文件中)包含某个主机的IP,这就是为什么我需要在清单文件中访问主机的IP。为了完成解释,我的目标是允许任何想要配置系统的用户只在清单文件中添加主机IP。其余所有变量,即所有其他变量,都构建在group_vars.All文件中。谢谢。谢谢你的回复。这种方法的问题是,当我想要更改主机的IP(请记住,在包含主机IP的组变量中有变量)时,我需要编辑这两个文件(清单和组变量)。我的一个要求是,用户只需编辑资源清册文件(添加主机IP)即可重新配置系统或在其他环境中安装。嗯,好的,但问题中显示的资源清册文件已经解决了这一问题,并且在测试中看不到任何内容:使用上述信息的VAR,所以我很难找出需要解决的问题,抱歉:(你能最终写下你想要的吗(即使它不起作用),包括一个清单文件,一个组变量/所有文件一个小剧本(一个动作,一个模板)?清单文件:[db]10.112.83.37组变量/所有数据库url=jdbc:oracle:thin:@{db}}:1521/ss