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

Tia*_*usa 25 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
Run Code Online (Sandbox Code Playgroud)

问题是我需要从inventory_vars/all文件访问清单文件中的所有这些主机和变量.

我尝试了以下方式来访问主机IP:

{{ lb }}
"{{ hostvars[lb] }}"
"{{ hostvars['lb'] }}"
{{ hostvars[lb] }}
Run Code Online (Sandbox Code Playgroud)

要访问我尝试的主机变量:

"{{ hostvars[tests].['data_base_host'] }}"
Run Code Online (Sandbox Code Playgroud)

所有这些都是错的!!! 任何人都可以帮我找出访问主机和变量的最佳实践,而不是从剧本中,而是从变量文件中获取?

编辑:

好.让我们澄清一下.

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

示例:我有一个数据库主机IP:10.112.83.37.

库存文件:

[db]
10.112.83.37
Run Code Online (Sandbox Code Playgroud)

在组中:vars/all文件我想使用该IP来构建变量.

group_vars/all文件:

data_base_url=jdbc:oracle:thin:@{{ db }}:1521/ssdenwdb
Run Code Online (Sandbox Code Playgroud)

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

模板文件:

oracle_url = {{ data_base_url }}
Run Code Online (Sandbox Code Playgroud)

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

eld*_*dos 27

- name: host
   debug: msg="{{ item }}" 
   with_items:
    - "{{ groups['tests'] }}"
Run Code Online (Sandbox Code Playgroud)

这段代码将给出消息:

'10.112.84.122'
'10.112.84.124'
Run Code Online (Sandbox Code Playgroud)

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

  • 我们可以通过索引访问每个IP地址,例如:`{{groups ['lb'] [0]}}`得到`10.112.84.122`作为结果。 (2认同)

wpo*_*ski 20

例如,如果要以编程方式访问清单条目以将其包含在任务中.你可以像这样引用它:

{{ hostvars.tomcat }}
Run Code Online (Sandbox Code Playgroud)

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

{{ hostvars.jboss5.ansible_ssh_host }}
Run Code Online (Sandbox Code Playgroud)

以下是您可以参考的变量列表:单击.此外,您可以声明一个变量并使用例如playbook中某个步骤的结果进行设置.

- name: Change owner and group of some file
  file: path=/tmp/my-file owner=new-owner group=new-group
  register: chown_result
Run Code Online (Sandbox Code Playgroud)

然后,如果您执行此步骤tomcat,则可以jboss5像这样访问它:

- name: Print out the result of chown
  debug: msg="{{ hostvars.tomcat.chown_result }}"
Run Code Online (Sandbox Code Playgroud)

  • 在较新的ansible版本(2.x IIRC)中,它被称为`ansible_host`而不是`ansible_ssh_host`. (2认同)

小智 14

以防万一,如果问题仍然存在,您可以参考ansible库存通过‘hostvars’,‘group_names’‘groups’ansible变量.

例:

为了能够获取组"mygroup"中所有服务器的IP地址,请使用以下构造:

- debug: msg="{{ hostvars[item]['ansible_eth0']['ipv4']['address'] }}" 
  with_items:
     - "{{ groups['mygroup'] }}"
Run Code Online (Sandbox Code Playgroud)


leu*_*cos -1

如果您想将变量放在 group_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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)