29

我有一个愚蠢的疑问,让我被困了很长时间。我有一个非常普通的清单文件,其中包含主机和变量:

[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'] }}"

都是错的!!!谁能帮我找出访问主机和变量的最佳实践,而不是从剧本而是从变量文件?

编辑:

好的。让我们澄清一下。

问题:在变量文件中使用库存文件中声明的主机,比如说:group_vars/all。

示例:我有一个带有IP:10.112.83.37.

库存文件:

[db]
10.112.83.37

在 group:vars/all 文件中,我想使用该 IP 来构建一个变量。

group_vars/所有文件:

data_base_url=jdbc:oracle:thin:@{{ db }}:1521/ssdenwdb

在模板中,我使用 group_vars/all 文件中内置的变量。

模板文件:

oracle_url = {{ data_base_url }}

问题是{{ db }}group_vars/all 文件中的变量没有被 DB 主机 IP 替换。用户只能编辑库存文件。

4

7 回答 7

31
- name: host
   debug: msg="{{ item }}" 
   with_items:
    - "{{ groups['tests'] }}"

这段代码将给出消息:

'10.112.84.122'
'10.112.84.124'

asgroups['tests']基本上返回一个唯一 IP 地址列表,['10.112.84.122','10.112.84.124']groups['tomcat'][0]返回10.112.84.124.

于 2014-06-08T19:24:40.340 回答
21

例如,如果您想以编程方式访问清单条目以将它们包含在任务中。你可以这样引用它:

{{ hostvars.tomcat }}

这将为您返回一个包含与该主机相关的所有变量的结构。如果您只需要一个 IP 地址(或主机名),您可以这样引用它:

{{ hostvars.jboss5.ansible_ssh_host }}

这是您可以参考的变量列表:单击。此外,您可以声明一个变量并将其设置为例如剧本中某个步骤的结果。

- 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 }}"
于 2014-08-20T16:28:45.310 回答
17
于 2014-04-24T00:13:07.223 回答
3

考虑到您之前的示例:

库存文件:

[db]
10.112.83.37

group_vars/全部

data_base_url=jdbc:oracle:thin:@{{ db }}:1521/ssdenwdb

模板文件:

oracle_url = {{ data_base_url }}

您可能希望将您的 group_vars/all 替换为

data_base_url="jdbc:oracle:thin:@{{ groups['db'][0] }}:1521/ssdenwdb"
于 2016-09-27T11:06:38.127 回答
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] => (item=myhost2) => { "item": "myhost2", "msg": "docker 主机是 myhost2" } ok: [localhost] => (item=myhost1) => { " item": "myhost1", "msg": "docker 主机是 myhost1" }

TASK [循环调试项] ******************************************** ************ ok: [localhost] => (item=myhost1) => { "item": "myhost1", "msg": "docker 主机是 barbara" } ok: [ localhost] => (item=myhost2) => { "item": "myhost2", "msg": "docker 主机是 heather" }

播放回顾 ************************************************ ************************ 本地主机:好的=3 更改=0 无法访问=0
失败=0

谢谢!

于 2017-01-19T15:54:29.897 回答
0

如果您想在任务或角色中引用 /etc/ansible/host 下定义的一个主机,下面的链接可能会有所帮助:

https://www.middlewareinventory.com/blog/ansible-get-ip-address/

于 2020-09-14T14:55:36.363 回答
-1

如果您想将您的变量放在 group_vars 下的文件中,只需将它们移到此处即可。Vars 可以在清单中([ group :vars] 部分),也可以(最重要的是)在group_varsor下的文件中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
于 2014-02-20T14:30:45.627 回答