ansible笔记(3):ansible模块的基本使用

  • A+
所属分类:ansible  运维技术

在本博客中,ansible是一个系列文章,我们会尽量以通俗易懂的方式总结ansible的相关知识点。

ansible系列博文直达链接:ansible轻松入门系列

"ansible系列"中的每篇文章都建立在前文的基础之上,所以,请按照顺序阅读这些文章,否则有可能在阅读中遇到障碍。

  

在前文的基础上,我们已经知道,当我们使用ansible完成实际任务时,需要依靠ansible的各个模块,比如,我们想要去ping某主机,则需要使用ping模块,命令如下

  

前文说过,除了ping模块,ansible还有很多模块可供我们使用,那么ansible都有哪些模块呢?我们可以使用如下命令,查看ansible都有哪些模块。

  

执行上述命令后,可以看到ansible中各个模块的名称,以及模块的大概功能,当然,通过"ansible-doc  -l"命令获取到的模块信息比较概括,并不是特别详细,如果想要获取到各个模块更加详细的用法,可以使用“ansible-doc -s”命令,比如,我们想要获取ping模块的详细使用方法,则可以使用如下命令查看

 

即使使用“ansible-doc -s ping”命令查看ping模块的信息,得到的信息也是比较少的,这是因为ping模块本来就比较简单,而且ping模块并没有太多参数可用,但是并非所有模块都像ping模块一样简单,有的模块在使用时必须使用参数,比如  fetch 模块,见名知义,fetch为"拿来"之意,当我们需要将受管主机中的文件拉取到ansible主机时,则可以使用此模块,首先,我们可以使用“ansible-doc -s fetch”命令,查看一下fetch模块的用法,如下图所示

 

ansible笔记(3):ansible模块的基本使用

从帮助信息中可以看出,fetch模块的作用就是"Fetches a file from remote nodes",即"从受管主机中拉取文件"之意,而且fetch模块提供了一些参数供我们使用,我们可用的参数有 dest、fail_on_missing、flat、src、validate_checksum  ,如上图所示,返回信息中注释了每个参数的作用。

比如src参数,src参数的作用就是指定从受管主机中拉取哪个文件。

比如dest参数,dest参数的作用就是指定拉取文件到本地以后文件存放的位置。

细心如你一定发现了,在上图中,dest参数和src参数的注释中都包含"(required)"字样,这表示,在使用fetch模块时,dest参数与src参数是必须提供的,如果在使用fetch模块时,没有提供这两个参数,将会报错,想想也对,如果我们想要从远程主机中拉取文件,那么我们必须告诉ansible,从哪里拉取文件,拉取后将文件存放到哪里吧,所以,在学习怎样使用一个模块时,要注意这些必选参数,那么,我们就从fetch模块入手,看看怎样使用带有参数的模块吧~

 

在开始之前,先来看一下我们的主机清单配置,配置如下

 

假如我们想要将testA组中所有主机的/etc/fstab文件拉取到本地,则可以使用如下命令

ansible testA -m fetch -a "src=/etc/fstab dest=/testdir/ansible/"

如上述命令所示,-m选项用于调用指定的模块,"-m fetch"表示调用fetch模块,

-a选项用于传递模块所需要使用的参数, -a "src=/etc/fstab dest=/testdir/ansible/"表示我们在使用fetch模块时,为fetch模块传入了两个参数,src与dest。

 

那么,我们一起来看一下上述命令的执行效果吧,如下

ansible笔记(3):ansible模块的基本使用

从命令的执行结果可以看出,上述命令执行成功了,因为两个主机对应的返回信息都返回了"SUCCESS"字样。

你可能会有疑问,为什么命令执行成功了,返回的信息却是"黄色"的,在我们的印象中,执行成功,返回的信息不应该是"绿色"的吗?这是为什么呢?此处我们暂且不讨论这个话题,后面我们再行解释。

从返回信息可以看出,执行上述ansible命令后,主机test60和主机test61中的文件已经拉取成功,test61的fstab文件被拷贝到了本机的/testdir/ansible目录中,而且,ansible在/testdir/ansible目录中自动创建了目录结构 test61/etc/,由于我们是同时从多台受管主机中拉取相同名称的文件,所以ansible会自动为我们创建各个主机对应的目录,以区分存放不同主机中的同名文件,有没有觉得很方便,很人性化呢~?

 

