首页 > 其他分享 >ansible 中 hostvars, groups, group_names, inventory_hostname 等变量

ansible 中 hostvars, groups, group_names, inventory_hostname 等变量

时间:2024-11-22 17:39:56浏览次数:1  
标签:play group 变量 主机 hostname ansible testB facts

本:ansible2.7

无论您是否定义了任何变量,您都可以使用Ansible提供的特殊变量(包括“magic”变量、事实和连接变量)访问有关主机的信息。magic变量名是保留的,不要用这些名称设置变量。

最常用的magic变量是hostvars、groups、group_names和inventory_hostname。

1、hostvars:获取某台指定的主机的相关变量。如果有一台web服务器的配置文件中需要指定db服务器的ip地址,我们假定这台db服务器的hostname为 db.example.com ip地址绑定在eth0网卡上,我们可以通过如下方法在web服务器上调用db服务器的ip地址:

{{ hostvars['db.example.com'].ansible_eth0.ipv4.address }}
1
需要注意的是db.example.com不能使用ip地址来取代,只能使用主机名或别名。

2、groups : 资产文件中的组和主机
3、group_names :用于标识当前正在执行task的目标主机位于的=组
4、inventory_hostname:是指inventory资产文件中的主机的名称,常用来修改主机名与资产文件中一致

- name: configuire system hostname
hostname:
name: "{{ inventory_hostname }}
become: yes
1
2
3
4
5、inventory_hostname与ansible_host的区别
ansible_hostname是ansible收集的变量,为主机的hostname

ansible hostname -m setup
1
6、变量优先级:
1、extra vars(命令中-e)最优先
2、inventory 主机清单中连接变量(ansible_ssh_user 等)
3、play 中 vars、vars_files 等
4、剩余的在 inventory 中定义的变量
5、系统的 facts 变量
6、角色定义的默认变量(roles/rolesname/defaults/main.yml)
注:子组会覆盖父组,主机总是覆盖组定义的变量

 

 

参考文章:
https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html
https://gist.github.com/andreicristianpetcu/b892338de279af9dac067891579cad7d

ansible 中的内置变量
一、内置变量ansible_version
二、内置变量hostvars
三、内置变量inventory_hostname
四、内置变量groups
五、内置变量group_names
1
2
3
4
5
ansible中还有一些内置变量可供我们使用,当然,这些内置变量的变量名是被ansible保留的,我们定义变量时不能使用这些变量名。

一、内置变量ansible_version
先从一个简单的内置变量说起,比如,我们可以通过内置变量ansible_version获取到ansible的版本号,示例命令如下

[root@server4 ~]# ansible testB -m debug -a "msg={{ansible_version}}"
1


二、内置变量hostvars
除了ansible_version,还有一些非常有用的内置变量。比如内置变量hostvars

hostvars可以帮助我们在操作当前主机时获取到其他主机中的信息。

假设,我想要在操作test70主机时获取到test71主机中的facts信息,我该怎么办呢?示例如下

[root@server4 ~]# vim nz.yml
[root@server4 ~]# cat nz.yml
---
- name: "play 1: Gather facts of testC"
hosts: testC
remote_user: root

- name: "play 2: Get facts of testC when operating on testB"
hosts: testB
remote_user: root
tasks:
- debug:
msg: "{{hostvars['testC'].ansible_eth0.ipv4}}"
1
2
3
4
5
6
7
8
9
10
11
12
13
上例中有两个play,第一个play针对testC主机执行,但是第一个play中没有显式指定任何task,第二个play针对testB主机执行,在第二个play中只有一个task,即使用debug模块,输出了testC主机中的eth0网卡的IP信息,

如你所见,我们可以借助hostvars在操作当前主机时输出其他主机中的facts信息,上例中使用hostvars加上清单中的主机名称再加上facts的key,即可获取到对应的facts信息,有了前文的总结作为基础,你一定想到了,上例中的msg的值改为如下写法也是可以的。

"{{hostvars.testC.ansible_eth0.ipv4}}"
1
[root@server4 ~]# ansible-playbook nz.yml
1


