Ansible的返回结果非常友好,一般会用三种颜色来表示执行结果:
绿色: 表示成功,没有对目标机器做修改
橘黄色: 表示成功,执行后目标机器有状态变化
红色: 表示失败,执行过程出现异常
一、常用模块
1.ping 模块
用于确认与对象机器是否能够ping通,正常情况返回pong。可以设置data
不是ICMP ping,只是一个简单的模块
对于windows目标,请改用win_ping模块
对于网络目标,请改用net_ping模块
1 # 默认返回是pong 2 [root@Ansible ~]# ansible web -m ping 3 192.168.8.66 | SUCCESS => { 4 "changed": false, 5 "ping": "pong" 6 } 7 8 # 设置返回值是hello 9 [root@Ansible ~]# ansible web -m ping -a "data=hello" 10 192.168.8.66 | SUCCESS => { 11 "changed": false, 12 "ping": "hello" 13 } 14 15 # 设置返回值是crash,模块导致异常 16 [root@Ansible ~]# ansible web -m ping -a "data=crash" 17 192.168.8.66 | FAILED! => { 18 "changed": false, 19 "module_stderr": "Shared connection to 192.168.8.66 closed.\r\n", 20 "module_stdout": "Traceback (most recent call last):\r\n File \"/tmp/ansible_oNemnu/ansible_module_ping.py\", line 84, in <module>\r\n main()\r\n File \"/tmp/ansible_oNemnu/ansible_module_ping.py\", line 74, in main\r\n raise Exception(\"boom\")\r\nException: boom\r\n", 21 "msg": "MODULE FAILURE", 22 "rc": 1 23 }
2.command 模块
command模块用于在远程主机上执行命令,ansible默认就是使用command模块。没有shell环境,因此不会收到用户环境的影响。
command模块有一个缺陷就是不能使用管道符和重定向功能
1 [root@aliyun ~]# ansible all -a 'pwd' 2 yxd_2 | CHANGED | rc=0 >> 3 /app/yxd 4 mantis_2 | CHANGED | rc=0 >> 5 /app/mantis 6 mantis_1 | CHANGED | rc=0 >> 7 /app/mantis 8 yxd_1 | CHANGED | rc=0 >> 9 /app/yxd
对于Windows目标,请改用win_command模块
3.raw模块(应用少)
raw模块用于在远程主机上执行命令,其支持管道符与重定向
使用场景:
① 没有安装python的设备(如路由器)
② 较老的主机(安装python-simplejson)
4.shell模块
注意事项: 如果你想安全可靠的执行命令,请使用command模块,这也是编写playbook的最佳实践
5.srcript模块
将Ansible服务机上的script传送到远程主机之后再执行,给定的脚本将通过远程节点上的shell环境进行处理
当脚本执行时,ssh连接插件将通过-tt强制伪tty分配。伪ttys没有stderr通道,所有stderr被发送到标准输出。如果需要标准输出和标准错误分离,我们需要使用到copy模块
6.copy模块
是将本地或远程机器上的文件拷贝到远程主机上的某个位置
对于Windows目标,请改用win_copy模块
7.file模块
设置文件、符号链接和目录的属性,或删除文件、符号链接、目录
8.synchronize模块
由于synchronize模块会调用rsync命令,因此首先要记得提前安装好rsync软件包
synchronize模块用于将Ansible机器的指定目录推送(push)到远程主机的指定目录下
9.setup模块
facts,被剧本自动调用,以收集有关可用于剧本的远程主机的有用变量
二、playbook
常用命令 --list-hosts :列出剧本的主机 --list-tags :列出剧本的tags --syntax-check :语法检查,检查剧本的语法有无错误 -l SUBSET, --limit SUBSET :指定主机组里哪些主机执行剧本 -t TAGS, --tags TAGS:只执行指定tags的步骤
1.target section (远程主机组)
hosts : 主机组
remote_user: 远程登录用户名
connection: 默认ssh
gather_facts:除非明确说明不需要在远程主机上执行setup模块,否则默认自动执行。如果确实不需要setup模块传递过来的变量,则可以将该选项设置为False
2.variable section (变量)
3.task section (任务)
每一个playbook包含了一个task列表。
自上而下执行任务,若失败则会回退所有。
在众多模块中,只有command和shell模块仅需要给定一个列表而无需使用“key=value”格式如下
tasks: - name: disable selinux command: /sbin/setenforce 0
4.handler section(任务执行完后需要被执行的)
只会执行一次
在“notify”中列出的操作称为handlers,即“notify”中调用handlers中定义的操作。
在“notify”中定义内容一定要和tasks中定义的 - name 内容一样,这样才能达到触发的效果,否则会不生效。handlers也是一些tasks的列表,通过名字来引用,它们和一般的tasks并没有什么区别。
不管有多少个通知者进行了notify,等到play中的所有tasks执行完成之后,handlers也只会被执行一次。
Handlers最佳的应用场景是用来重启服务,或者触发系统重启操作。除此以外很少用到了。
handlers会按照声明的顺序执行
[root@aliyun ansible]# cat user.yml --- - name: create user hosts: aliyun_yxd gather_facts: False vars: user: test tasks: - name: create user remote_user: yxd become: yes become_user: root user: name={{ user }}
[root@aliyun ansible]# cat deploy.yml
---
- name: backup and deploy
hosts: all
gather_facts: False
vars:
user: test
tasks:
- name: backup
#remote_user: yxd
shell: "mkdir -pv ~/rollback;tar -cvzf ~/rollback/lib.tar.gz lib/*;tar -cvzf ~/rollback/bin.tar.gz bin/*"
- name: deploy
#shell: "rsync --process -av "
synchronize: "src=~/output_dir/lib/ dest=~/lib/ compress=yes"
#剧本语法检查,没有报错输出说明剧本语法ok ansible-playbook /root/ansible/install_httpd.yaml --syntax-check #列出剧本要运行的主机 ansible-playbook /root/ansible/install_httpd.yaml --list-hosts #执行剧本 ansible-playbook /root/ansible/install_httpd.yaml #在node1节点上查看,8000端口起来了,说明我们的剧本copy模块复制式成功的 lsof -i:8000
tags其实相当于一个标签,在为某个tasks打上一个tags,然后执行剧本时可以指定tags名字,这样就能单独执行tags那行的任务,如下所示:
cat >/root/ansible/install_httpd.yaml <<'EOF' - hosts: node remote_user: root gather_facts: no tasks: - name: install httpd yum: name=httpd state=present - name: copy apache conf file copy: src=/root/ansible/httpd.conf dest=/etc/httpd/conf/httpd.conf notify: restart httpd service - name: start apache running service: name=httpd state=started enabled=yes tags: start apache handlers: - name: restart httpd service service: name=httpd state=restarted EOF 解读: tags: start apache #定义一个名叫start apache的tags #列出剧本有哪些tags ansible-playbook /root/ansible/install_httpd.yaml --list-tags #指定tags执行剧本(假设剧本已经执行过,现在要启动httpd,那么可以指定tags来执行剧本) ansible-playbook -t "start apache" /root/ansible/install_httpd.yaml 注意:可以将一个tags放在不同的task下,这样执行剧本的时候就会执行多个task;同时,执行剧本时指定tag也可以指定多个tags,使用道号间隔即可。
三、facts
facts组件是Ansible用于采集被管理机器设备信息的一个功能,采集的机器设备信息主要包含IP地址,操作系统,以太网设备,mac 地址,时间/日期相关数据,硬件信息等。采集相关信息进行执行task.
默认自动开启gather_facts,若需要禁用则 gather_facts: False
fact_caching
:缓存facts信息的方式;可以配置成jsonfile
或者redis
;
四、并发
配置文件中默认 forks=5 (并发数量)
并行数量并不受 forks 的数量限制。
forks 和 serial 都可以决定并行执行的服务器数量,当没有在 playbook 中指定 serial 的时候,则以 forks 的值作为并行运行的服务器数量依据;
当在 playbook 中指定了 serial 且同时配置了 forks 的时候,则以 serial 的值作为并行运行的服务器数量的依据。
可参考 https://blog.csdn.net/u012562943/article/details/126111128
1.广度优先(按task来)
将每个 task 先按照 forks 约定的参数,在所有服务器上分批并行执行,等这个 task 执行完毕之后,继续按照相同的方式执行后续的 task。
2.深度优先(按服务器来)
serial 指定(通常小于 forks 指定的参数,yaml中指定)约定数目的服务器上并行执行完所有的 task 之后继续在下一组服务器上,按照相同的方式执行完所有的 task。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言