之前说过,ansible具有幂等性,幂等性能够保证我们重复的执行一项操作时,得到的结果是相同的,我们再来回顾一下幂等性的概念。

"幂等性"是什么意思呢?举个例子,你想把一个文件拷贝到目标主机的某个目录上,但是你不确定此目录中是否已经存在此文件,当你使用ansible完成这项任务时,就非常简单了,因为如果目标主机的对应目录中已经存在此文件,那么ansible则不会进行任何操作,如果目标主机的对应目录中并不存在此文件,ansible就会将文件拷贝到对应目录中,说白了,ansible是"以结果为导向的",我们指定了一个"目标状态",ansible会自动判断,"当前状态"是否与"目标状态"一致,如果一致,则不进行任何操作,如果不一致,那么就将"当前状态"变成"目标状态",这就是"幂等性","幂等性"可以保证我们重复的执行同一项操作时,得到的结果是一样的。

 

那么我们就来实验一下,看看重复执行相同的ansible命令时,会得到什么效果,效果如下图所示

ansible笔记(3):ansible模块的基本使用

从上图可以看出,返回信息仍然包含"SUCCESS"字样,证明ansible命令执行成功,不过很明显,这次的返回信息为"绿色",而且细心如你一定发现了,这次绿色的返回信息中,"changed"字段的值为false,而之前黄色的返回信息中,"changed"字段的值为true。

当返回信息为绿色时,"changed"为false,表示ansible没有进行任何操作,没有"改变什么"。

当返回信息为黄色时,"changed"为true,表示ansible执行了操作,"当前状态"已经被ansible改变成了"目标状态"。

没错,这就是幂等性的体现,当第一次执行上述命令时,ansible发现当前主机中并没有我们需要的fstab文件,ansible就会按照我们指定的操作,拉取fstab文件,也就是说,ansible"改变"了"当前状态",将当前"没有fstab文件的状态"变为了"有fstab文件的状态",当我们再次执行同样的命令时,ansible发现对应文件已经存在与对应目录中,于是ansible并没有做出任何操作,也没有进行任何改变,因为"当前状态"与我们预期的"目标状态"一致,没有必要再做出重复的无用功。

看到这里,你应该已经明白,为什么执行ansible命令时,会返回黄色的成功信息或者绿色的成功信息了吧?我们可以通过返回信息的颜色,更加精准的判断执行命令之前的状态是否与我们预期的一致。

 

从返回信息中可以看到,当ansible进行fetch操作时,会对对应文件进行哈希计算,算出文件哈希值,也就是说,如果我们改变了文件中的内容,哈希值也将随之发生改变,这个时候,即使对应目录中存在同名的文件,ansible也会判断出两个文件属于不同的文件,因为它们的哈希值并不相同,我们来实验一下,操作如下

ansible笔记(3):ansible模块的基本使用

如上图所示,我们在/testdir/ansible/test61/etc/fstab文件的尾部加入一个"空格",以改变文件内容,然后又执行了fetch命令,我们发现,test61的返回信息为黄色,test60主机的返回信息为绿色,证明ansible已经做出了正确的判断,将修改过的文件替换了,替换为重新拉取的文件。

 
 

小结

我们对上文的一些命令进行总结,方便以后回顾

 

列出ansible所支持的模块

 

查看模块的详细帮助信息,比如查看fetch模块的帮助

 

调用模块,比如调用ping模块

 

调用模块的同时传入模块所需要的参数,以fetch模块为例

 

关于ansible模块的基本使用,我们暂时先介绍到这里,希望能够对你有所帮助~

  