上例中的第一个play中并没有任何的task,为什么还需要第一个play呢?如果你将上例的第一个play删除,只保留第二个play,运行时则会报错,这是因为,虽然第一个play中没有任何task,但是当第一个play执行时,默认会调用”[Gathering Facts]”任务,也就是说,默认会收集testC主机的facts信息,只有被收集过的facts信息才能被后面的play引用到,如果压根没有收集对应主机的facts信息,即使使用hostvars内置变量,也无法获取到对应主机的facts信息,我们来做个试验,我们可以直接把上例的第一个play从playbook中删除,也可以指明让第一个play不收集对应的facts信息,使用”gather_facts”关键字可以控制当前play是否收集对应主机的facts信息,示例如下:

[root@server4 ~]# vim nz.yml
[root@server4 ~]# cat nz.yml
---
- name: "play 1: Gather facts of testC"
hosts: testC
remote_user: root
gather_facts: no

- name: "play 2: Get facts of testC when operating on testB"
hosts: testB
remote_user: root
tasks:
- debug:
msg: "{{hostvars['testC'].ansible_eth0.ipv4}}"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
如上例所示,第一个play中的”gather_facts: no”表示设置当前play不收集对应主机的信息,运行上例playbook会报错,因为第二个play在操作testB时,无法获取到testC主机中的facts信息,原因是testC的facts信息并未被收集过,所以,调用其他主机的facts信息的前提是对应主机的facts信息已经被收集过。

其实,除了facts信息,我们还能够利用hostvars内置变量从别的主机中获取到其他类型的一些变量信息,比如,其他主机的注册变量、主机变量、组变量等信息,我们先来看一个获取其他主机的注册变量的小示例,如下:

[root@server4 ~]# vim nz1.yml
[root@server4 ~]# cat nz1.yml
---
- hosts: testC
remote_user: root
gather_facts: no
tasks:
- shell: "echo register_var_in_play1"
register: shellreturn

- hosts: testB
remote_user: root
gather_facts: no
tasks:
- debug:
msg: "{{hostvars.testC.shellreturn.stdout}}"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16


如上例所示,通过hostvars内置变量可以直接获取到其他主机中的注册变量,你一定发现了,注册变量并不用像facts信息那样需要事先收集,即可直接通过hostvars跨主机被引用到,同理,如果你在清单中为testC主机配置了主机变量,或者为testC主机所在的组配置了组变量,也是可以通过hostvars直接跨主机引用的。

你可能会问,如果我直接在play中为当前主机定义一个变量,可以在之后的play中操作其他主机时被引用到吗?那么我们来做个实验,示例如下
我的清单配置如下:

172.25.63.2
testB.redhat.com ansible_host=172.25.63.1
testC ansible_host=172.25.63.6


[testA]
test1 ansible_host=172.25.63.3
test2 ansible_host=172.25.63.5

[testB]
test3 ansible_host=172.25.63.4

[test:children]
testA
testB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@server4 ~]# vim nz2.yml
[root@server4 ~]# cat nz2.yml
---
- hosts: testC
remote_user: root
gather_facts: no
vars:
testvar: testvar_in_C
tasks:
- debug:
msg: "{{testvar}}"

- hosts: testB
remote_user: root
gather_facts: no
tasks:
- debug:
msg: "{{hostvars.testC.testvar}}"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

在上例的第一个play中我们为test71主机定义了一个变量,变量名称为testvar,在第二个play中操作test70主机时,使用hostvars尝试引用test71主机中的变量,如果执行上述playbook则会报错,看来通过vars关键字定义的变量使用上例中的方法是无法被跨主机引用的,前一篇文章中,我们总结了怎样使用”set_fact”关键字定义变量,通过”set_fact”关键字定义的变量拥有类似”facts”信息的特性(如果不明白可以参考前文),所以,我们可以把”vars”关键字中定义的变量通过”set_fact”关键字去定义,这样这些变量就好像facts信息被收集过一样,能被之后的play引用到了,示例如下

[root@server4 ~]# vim nz2.yml
[root@server4 ~]# cat nz2.yml
---
- hosts: testC
remote_user: root
gather_facts: no
tasks:
- set_fact:
testvar: testvar_in_C
- debug:
msg: "{{testvar}}"

