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