weinxin
我的微信公众号
关注"实用运维笔记"微信公众号,当博客中有新文章时,可第一时间得知哦~
朱双印

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:17   其中:访客  12   博主  5

    • avatar echo 5

      先打卡后学习 :mrgreen:

      • avatar fetch 1

        [root@localhost test]# ansible test -m ping
        172.22.254.217 | UNREACHABLE! => {
        “changed”: false,
        “msg”: “Failed to connect to the host via ssh: Permission denied (publickey,password,keyboard-interactive).\r\n”,
        “unreachable”: true
        }
        172.22.254.230 | UNREACHABLE! => {
        “changed”: false,
        “msg”: “Failed to connect to the host via ssh: Permission denied (publickey,password,keyboard-interactive).\r\n”,
        “unreachable”: true
        }
        172.22.254.234 | UNREACHABLE! => {
        “changed”: false,
        “msg”: “Failed to connect to the host via ssh: Permission denied (publickey,password,keyboard-interactive).\r\n”,
        “unreachable”: true
        }
        172.22.254.100 | UNREACHABLE! => {
        “changed”: false,
        “msg”: “Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n”,
        “unreachable”: true
        }
        [root@localhost test]# ansible test -m ping –ask-pass
        SSH password:
        172.22.254.230 | SUCCESS => {
        “changed”: false,
        “ping”: “pong”
        }
        172.22.254.217 | SUCCESS => {
        “changed”: false,
        “ping”: “pong”
        }
        172.22.254.234 | SUCCESS => {
        “changed”: false,
        “ping”: “pong”
        }
        172.22.254.100 | SUCCESS => {
        “changed”: false,
        “ping”: “pong”
        }
        [root@localhost test]# ansible 172.22.254.234 -m fetch -a “src=/var/log/messages dest=/root/test” –ask-pass
        SSH password:
        172.22.254.234 | SUCCESS => {
        “changed”: true,
        “checksum”: “c52dbfd932e4bafe669e7dae43fb4bc7fbc97e7f”,
        “dest”: “/root/test/172.22.254.234/var/log/messages”,
        “md5sum”: “47407a5fc1ccdf262cb64e0948caf6bc”,
        “remote_checksum”: “c52dbfd932e4bafe669e7dae43fb4bc7fbc97e7f”,
        “remote_md5sum”: null
        }
        [root@localhost test]#
        不晓得为什么一定要加 –ask-pass 执行完一遍 就可以不加,但是过一段时间又不行了,还要加–ask-pass参数。

        [root@localhost test]# cat /etc/ansible/ansible.cfg |awk ‘$1!~/^$/&&$1!~/^#/{print $0}’
        [defaults]
        host_key_checking = False
        [inventory]
        [privilege_escalation]
        [paramiko_connection]
        [ssh_connection]
        scp_if_ssh = True
        [persistent_connection]
        [accelerate]
        [selinux]
        [colors]
        [diff]
        [root@localhost test]#

        • avatar fetch 1

          [root@localhost test]# ansible 172.22.254.234 -m fetch -a “src=/var/log/messages dest=/root/test”
          172.22.254.234 | FAILED! => {
          “changed”: false,
          “file”: “/var/log/messages”,
          “msg”: “unable to calculate the checksum of the remote file”
          }
          不知道为什么一直报这个错

          [root@localhost test]# ansible –version
          ansible 2.6.1
          config file = /etc/ansible/ansible.cfg
          configured module search path = [u’/root/.ansible/plugins/modules’, u’/usr/share/ansible/plugins/modules’]
          ansible python module location = /usr/lib/python2.7/site-packages/ansible
          executable location = /usr/bin/ansible
          python version = 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]

          • avatar supperjj 1

            嘀 学生卡

            • avatar hanli 2

              我觉得前面简单的部分可以写少一点,这样可以加快速度,大多数人自己看教程前面都能看懂,主要是后面的难点不好懂,拿ansible来说,我觉得应该重点讲roles这块与日常工作应用最多的地方。不成熟的建议,还望海涵。

                • avatar 朱双印 Admin

                  @hanli 其实客官说的没错,只是我总结的时候有点强迫症,总希望从头开始,尽量细致,还有就是每个人的基础都不一样,所以这样写受众更广一些,有些朋友还是需要的,感谢客官,有空常来捧场呦~~

                    • avatar quit 1

                      @朱双印 有道理

                      • avatar drgcaosheng 3

                        @朱双印 第一次接触此工具,看得很明白。从iptables与awk过来的,打卡,滴。

                    • avatar 随心 2

                      坐等更新啊

                      • avatar Doaw 1

                        看到博主写的博客,非常受益匪浅,特别棒👍

                          • avatar 朱双印 Admin

                            @Doaw 感谢客官捧场,常来~亲~~

                          • avatar 朱双印的粉丝 0

                            猪哥真棒!

                            • avatar YK 1

                              大师的每一篇都是经典啊,值得永久珍藏。期待大师写一篇关于docker的文章.多谢了

                                • avatar 朱双印 Admin

                                  @YK 谢谢捧场呦 ~亲 ~我尽量多学习,多分享,常来呦~

                                • avatar YK 1

                                  大师每一篇都是经典,永久珍藏。能不能写一篇关于docker的经典啊.谢谢