- hosts: testB
remote_user: root
gather_facts: no
tasks:
- debug:
msg: "{{hostvars.testC.testvar}}"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

上例通过”set_fact”结合”hostvars”的方式,实现了跨play获取其他主机中的变量信息的功能,还是很方便的。

三、内置变量inventory_hostname
通过inventory_hostname变量可以获取到被操作的当前主机的主机名称,这里所说的主机名称并不是linux系统的主机名,而是对应主机在清单中配置的名称,假设我的清单配置如下

[test-group]
172.25.63.5
testB.redhat.com ansible_host=172.25.63.3
testC ansible_host=172.25.63.6
1
2
3
4
清单中配置了三个主机,第一个主机以IP的形式配置,第二个主机和第三个主机都以别名的方式配置,他们同属于test_group组。

那么我们使用内置变量inventory_hostname获取一下各个主机的对应的主机名,看看会返回什么,示例如下

[root@server4 ~]# ansible test-group -m debug -a "msg={{inventory_hostname}}"
1

从返回信息可以看出,如果使用IP配置主机,inventory_hostname的值就是IP,如果使用别名,inventory_hostname的值就是别名。

四、内置变量groups
通过groups内置变量可以获取到清单中”所有分组”的”分组信息”,什么意思呢?我们先来看一个清单配置,假设我的清单配置如下:

172.25.63.2
testB.redhat.com ansible_host=172.25.63.1
testC ansible_host=172.25.63.6


[testA]
test1 ansible_host=172.25.63.3
test2 ansible_host=172.25.63.5

[testB]
test3 ansible_host=172.25.63.4

[test:children]
testA
testB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
上述清单中,显式的指定了三个组,testA组、testB组、test组,其中,testA组与testB组是test组的子组,除了组中的主机,还有三台主机没有任何分组,直接写在了清单中。

现在,我们获取一下groups变量的值,看看会返回哪些信息,随便操作清单中的任意一台主机即可,示例如下

