东行天下

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
统计
 
 
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。

 

posted on   东行天下  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言
 
点击右上角即可分享
微信分享提示