ansible中的hostvars
首先来看一个例子:假设我想得到主机IP为172.25.250.9的完全限定域名(FQDN),但是我无法登录该主机,那么就可以用本机里面的hostvars魔法变量(后面会分享我对魔法这个词的理解)这个字典里面的ansible_fact这个子字典(后面会补充解释)来得到。
首先让我们来看看hostvars里面都是些啥,我们可以通过一下命令来查看hostvars这个字典:
ansible locahost -m debug -a “var=hostvars"
localhost | SUCCESS => {
"hostvars": {
"172.25.250.10": {
"ansible_check_mode": false,
"ansible_diff_mode": false,
"ansible_facts": {},
"ansible_forks": 5,
"ansible_inventory_sources": [
"/home/greg/ansible/inventory"
],
"ansible_password": "redhat",
"ansible_playbook_python": "/usr/libexec/platform-python",
"ansible_user": "root",
"ansible_verbosity": 0,
"ansible_version": {
"full": "2.8.0",
"major": 2,
"minor": 8,
"revision": 0,
"string": "2.8.0"
},
"group_names": [
"test"
],
"groups": {
"all": [
"172.25.250.9",
"172.25.250.10",
"172.25.250.13",
"172.25.250.11",
"172.25.250.12"
],
"balancers": [
"172.25.250.13"
],
"dev": [
"172.25.250.9"
],
"prod": [
"172.25.250.11",
"172.25.250.12"
],
"test": [
"172.25.250.10"
],
"ungrouped": [],
"webservers": [
"172.25.250.11",
"172.25.250.12"
]
},
"inventory_dir": "/home/greg/ansible",
"inventory_file": "/home/greg/ansible/inventory",
"inventory_hostname": "172.25.250.10",
"inventory_hostname_short": "172",
"omit": "__omit_place_holder__24431a21232ab0a628ff5c537f472e6b49d1e14a",
"playbook_dir": "/home/greg/ansible"
}, "172.25.250.11": {
"ansible_check_mode": false,
"ansible_diff_mode": false,
"ansible_facts": {},
....................
"172.25.250.12": {
"ansible_check_mode": false,
"ansible_diff_mode": false,
"ansible_facts": {},
"ansible_forks": 5,
"ansible_inventory_sources": [
"/home/greg/ansible/inventory"
],
..........................
"172.25.250.13": {
"ansible_check_mode": false,
"ansible_diff_mode": false,
"ansible_facts": {},
"ansible_forks": 5,
"ansible_inventory_sources": [
"/home/greg/ansible/inventory"
],
............................
"172.25.250.9": {
"ansible_check_mode": false,
"ansible_diff_mode": false,
"ansible_facts": {},
"ansible_forks": 5,
"ansible_inventory_sources": [
"/home/greg/ansible/inventory"
],
......................
"inventory_dir": "/home/greg/ansible",
"inventory_file": "/home/greg/ansible/inventory",
"inventory_hostname": "172.25.250.9",
"inventory_hostname_short": "172",
"omit": "__omit_place_holder__24431a21232ab0a628ff5c537f472e6b49d1e14a",
"playbook_dir": "/home/greg/ansible"
}
}
}
从输出结果可以看到,在hostvars里面一共有5个键值对(‘172.25.250.9’:值1,‘172.25.250.13:值2这样的形式。因为我的环境里一共有5个受控节点,所以有五个键值对),每个键值对的值里面都有一个”ansible_facts“的键,这个键对应的值便是生成f的acts(有关远程主机节点的信息)。
Tip: hostvars里面还有groups这个魔法变量(可以从最上面的输出看到),里面包含了5个节点的IP,也就是all这个组,(所有节点都会被自动划分到all组里面,相对应的,如果一个组没有加入了除all组之外的组,那么这个主机还会被自动划分到ungrouped组里面,也就是说,ungrouped组里面的主机都是没有加入别的组的(除了all组))
好了,现在可以说:fqdn可以通过ansible_facts里面的某个元素来得到,既然我们知道hostvars里面有ansible_facts,那么现在让我们再来看看ansible_facts里面都有些啥。
ansible localhost -m setup -a "filter=*fqdn*"
# localhost: 执行节点为本机
# -m: module
# setup: 生成ansible_facts
# -a: append
# filter: 前面的参数组成的命令会一股脑的全部输出,filter参数用于过滤这些输出
# *fqdn*: 正则表达式,含有fqdn的项
Tip:可以直接执行“ansible localhost -m setup”来查看所有的ansible_facts,由于太冗余这里不再显示。
从上图我们可以看到,ansible_facts里面的ansible_fqdn存储着localhost(左上角显示的是localhost)的fqdn。
所以我们可以通过hostvars---->ansible_facts------->ansible_fqdn来得到fqdn,但是hostvars里面有很多不同主机的ansible_facts,所以我们要指定是哪台主机的ansible_facts,这样才能得到正确的fqdn,所以可以通过以下方式得到:
hostvars["172.25.250.9"]["ansible_facts"]["ansible_fqdn"]
对“魔法”的理解:
If you want to configure your database server using the value of a ‘fact’ from another node, or the value of an inventory variable assigned to another node, you can use
hostvars
in a template or on an action line
如果我们想用来自别的节点的信息,那么就可以在jinja或命令行中用hostvars这个魔法变量,我个人的理解是:其“魔法”体现在明明是本机,却可以得到别的主机的信息,所以就很神奇。
With
hostvars
, you can access variables defined for any host in the play, at any point in a playbook. You can access Ansible facts using thehostvars
variable too, but only after you have gathered (or cached) facts.
我们还可以通过hostvars变量获取ansible_facts。
文档链接:
Discovering variables: facts and magic variables — Ansible Documentation
在文档内搜索:“Information about Ansible”即可定位到。
在这里问广大网友一个问题,本人刚接触ansible,不理解jinja模板中调用这些魔法变量时为什么可以不先定义的,就是说我想知道ansible是怎么调用jinja文件的,或者是jinja是怎么获取那些没有实现定义在jinja文件中的魔法变量(例如groups)的?恳请各位传道授业,本人不胜感激。
ansible中的hostvars的更多相关文章
- ansible中的playbook详解
首先简单说明一下playbook,playbook是什么呢?根本上说playbook和shell脚本没有任何的区别,playbook就像shell一样,也是把一堆的命令组合起来,然后加入对应条件判断等 ...
- ansible中的map
ansible中的filter: map ,其实是jinja2中的filter python中 map(func, iter) 返回func与每个元素计算后的迭代器,iter是个可迭代对象 an ...
- ansible中常用模块详解
ansible中常用的模块详解: file模块 ansible内置的可以查看模块用法的命令如下: [root@docker5 ~]# ansible-doc -s file - name: Sets ...
- ansible中playbook使用
palybook使用 ####yaml语法ansible中使用的yaml基础元素:变量Inventory条件测试迭代 playbook的组成结构InventoryModulesAd Hoc Comma ...
- ansible中yaml语法应用
4.yaml语法应用 ansible的playbook编写是yaml语言编写,掌握yaml语法是编写playbook的必要条件,格式要求和Python相似,具体教程参考如下 yaml语言教程 附上一个 ...
- ansible中的常用循环模块with_items
ansible中的循环模块有很多,不过with_items最为常用,且较为简单,循环模块最多的功能就是将重复性的任务简单化,如下例子所示: - hosts: all remote_user: root ...
- ansible中的docker_container模块
docker_container模块 1.docker_container模块主要是用于ansible-playbook操作docker容器的一个模块,使用该模块可以实现批量创建docker容器 An ...
- 二、Ansible中playbook的变量
先看看debug模块的使用: msg:输出调试信息 var:将某个任务执行的输出作为变量传给debug模块,debug模块将其打印输出 verbosity:debug的任务级别 1:在playbo ...
- Ansible中playbook的变量
转自:http://www.cnblogs.com/lemon-le/p/6862788.html 先看看debug模块的使用: msg:输出调试信息 var:将某个任务执行的输出作为变量传给debu ...
随机推荐
- day 17 i++优先级大于 *i
(1).有下列定义语句,int *p[4];以下选项中与此语句等价的是[C] (A).int p[4]; (B).int **P; (C).int *(p[4]); (D).int (*p)[4]; ...
- 【Java】GUI实现贪吃蛇
[Java]GUI实现贪吃蛇 前言 我们在做这个小游戏之前,得确保自己的AWT和Swing有一定的基础,并且会写一些简单的逻辑操作.这些都会在后面写的时候体现出来. 狂神老师从这里开始讲贪吃蛇的 我们 ...
- 使用Redis分布式锁控制请求串行处理
1.需求背景 在一些写接口的场景下,由于一些网络因素导致用户的表单重复提交,就会在相邻很短的时间内,发出多个数据一样的请求.后台接口的幂等性保证一般都是先检查数据的状态,然后决定是否进行执行写入操作, ...
- C# 反射调用拓展类方法
今天封装Protobuf封包时候遇到一个问题: Protobuf的反序列化方法MergeFrom,是写在扩展类里的:c#拓展类 通过反射获取不到这个方法,就没法使用Type来泛型封装... 然而仔细一 ...
- 科技爱好者周刊(第 174 期):全能程序员 vs 特长程序员
这里记录每周值得分享的科技内容,周五发布. 本杂志开源(GitHub: ruanyf/weekly),欢迎提交 issue,投稿或推荐科技内容. 周刊讨论区的帖子<谁在招人?>,提供大量程 ...
- 【ASP.NET Core】设置Web API 响应的数据格式——Produces 特性篇
开春首文,今天老周就跟各位大伙伴们聊一个很简单的话题:怎么设定API响应的数据格式. 说本质一点,就是设置所返回内容的 MIME 类型(Content-Type 头).当然了,咱们不会使用在HTTP管 ...
- Pandas 秘籍·翻译完成
协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. 在线阅读 ApacheCN 面试求职交流群 724187166 ApacheCN 学习资源 ...
- Angular中$broadcast和$emit的使用方法
要在控制器之间传递变量变化需要使用angular中的$broadcast和$emit方法来传递,同时使用$on来接收事件并作出响应. broadcast译为广播,即上级传递下级. 示例代码: < ...
- js中全局变量和局部变量以及变量声明提升
javascript中全局变量和局部变量的区别 转载前端小99 发布于2018-04-23 15:31:35 阅读数 2102 收藏 展开 [javascript] view plain copy ...
- JAVA多线程学习十七 - 面试题
前面针对多线程相关知识点进行了学习,那么我们来来看看常见的面试题: 1. 空中网面试题1 package com.kongzhongwang.interview; import java.util.c ...