Ansible - 将库存主机和变量读取到group_vars / all文件

时间:2014-02-20 12:51:34

标签: 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_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替换。用户只能编辑库存文件。

7 个答案:

答案 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 / all
data_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_varshosts_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