Ansible(二)如何在多台主机上批量执行任务
2021-01-06 本文已影响0人
月饮沙
Ansible批量执行任务有两种方式adhoc
和playbook
,当执行简单的命令时,可以使用adhoc
,当执行复杂的命令,涉及多个模块/条件等时,建议使用playbook
module 模块
ansible
的底层是python
,但是我们在使用ansible
的时候不需要写python
脚本,而是直接调用模块即可。
模块是由红帽官方或者其他合作伙伴或开发爱好者开发好的脚本,我们可以通过调用模块,来执行对应的命令。
查看所有ansible模块
ansible-doc -l
查看指定模块的使用帮助
ansible-doc ping
常用模块
文件相关模块
- copy 复制本地文件到被管理主机
- file 设置文件的权限和属性
- lineinfile 设置文件内容
- synchronize 使用rsync同步内容
软件包管理相关模块
- package 根据被管理主机操作系统自动选择工具管理软件包
- yum 使用yum包管理工具管理软件包
- apt 使用APT包管理工具管理软件包
- dnf 使用DNF包管理工具管理软件包
- gem 管理Ruby gems
- pip 通过PyPI管理Python软件包
系统相关模块
- firewalld 使用firewalld管理防火墙
- reboot 重启机器
- servcie 管理服务
- user 管理用户
adhoc
格式
ansible" host-pattern" -m "module" -a"module argument" -i "inventroy-path"
参数
-
-m
模块
如果不指定-m
,默认使用command
模块,command
模块可以直接在被管理主机上执行Linux
命令 -
-a
模块参数 -
-u
remote_user -
-i
inventory路径
示例
[root@localhost ~]# ansible all -m ping
servera.lab.example.com | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
playbook
playbook
是一个yaml
格式的文件,后缀名为.yml
或者.yaml
playbook文件内容
在一个playbook
文件中,可以包含多个play
一个play
就是要在指定主机中执行的一系列操作,在一个play
中可以指定hosts
(在哪些主机上执行)和tasks
(执行哪些命令)
tasks
中可以包含多个task
,每个task
就是对一个模块的调用
playbook文件示例
# YAML文件以---开头
---
# - 表示列表
# 第一个play 名称是Configure web server
- name: Configure web server
# hosts指定第一个play在哪些主机上执行
hosts: servera.lab.example.com
# tasks指定第一个play中都执行哪些内容
tasks:
# 第一个task,调用service模块,启动httpd服务并设置开机启动
- name: start and enabled httpd
service:
name: httpd
enabled: true
state: started
# 第二个play
- name: import test play file and set the variable
import_playbook: plays/test.yml
vars:
url: "http://servera.lab.example.com"
YAML文件语法
- 字符串
- 普通字符串可以不加引号,加单引号,加双引号
如果要引用变量,并且变量在开头,必须使用双引号将整行括起来 - 多行字符串
|
文本实际是多行,自动将回车符替换成\n
>
文本实际是一行,不会对回车符进行处理
- 普通字符串可以不加引号,加单引号,加双引号
- 列表
在同一缩进下,使用-
来指定列表 - 字典
使用key: value
来指定字典
示例
# 字符串
name: This is a string
name: "This is a string"
name: 'This is a string'
# 列表
hosts:
- servera
- serverb
- serverc
# 字典
name: httpd
port: 443
执行playbook
语法
ansible-playbook webserver.yml -e "user=root"
参数
-
--limit=serverc
只在serverc上执行 -
--syntax-check
检查语法错误 -
-e
指定变量 -
-C
假装运行 没啥用
playbook的输出和结果
Playbook通常是幂等的,即同一个playbook,无论运行多少次,最终的结果都是一样的。如果被控主机之前已经进行了更改,那么再次运行playbook的时候不会进行变更。
playbook的执行结果
以下是一个playbook
的执行结果示例
[root@localhost ~]# ansible-playbook copy-file.yml
# 执行的PLAY的名称
PLAY [Using the copy module] **********************************************************************************************
# 执行的TASK名称 以及该TASK在哪些主机上执行及执行结果
TASK [Gathering Facts] ****************************************************************************************************
ok: [serverb.lab.example.com]
ok: [servera.lab.example.com]
TASK [copy files/user.txt to remote host] *********************************************************************************
changed: [serverb.lab.example.com]
changed: [servera.lab.example.com]
# PLAY的执行结果概述
PLAY RECAP ****************************************************************************************************************
servera.lab.example.com : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
serverb.lab.example.com : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
说明
TASK
的执行结果
一般结果
-
ok
执行成功,没有进行更改 -
changed
执行成功,并且进行了更改 -
unreachable
被控主机不可达 -
failed
执行失败
流程控制相关
-
skipped
不满足执行条件,跳过task不进行执行 -
rescued
在block
运行失败时执行 -
ignored
执行失败但忽略错误