实例学习ansible系列(2)从Helloworld深度解析Ansible执行原理
发布日期:2021-06-30 20:21:31 浏览次数:2 分类:技术文章

本文共 4361 字,大约阅读时间需要 14 分钟。

知识点:-v -vv -vvv选项

知识点:ansible执行原理
ansible与puppet等相比,其号称是agentless的,而且这个也确实在很多台机器上进行运维时不用一台一台安装或者升级客户端确实带来了一定的便利。Ansible为什么能够实现不需要agent呢,原理在于其将要执行的命令或者脚本通过sftp的方式传到要执行的对象机器,然后通过ssh远程执行,执行之后清理现场将sftp传过去的文件删除,好像一切都没有发生过的一样,这个就是ansible不需要agent的原理。
口说无凭,上实例。

[root@host31 ~]# ansible host32 -m command -a "echo hello world" -vUsing /etc/ansible/ansible.cfg as config filehost32 | SUCCESS | rc=0 >>hello world[root@host31 ~]#

这是一个更为简单的helloworld,-v的选项是显示出详细信息。ansible支持三种显示信息的方式

-v
-vv
-vvv
我们接下来使用-vvv来再看ansible是如何动作的

[root@host31 ~]# ansible host32 -m command -a "echo hello world" -vvvUsing /etc/ansible/ansible.cfg as config file
ESTABLISH SSH CONNECTION FOR USER: None
SSH: EXEC ssh -C -q -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/ansible-ssh-%h-%p-%r host32 '/bin/sh -c '"'"'( umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1469831679.43-224816968104064 `" && echo ansible-tmp-1469831679.43-224816968104064="` echo $HOME/.ansible/tmp/ansible-tmp-1469831679.43-224816968104064 `" ) && sleep 0'"'"''
PUT /tmp/tmpUjtNjh TO /root/.ansible/tmp/ansible-tmp-1469831679.43-224816968104064/command
SSH: EXEC sftp -b - -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/ansible-ssh-%h-%p-%r '[host32]'
ESTABLISH SSH CONNECTION FOR USER: None
SSH: EXEC ssh -C -q -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/ansible-ssh-%h-%p-%r -tt host32 '/bin/sh -c '"'"'LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 /usr/bin/python /root/.ansible/tmp/ansible-tmp-1469831679.43-224816968104064/command; rm -rf "/root/.ansible/tmp/ansible-tmp-1469831679.43-224816968104064/" > /dev/null 2>&1 && sleep 0'"'"''host32 | SUCCESS | rc=0 >>hello world[root@host31 ~]#

分析

[root@host31 ~]# ansible host32 -m command -a “echo hello world” -vvv

Using /etc/ansible/ansible.cfg as config file
ESTABLISH SSH CONNECTION FOR USER: None
SSH: EXEC ssh -C -q -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/ansible-ssh-%h-%p-%r host32 ‘/bin/sh -c ‘”’”’( umask 77 && mkdir -p “echo $HOME/.ansible/tmp/ansible-tmp-1469831679.43-224816968104064” && echo ansible-tmp-1469831679.43-224816968104064=”echo $HOME/.ansible/tmp/ansible-tmp-1469831679.43-224816968104064” ) && sleep 0’”’””
PUT /tmp/tmpUjtNjh TO /root/.ansible/tmp/ansible-tmp-1469831679.43-224816968104064/command

到此处我们可以清晰地看到ansible做了两件事情

- 通过ssh保证通路的畅通
- 将要执行的echo hello world放到了一个文件中

SSH: EXEC sftp -b - -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/ansible-ssh-%h-%p-%r ‘[host32]’

到此处可以看到通过sftp传送到host32

ESTABLISH SSH CONNECTION FOR USER: None

SSH: EXEC ssh -C -q -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/ansible-ssh-%h-%p-%r -tt host32 ‘/bin/sh -c ‘”’“‘LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 /usr/bin/python /root/.ansible/tmp/ansible-tmp-1469831679.43-224816968104064/command; rm -rf “/root/.ansible/tmp/ansible-tmp-1469831679.43-224816968104064/” > /dev/null 2>&1 && sleep 0’”’””

通过ssh远程执行,执行之后清理现场将sftp传过去的文件删除

host32 | SUCCESS | rc=0 >>

hello world
[root@host31 ~]#

总结:

Ansible是非常强大的工具,但是归根到底也就是基于python或者ssh或者其他实现了ssh模块的这样一个功能。这件事情从非常古老的计算机时代就开始是如此,为什么ansible如此之流行,linux的推广以及总多模块的支持以及活跃的参与者和社区是其不断进步的重要原因,接下来我们会学习ansible常用的模块的使用方法。

转载地址:https://liumiaocn.blog.csdn.net/article/details/52070617 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:实例学习ansible系列(3)Ansible执行命令常用Option
下一篇:实例学习ansible系列(1)Helloworld

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月11日 02时09分09秒