[root@server4 ~]# ansible testB -m debug -a "msg={{groups}}"
test3 | SUCCESS => {
"msg": {
"all": [
"172.25.63.2",
"testB.redhat.com",
"testC",
"test1",
"test2",
"test3"
],
"test": [
"test1",
"test2",
"test3"
],
"testA": [
"test1",
"test2"
],
"testB": [
"test3"
],
"ungrouped": [
"172.25.63.2",
"testB.redhat.com",
"testC"
]
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
从上述返回信息可以看出,所有主机默认被分成了组名为”all”的组,testA组中有两台主机,testB组中有一台主机,由于testA组和testB组都属于test组的子组,所以testA组与testB组中的主机都属于test组,由于有三台主机在清单中并未分组,所以,ansible自动将没有分组的主机分到了名为”ungrouped”的组中,即组名为”未分组”的组。

我们还能够通过组名,获取到指定组的分组信息,假设,我想要获取到上例中testA组中的主机名称,则可以使用如下方法。

[root@server4 ~]# ansible testB -m debug -a "msg={{groups.testA}}"
1


当然,语法也可以改为如下

# ansible testB -m debug -a "msg={{groups['testA']}}"
1
所以,如果我们想要获取到所有未分组主机的主机名,则可以使用如下方法

[root@server4 ~]# ansible testB -m debug -a "msg={{groups.ungrouped}}"
1


五、内置变量group_names
见名知义,我们可以通过内置变量group_names获取到当前主机所在分组的组名,比如,我的清单配置和上例相同。

那么,当我操作test1主机时,group_names变量值如下

[root@server4 ~]# ansible test1 -m debug -a "msg={{group_names}}"
1

如上例返回值所示,test1主机属于testB组,而testB组又是test组的子组,所以test1主机同时属于testB组和test组,所以,最终返回的信息中包括test与testB

当我们操作未分组的主机时,group_names的值为”ungrouped”,示例如下

[root@server4 ~]# ansible 172.25.63.2 -m debug -a "msg={{group_names}}"
————————————————
版权声明:本文为CSDN博主「chihtung_hsu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chitung_hsu/article/details/105510507


————————————————
版权声明:本文为CSDN博主「Man_In_The_Night」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Man_In_The_Night/article/details/88567188

标签:play,group,变量,主机,hostname,ansible,testB,facts
From: https://www.cnblogs.com/xuxuxu-2022/p/17738052.html

相关文章

  • Ansible快速入门
    Ansible快速入门一、介绍Ansible是一款简单的运维自动化工具,只需要使用ssh协议连接就可以来进行系统管理,自动化执行命令,部署等任务。Ansible的特点1、ansible不需要单独安装客户端,也不需要启动任何服务2、ansible是python中的一套完整的自动化执行任务模块3、ansibleplaybo......
  • gpmc.msc 是 Group Policy Management Console (组策略管理控制台) 的缩写,它是一个用
    gpmc.msc是GroupPolicyManagementConsole(组策略管理控制台)的缩写,它是一个用于管理和配置Windows操作系统中组策略的管理工具。该工具通过图形用户界面(GUI)提供了一个集中管理的方式,帮助IT管理员在网络环境中进行集中控制和管理用户、计算机的安全设置、应用程序配......
  • SAP GR(Group Reporting)合并报表内容及功能简介(五)-合并和抵消
    合并和抵消审核公司间匹配和对账公司间匹配和对账概览随着合并和收购数量的显著增加,企业在全球经济中面临着诸多挑战。其中最常见的是法律实体与子公司之间缺乏透明度,导致无法以经济高效的方式对账法律实体与子公司之间的公司间交易,从而造成结算出现重大延迟。公司间匹配......
  • CICD03 Jenkins对golang项目构建, 结合ansible, 构建通知, 自动化构建(定时,webhook),
    2.7.2基于Maven风格的任务构建基于WAR包运行Tomcat服务器JAVA项目maven配置繁琐,功能固定不灵活,不如自由风格好用,这里推荐用自由风格脚本实现更好目前最高依赖到tomcat9,更高版本的tomcat不支持2.7.2.2安装tomcat服务器和配置#在gitlab新建java项目(此项目使用JD......
  • ansible-复制文件案例
    ansible-复制文件案例1)aoa.tgzansible-i/data/ld_fabu/ansible_cfg/hostsall-mcopy-a'src=/data/ld_fabu/env_online/sourcefile/aoa.tgzdest=/data/game/update/aoa.tgzowner=ledou00group=ledou00mode=0644'2)删除ansible-i/data/ld_fabu/ansible_cfg/......
  • ansible执行playbook报Host Key checking
    报错信息:(fastapi-ansible)root@WEB:/data/fastapi-ansible/project#ansible-playbook-ihostsping.yamlPLAY[PingTestPlaybook]*********************************************************************************************************************TASK[Pi......
  • 南沙C++信奥赛老师解一本通题 1385:团伙(group)
    ​【题目描述】在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足:1、我朋友的朋友是我的朋友;2、我敌人的敌人是我的朋友;所有是朋友的人组成一个团伙。告诉你关于这n个人的m条信息,即某两个人是朋友,或者某两个人是敌人,请你编写一个程序,计算出这个城市最多可能有多......
  • FreeRTOS 24:事件组EventGroup等待、清零、获取操作
    等待事件标志位xEventGroupWaitBits()既然标记了事件的发生,那么我怎么知道他到底有没有发生,这也是需要一个函数来获取事件是否已经发生,FreeRTOS提供了一个等待指定事件的函数——xEventGroupWaitBits(),通过这个函数,任务可以知道事件标志组中的哪......
  • centos 下安装部署ansible
    centos下安装部署ansibleansible2.2服务节点:192.168.211.133客户端1:192.168.211.139客户端2:192.168.211.140第一步:设置EPEL仓库Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库1.下载epel库http://dl.fedoraproject.org/pub/epel/7/x86_64/e/......
  • 运维自动化工具-ansible几个小案例
    运维自动化工具-ansible几个小案例1.4检查yaml文件的语法是否正确$ansible-playbook-i/tmp/hostsnginx.yaml--syntax-check1.5检查yaml文件中的tasks任务$ansible-playbook-i/tmp/hostsnginx.yaml--list-task1.6检查yaml文件中的生效主机$ansible-playbo......