本来打算自己写一波 ansible 系列的,后来发现一老哥写的太好了,「点击此处直达」,我这里也就边看边对该系列文章做下笔记,方便以后查阅,ansible 入门的话墙裂建议阅读前方链接博文~~~
当我们运行一个 playbook 时,默认都会运行一个名为 [Gathering Facts]
的任务,ansible 通过 [Gathering Facts]
这个默认任务收集远程主机的相关信息(例如远程主机的IP地址,主机名,系统版本,硬件配置等信息)。
其实,playbook 是自动调用了 setup 模块从而执行了 [Gathering Facts]
任务,这些被收集到的远程主机信息会保存在对应的变量中,我们在 playbook 中可以使用这些变量,从而利用这些信息。
那么我们怎样在 playbook 获取到这些变量的值呢?在 setup 模块的示例中,我们可以通过 ansible_memory_mb
关键字获取远程主机的内存信息,其实,ansible_memory_mb
就是一个变量名,换句话说就是,我们可以在 playbook 中直接引用名为 ansible_memory_mb
的变量,从而获取到远程主机的内存信息,示例如下:
---
- hosts: B
tasks:
- name: debug demo
debug:
msg: "Remote host memory information: {{ansible_memory_mb}}"
该 playbook 执行结果如下:
$ ansible-playbook test.yml
PLAY [B] ************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************
ok: [B]
TASK [debug demo] ***************************************************************************************************************************
ok: [B] => {
"msg": "Remote host memory information: {u'real': {u'total': 974, u'used': 493, u'free': 481}, u'swap': {u'cached': 0, u'total': 799, u'free': 799, u'used': 0}, u'nocache': {u'used': 172, u'free': 802}}"
}
PLAY RECAP **********************************************************************************************************************************
B : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
如上,我们自定义的信息中包含了远程主机的内存信息并同时被输出了。
如上述返回信息所示,ansible_memory_mb
中其实包含了 nocache
、real
、 swap
三个部分的信息,如果我们只想获得 real
部分的信息,在 playbook 中引用变量时可以使用如下两种语法。
# 语法一示例:
debug:
msg: "Remote host memory information : {{ansible_memory_mb.real}}"
# 语法二示例:
debug:
msg: "Remote host memory information : {{ansible_memory_mb['real']}}"
其实,这些远程主机的变量信息不仅仅能够用于输出,我们通常会获取到这些信息以后,对这些信息的值进行判断,判断是否符合我们的要求,然后再执行下一步动作,比如,先获取到远程主机的系统发行版信息,然后判断发行版是 CentOS 6 还是 CentOS 7,如果是 CentOS 6,我们就将准备好的 A 文件拷贝到远程主机中,如果是 CentOS 7,我们就将准备好的 B 文件拷贝到远程主机中。
其实我们还可以通过 gather_facts
关键字来控制 play 不去执行 [Gathering Facts]
这个默认任务,示例 playbook 如下:
---
- hosts: B
gather_facts: no
tasks:
- ping:
执行结果如下:
$ ansible-playbook test.yml
PLAY [B] ******************************************************************************************************************************
TASK [ping] ***************************************************************************************************************************
ok: [B]
PLAY RECAP ****************************************************************************************************************************
B : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
从输出信息中可以看到现在没有输出 [Gathering Facts]
任务的信息啦,即没有执行这个任务。
当然,如果不执行默认任务,就不能使用通过默认任务收集过来的信息了,这里我就不再演示啦~~
评论区