一、Ansible介绍
1. Ansible特性
- 模块化:调用特定的模块,完成特定的任务
- Paramiko(python对ssh的实现)、PyYAML、Jinja2(模板语言)
- 支持自定义模块,可使用任何编程语言写模块
- 基于python语言实现
- 部署简单,基于python和SSH,agentless,无需代理不依赖任何PLI
- 安全,基于OpenSSH
- 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来以外情况
- 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构
- 较强的多层解决方案role
2. Ansible架构

# 由上面的图可以看到 Ansible 的组成由 5 个部分组成:
#Ansible : ansible核心
#Modules : 包括 Ansible 自带的核心模块及自定义模块
#Plugins : 完成模块功能的补充,包括连接插件、邮件插件等(connection plugins:负麦和被监控端实现通信)
#Playbooks : 剧本;定义 Ansible 多任务配置文件,由Ansible 自动执行
#Inventory : 定义 Ansible 管理主机的清单 [ˈɪnvəntri] 清单
3. 基本术语
术语 | 含义 |
---|
Control node | 控制节点,指的是安装了ansible的主机,也叫ansib@服务器端、管理机。ansible控制节点主要用于发布运行任务,执行控制命令。控制节点需要安装Python和ansible所需的各种依赖库。 |
Managednodes | 受控节点,即利用ansible执行任务的客户服务器 |
Inventony | 清单,指的是受控节点的列表,即所有要管理的主机的列表 |
host文件 | 清单列表通常保存在一个名为host文件中,在host文件中,可以使用P地址或者主机名来表示具体的管理主机和认证信息,并可以根据主机的用户进行分组 |
Modules | 模块,即ansible执行特定任务的代码块 |
Task | ansible客户主机上执行的操作 |
Playbook | 利用YAML标记语言编写的可重复执行的任务的列表 |
roles | 角色,用于层次性、结构化地组织playbook,roles能够根据层次型结构自动装载变量文件、tasks以及handlers等 |
4. ansible 优点
- 管理端不需要启动服务程序(no server)
- 管理端不需要编写配置文件(/etc/ansible/ansible.cfg)
- 受控端不需要安装软件程序(libselinux-python)
- 受控端不需要启动服务程序(no agent)
- 服务程序管理操作模块众多(module)
- 利用剧本编写来实现自动化(playbook)
- 支持sudo 普通用户
二、Ansible实践
1. 安装Ansible
- yum方式
- yum install epel-release
- yum install ansible
- pip方式
- yum install eple-release
- yum install python2-pip
- pip install ansible
2. Ansible命令参数介绍
1)Ansible常见参数
-
ansible
- -v :详细模式
- -i PATH:指定host文件路径
- -f num:指定同步开启几个进程
- -m module_name:指定模块名称
- -a :指定对应module模块的参数
- -k :提示输入ssh密码,而不是秘钥登录
- -u user_name:指定用户
- -C :测试命令语法
-
ansible-doc
- -l 列出所有模块参数
- -s module_name:查看指定模块参数
2)Ansible常见模块
- command
- shell
- script
- yum
- copy
- fetch
- file
- archive
- unarchive
- cron
- ping
3. 定义主机清单
cd /etc/ansible/
cp -f hosts hosts.backup
# 清空hosts 配置文件内容
cat /dev/null > hosts
#写hosts文件
cat >hosts<<EOF
[webserver]
10.0.0.5
10.0.0.6
# 管理10.0.0.7 docker服务器
[docker]
10.0.0.7
# 本机也可以管理自己管自己
[manager]
10.0.0.61
EOF
4. ssh免密登录

#1)管理端服务器
sh-keygen -t rsa
#2)分发公钥
ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.5
5. 管理端测试
ansible -i /etc/ansible/hosts 'www' -m ping
10.0.0.5 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.0.0.6 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
三、Ansible批量管理服务应用
1. ping模块
1)ansible自己管理自己
- ansible_ssh_port:指定ssh端口
- ansible_ssh_user:指定ssh用户
- ansible_ssh_pass:指定ssh用户登录是认证密码
- ansible_sudo_pass:指定sudo时候的密码
案例1.
cat /etc/ansible/hosts
[www]
10.0.0.5
10.0.0.6
[docker]
10.0.0.7
[manager]
10.0.0.61 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
2)ansible匹配一个网段的机器进行管理
ansible 10.0.0.* -m ping
2. shell模块
1)常用参数
参数 | 说明 |
---|
chdir | 跟command同样的,运行shell以前cd到某个目录 |
creates | 跟command同样的,若是某个文件存在则不运行shell |
removes | 跟command同样的,若是某个文件不存在则不运行shell |
executable | 换用shell环境执行命令 |
2)经典案例
### 案例1. 在docker服务器上 ,在/opt 目录下创建一个名字为rivers+当前时间的目录
ansible docker -m shell -a "mkdir /opt/rivers`date +%F`;ls /opt"
# 通过ls 查看是否创建
ansible docker -m shell -a "ls /opt"
### 案例2. 远程查看docker服务器上nginx 进程信息
ansible docker -m shell -a "ps -ef|grep nginx"
### 案例3. ansible 服务器上远程查看 dockerf 服务器行的防火墙状态是否运行
ansible docker -m shell -a "firewall-cmd --state"
### 案例4. 通过shell 远程批量修改密码
ansible www -m shell -a "echo 123456|passwd --stdin root"
2. command模块
1)常用参数
参数 | 说明 |
---|
chdir | 运行command命令前先cd到这个目录 |
creates | 若是这个参数对应的文件存在,就不运行command |
executable | 将shell切换为command执行,这里的全部命令须要使用绝对路径 |
removes | 若是这个参数对应的文件不存在,就不运行command |
2)经典案例
### 案例1. 使用df -h 查看 docker组中机器的磁盘使用情况
ansible -i /etc/ansible/hosts 10.0.0.7 -m command -a "df -h"
ansible docker -m shell -a "df -h"
### 案例2. 查看docker 服务器上的时间
ansible docker -m command -a "date %F"
### 案例3. 先远程查看docker服务器上有没有httpd安装包
ansible docker -m command -a "ls"
ansible docker -m command -a "wget https://downloads.apache.org/httpd/httpd-2.4.46.tar.bz2"
3. copy模块
把ansible执行机器上的文件拷贝到远程节点上。
1)常用参数
参数名 | 说明 |
---|
src | 用于定位ansible执行的机器上的文件,须要绝对路径。若是拷贝的是文件夹,那么文件夹会总体拷贝,若是结尾是”/”,那么只有文件夹内的东西被考过去。一切的感受很像rsync |
content | 用来替代src,用于将指定文件的内容,拷贝到远程文件内 |
dest | 用于定位远程节点上的文件,须要绝对路径。若是src指向的是文件夹,这个参数也必须是指向文件夹 |
backup | 备份远程节点上的原始文件,在拷贝以前。若是发生什么意外,原始文件还能使用。 |
directory_mode | 这个参数只能用于拷贝文件夹时候,这个设定后,文件夹内新建的文件会被拷贝。而老旧的不会被拷贝 |
follow | 当拷贝的文件夹内有link存在的时候,那么拷贝过去的也会有link |
force | 默认为yes,会覆盖远程的内容不同的文件(可能文件名同样)。若是是no,就不会拷贝文件,若是远程有这个文件 |
group | 设定一个群组拥有拷贝到远程节点的文件权限 |
mode | 等同于chmod,参数能够为“u+rwx or u=rw,g=r,o=r” |
owner | 设定一个用户拥有拷贝到远程节点的文件权限 |
2)经典案例
### 案例1. 将ansible 服务器上的http 安装包远程 拷贝到 10.0.0.5 服务器上,且权限设置为 755
ansible -i /etc/ansible/hosts 10.0.0.5 -m command -a "ls"
ansible -i /etc/ansible/hosts 10.0.0.5 -m copy -a "src=/root/httpd-2.4.46.tar.bz2 dest=/root mode=755"
4. fetch模块
文件拉取模块主要是将远程主机中的文件拷贝到本机中
1)常用参数
参数名 | 说明 |
---|
dest | 用来存放文件的目录,例如存放目录为backup,源文件名称为/etc/profile在主机pythonserver中,那么保存为/backup/pythonserver/etc/profile |
fail_on_missing | 当源文件不存在的时候,标识为失败 |
falt | 容许覆盖默认行为从hostname/path到/file的,若是dest以/结尾,它将使用源文件的基础名称 |
src | 在远程拉取的文件,而且必须是一个file,不能是目录 |
2)经典案例
### 案例1. 把testA组受管主机中的/etc/fstab拉取到本机的/testdir/ansible中
ansible testA -m fetch -a "src=/etc/fstab dest=/testdir/ansible"
5. yum模块
1)常用参数
参数 | 说明 |
---|
conf_file | 设定远程yum执行时所依赖的yum配置文件 |
name | 需要安装软件的名字,支持软件组的安装 |
enablerepo | 指定repo源名称 |
state | 软件状态:installed、present、latest、absent、removed |
skip_broken | 跳过异常软件点 |
2)经典案例
### 案例1. 远程在 10.0.0.6 服务器上安装 httpd 服务
ansible -i /etc/ansible/hosts 10.0.0.6 -m yum -a "name=httpd state=installed"
# 远程启动 httpd 服务
ansible -i /etc/ansible/hosts 10.0.0.6 -m command -a "systemctl start httpd"
10.0.0.6 | CHANGED | rc=0 >>
# 远程查看http服务进程
ansible -i /etc/ansible/hosts 10.0.0.6 -m shell -a "ps -ef|grep httpd"
10.0.0.6 | CHANGED | rc=0 >>
root 10924 1 0 16:11 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 10925 10924 0 16:11 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 10926 10924 0 16:11 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 10928 10924 0 16:11 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 10929 10924 0 16:11 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 10930 10924 0 16:11 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
root 11066 11061 0 16:12 pts/0 00:00:00 /bin/sh -c ps -ef|grep httpd
root 11068 11066 0 16:12 pts/0 00:00:00 grep httpd
# 停止 httpd 服务
nsible -i /etc/ansible/hosts 10.0.0.6 -m command -a "systemctl stop httpd"
# 远程卸载 httpd
ansible -i /etc/ansible/hosts 10.0.0.6 -m yum -a "name=httpd state=removed"
### 案例2. 将www组服务器中的所有yum进程都杀掉
# 停止正在工作的yum进程
ansible www -m shell -a "pkill -yum"
# 查看进程
ansible www -m shell -a "ps -ef|grep yum"
6. file模块
1)常用参数
参数 | 说明 |
---|
src | 源文件或目录 |
follow | 支持link文件拷贝 |
force | 覆盖远程主机不一致内容 |
group | 制定远程主机文件夹组名 |
mode | 指定远程主机文件及文件夹的权限 |
owner | 指定远程主机文件夹的用户名 |
dest/path | 目标目录或文件 |
state | 状态包括:file、link(创建软链接)、directory、hard(创建链接)、touch(创建文件)、absent(删除文件); |
2)经典案例
### 案例1. 在 docker 服务器上 /usr/local 目录下面创建一个rivers的目录,名字为 rivers,属主为nginx
ansible docker -m file -a "path=/usr/local/rivers state=directory mode=644 owner=nginx"
# 查看目录
ansible docker -m command -a "ls /usr/local/rivers"
### 案例2. 在docker服务器上创建脚本文件
#在/usr/local/rivers/script.sh文件
ansible docker -m file -a "path=/usr/local/rivers/script.sh state=touch mode=777"
7. cron模块
1)常用参数
参数名 | 说明 |
---|
name | 任务计划名称; |
cron_file | 替换客户端该用户的任务计划的文件; |
minute | 分( 0-59 ,* ,*/2 ); |
hour | 时( 0-23 ,* ,*/2 ); |
day | 日( 1-31 ,* ,*/2 ); |
month | 月( 1-12 ,* ,*/2 ); |
weekday | 周( 0-6 或 1-7 ,* ); |
job | 任何计划执行的命令,state要等于present; |
backup | 是否备份之前的任务计划; |
user | 新建任务计划的用户; |
state | 指定任务计划present、absent。 |
2)经典案例
### 案例1. docker 服务器 自动同步 阿里云
ansible 10.0.0.7 -m cron -a "minute=0 hour=2 job='/usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1'"
### 案例2. 删除定时任务
ansible docker -m cron -a "name='#Ansible' state=absent"
### 案例3. 给定时任务设置注释信息,名字注释
ansible 10.0.0.6 -m cron -a "name='time sync' minute=0 hour=2 job='/usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1'"
### 案例4. 查看10.0.0.6这台服务器上的定时任务
ansible 10.0.0.6 -m shell -a "cat /var/spool/cron/root"
8. user模块
1)常用参数
参数 | 说明 |
---|
system | 默认创建为普通用户,为yes则创建系统用户; |
append | 添加一个新的组; |
comment | 新增描述信息; |
createhome | 给用户创建家目录; |
force | 用于删除强制删除用户; |
group | 创建用户主组; |
groups | 将用户加入组或者附属组添加; |
home | 指定用户的家目录; |
state | 表示状态,是否create、remove、modif、present(创建用户)、absent(删除) |
name | 用户名 |
password | 指定用户的密码,此处为加密密码; |
remove | 删除用户; |
shell | 设置用户的shell登录环境; |
uid | 设置用户id; |
update_password | 修改用户密码; |
state | 用户状态,默认为present表示新建用户。- absent表示删除 |
2)经典案例
### 案例1. 在docker 服务器上创建一个普通用户 nidaye。name=用户名,home=用户家目录
ansible docker -m user -a "name=nidaye home=/home/admin"
### 案例2. 查看刚新建的用户 nidaye
ansible docker -m shell -a "id nidaye"
### 案例3. 在10.0.0.5 服务器上 创建一个 名字apache ,shell /sbin/nologin 家目录为/opt
ansible 10.0.0.5 -m user -a "name=apache home=/opt shell=/sbin/nologin"
### 案例4. 删除apache用户
ansible 10.0.0.5 -m user -a "name=apache state=absent force=yes"
9. service模块
1)常用参数
参数 | 说明 |
---|
enabled | 是否开启启动服务; |
name | 服务名称; |
runlevel | 服务启动级别; |
arguments | 服务命令行参数传递; |
state | 服务操作状态,状态包括started, stopped, restarted, reloaded。 |
2)经典案例
### 案例1. 远程重启10.0.0.5 服务器上的 firewalld 服务器
ansible 10.0.0.5 -m service -a "name=firewalld state=restarted"
### 案例2. 远程关闭防火墙
ansible 10.0.0.5 -m service -a "name=firewalld state=stopped"
### 案例3. 远程启动 eht0 网卡
ansible 10.0.0.5 -m service -a "name=network args=eth0 state=restarted"
10. archive模块
1)常用参数
参数 | 说明 |
---|
path | 必须参数,远程主机上需要被打包压缩的源文件/目录 |
dest | 打包压缩后的包文件路径(包文件的父目录必须存在);如果包文件已存在,则会被覆盖 |
format | 指定压缩类型,包括: bz2、gz(默认)、tar、xz、zip |
remove=yes|no | 是否删除源文件 |
2)经典案例
### 案例1. 远程主机上/etc/yum.repos.d/目录 打包压缩成/opt/repo.zip 格式为zip
ansible dbservers -m archive -a 'path=/etc/yum.repos.d/ dest=/opt/repo.zip format=zip'
### 案例2. 远程主机上/opt目录下的abc.txt和123.txt文件打包压缩成/opt/abc123.tar.gz 格式为tar.gz 并且删除源文件
ansible dbservers -m archive -a 'path=/opt/abc.txt,/opt/123.txt dest=/opt/abc123.tar.gz format=gz remove=yes'
注意:删除源文件后目录仍然会保留下来
11. unarchive模块
1)常用参数
参数 | 说明 |
---|
copy | 默认为 copy=yes ,拷贝的文件从 ansible 主机复制到远程主机copy=no |
src | tar包源路径,可以是 ansible 主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需设置 copy=no |
dest | 解压后文件的目标绝对路径 |
remote_src | 和 copy 功能一样且互斥,设置 remote_src=yes 表示文件在远程主机上,设置为 remote_src=no 表示文件在 ansible 主机上 |
2)经典案例
### 案例1. 将 ansible 主机的压缩文件拷贝到到远程主机并解压
ansible dbservers -m unarchive -a 'src=/opt/abc.tar.gz dest=/root copy=yes'
ansible dbservers -m unarchive -a 'src=/opt/abc.tar.gz dest=/root remote_src=no'
### 案例2. 在远程主机解包
ansible dbservers -m unarchive -a 'src=/opt/123.tar.gz dest=/root copy=no'
ansible dbservers -m unarchive -a 'src=/opt/123.tar.gz dest=/root remote_src=yes'
12. setup模块
facts组件是用来收集被管理节点信息的,使用setup 模块可以获取这些信息。
#查看setup模块包含的操作动作
ansible-doc -s setup
#获取dbservers组主机的facts信息
ansible dbservers -m setup
#使用filter参数可以筛选指定的facts信息
ansible dbservers -m setup -a 'filter=*ipv4'
13. hostname模块
用于管理远程主机上的主机名。
ansible dbservers -m hostname -a 'name=centos7-6' #修改dbservers组的主机名
14. scripts模块
在远程主机上执行 ansible 管理主机上的脚本
1)常用参数
参数 | 说明 |
---|
free_form | 必须参数指定需要执行的脚本,脚本位于 ansible 管理主机本地 |
chdir | 指定一个远程主机中的目录,在执行对应的脚本之前,会先进入到 chdir 参数指定的目录中。 |
creates | 使用此参数指定一个远程主机中的文件,当指定的文件存在时,就不执行对应脚本 |
remove=yes|no | 当指定的文件不存在时,就不执行对应脚本 |
2)经典案例
案例1. 在远程主机上运行test01.sh脚本
# Ansible主机写入测试脚本
cat >test01.sh<<EOF
echo "今天是2021-02-22" > /root/20210222.txt
EOF
# 在all主机中执行,执行此脚本之前,会先进入到all主机中的 /opt 目录
ansible all -m script -a "chdir=/opt /root/test/test01.sh"
四、Ansible配置文件
- Ansible默认配置文件为/etc/ansible/ansible.cfg
- 配置文件中包括并发线程、用户、模块路径、配置优化等
1. 配置文件说明:
[defaults] 通用默认配置段;
inventory = /etc/ansible/hosts 被控端IP或者DNS列表;
library = /usr/share/my_modules/ Ansible默认搜寻模块的位置;
remote_tmp = $HOME/.ansible/tmp Ansible远程执行临时文件;
pattern = * 对所有主机通信;
forks = 5 并行进程数;
poll_interval = 15 回频率或轮训间隔时间;
sudo_user = root sudo远程执行用户名;
ask_sudo_pass = True 使用sudo,是否需要输入密码;
ask_pass = True 是否需要输入密码;
transport = smart 通信机制;
remote_port = 22 远程SSH端口;
module_lang = C 模块和系统之间通信的语言;
gathering = implicit 控制默认facts收集(远程系统变量);
roles_path= /etc/ansible/roles 用于playbook搜索Ansible roles;
host_key_checking = False 检查远程主机密钥;
#sudo_exe = sudo sudo远程执行命令;
#sudo_flags = -H 传递sudo之外的参数;
timeout = 10 SSH超时时间;
remote_user = root 远程登陆用户名;
log_path = /var/log/ansible.log 日志文件存放路径;
module_name = command Ansible命令执行默认的模块;
#executable = /bin/sh 执行的Shell环境,用户Shell模块;
#hash_behaviour = replace 特定的优先级覆盖变量;
#jinja2_extensions 允许开启Jinja2拓展模块;
#private_key_file = /path/to/file 私钥文件存储位置;
#display_skipped_hosts = True 显示任何跳过任务的状态;
#system_warnings = True 禁用系统运行ansible潜在问题警告;
#deprecation_warnings = True Playbook输出禁用“不建议使用”警告;
#command_warnings = False command模块Ansible默认发出警告;
#nocolor = 1 输出带上颜色区别,开启/关闭:0/1;
pipelining = False 开启pipe SSH通道优化;
[accelerate] accelerate缓存加速。
accelerate_port = 5099
accelerate_timeout = 30
accelerate_connect_timeout = 5.0
accelerate_daemon_timeout = 30
accelerate_multi_key = yes
2. Ansible优化操作
1)关闭ssh秘钥检测
# 在ansible 配置文件中加入以下代码:
host_key_checking = False
2)openssh连接优化
# 使用OpenSSH服务时,默认服务器端配置文件UseDNS=YES状态,该选项会导致服务器根据客户端的IP地址进行DNS PTR反向解析,得到客户端的主机名,然后根据获取到的主机名进行DNS正向A记录查询,并验证该IP是否与原始IP一致。关闭DNS解析
sed -i '/^GSSAPI/s/yes/no/g;/UseDNS/d;/Protocol/aUseDNS no' /etc/ssh/sshd_config
/etc/init.d/sshd restart
3)加速ansible
# SSH pipelining是一个加速 Ansible 执行速度的简单方法,SSH pipelining 默认是关闭的,关闭是为了兼容不同的 sudo 配置,主要是requiretty 选项。
如果不使用Sudo建议开启该选项,打开此选项可以减少Ansible 执行没有文件传输时,SSH在被控机器上执行任务的连接数。使用Sudo操作的时候, 必须在所有被管理的主机上将配置文件/etc/sudoers中requiretty选项禁用。
sed -i '/^pipelining/s/False/True/g' /etc/ansible/ansible.cfg
五、Ansible剧本
1. ansible playbook介绍
- 通过Playbook任务,能够集中管理多个任务,将多个任务关联起来,从而实现更加复杂工作,满足生产环境的各个需求,提高运维人员管理服务器效率
- Playbook剧本的产物YAML文件,类似XML接口(Tomcat)文件,内部有固定语法、参数等,要掌握常用的YAML语法编写,掌握满足运维管理方向的语法即可
2. playbook中的定义任务
- name: task description #任务描述信息
- module_name: module_args #需要使用的模块名字: 模块参数
- files:存放需要同步到异地服务器的源码文件及配置文件;
- handlers:当服务的配置文件发生变化时需要进行的操作,比如:重启服务,重新加载配置文件
- meta:角色定义,可留空;
- tasks:需要进行的执行的任务;
- templates:用于执行lamp安装的模板文件,一般为脚本
- vars:本次安装定义的变量
3. playbook运行、语法检查
- 运行 lnmp文件
- ansible-playbook lnmp.yml
- 检查lnmp 语法
- ansible-playbook --syntax-check lnmp.yml
4. playbook组件
- Target:定义playbook的远程主机组
- hosts:定义远程主机组
- user:执行该任务的用户
- sudo:yes则使用root权限
- sudo_user:指定sudo普通用户
- connection:默认基于ssh连接客户端
- gather_facks:获取远程主机facts基础信息
- Variable:定义playbook使用的变量
- vars:定义格式,变量名:变量值
- vars_files:指定变量文件
- vars_prompt:用户交互模式自定义变量
- setup:模块去远程主机的值
- Task:定义远程主机上执行的任务列表
- name:任务显示名称
- action:定义执行的动作
- copy:复制本地文件到远程主机
- template:复制本地文件到远程主机,可引入本地变量
- service:定义服务状态
- Handler:当服务配置文件发生变化时所需要进行的操作
### 案例1. 通过ansible 给www组服务器里面的 10.0.0.5 这台服务器安装httpd-2.4.46.tar.bz2服务
cat > httpd_install.yaml<<EOF
--- #开头标志
- hosts: 10.0.0.5
remote_user: root
tasks:
- name: install httpd-2.4.tar.bz2
yum: name=apr,apr-devel,apr-util,apr-util-devel,gcc-c++,bzip2 state=installed
- name: apache httpd-2.4 install process
shell: cd /opt/; rm -rf httpd-2.4.46.tar.bz2; wget https://downloads.apache.org/httpd/httpd-2.4.46.tar.bz2; tar xjf httpd-2.4.46.tar.bz2 -C /usr/local/; cd /usr/local/httpd-2.4.46/; ./configure --prefix=/usr/local/apache --with-pmp=worker; make -j4; make install;
... #结束标志
EOF
### 案例2. 检查httpd_install.yaml语法文件
# 检查 httpd_install.yaml 语法,下面是正确通过的
ansible-playbook --syntax-check httpd_install.yaml
### 案例3. 使用ansible playbook安装nginx WEB服务,并启动
# 判断是否安装有安装后的nginx目录,如果有直接启动,如果没有安装nginx
cat > nginx.yaml<<EOF
remote_user: root
tasks:
- name: install yum_package
yum: name=pcre-devel,openssl,openssl-devel,gd-devel,gcc,gcc-c++ state=installed
- name: echo -e "\033[44;37m 判断是否存在nginx安装目录 \033[0m"
file: path=/usr/local/nginx state=directory
notify:
- nginx start
- nginx install
handlers:
- name: nginx install
shell: cd /opt/; rm -rf nginx-1.20.1.tar.gz; wget http://nginx.org/download/nginx-1.20.1.tar.gz; tar xf nginx-1.20
.1.tar.gz -C /usr/local/; useradd -M -s /sbin/nologin nginx; mkdir -p /var/log/nginx;cd /usr/local/nginx-1.20.1; ./confi
gure --user=nginx --prefix=/usr/local/nginx --with-http_ssl_module --with-http_realip_module --with-http_image_filter_mo
dule --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/ng
inx/access.log --error-log-path=/var/log/nginx/error.log --without-http_rewrite_module; make && make install; /usr/local
/nginx/sbin/nginx -t;
- name: nginx start
shell: /usr/local/nginx/sbin/nginx
EOF
### 案例4. 使用 user 模块批量创建rivers01、02、03用户
- hosts: 10.0.0.7
remote_user: root
tasks:
- name: Add User list.
user: name={{ item }} state=present
with_items:
- rivers01
- rivers02
- rivers03
- name: check system user
shell: num= `tail -3 /etc/passwd|grep -c rivers`; if [ $num ge 3 ]; then echo is ok!; fi
### 案例4. ansible-playbook lnmp.yaml 剧本
[root@ansible_server~]# cat lnmp_install.yaml
# author
# 任务1:安装nginx
- hosts: 10.0.0.5
remote_user: root
tasks:
- name: 修改主机名,判断、安装/启动nginx
shell: hostnamectl set-hostname Hosts-01
- name: install yum_package
yum: name=pcre-devel,openssl,openssl-devel,gd-devel,gcc,gcc-c++ state=installed
- name: echo -e "\033[44;37m 判断是否存在nginx安装目录 \033[0m"
file: path=/usr/local/nginx state=directory
notify:
- nginx start
- nginx install
handlers:
- name: nginx install
shell: cd /opt/; rm -rf nginx-1.20.1.tar.gz; wget http://nginx.org/download/nginx-1.20.1.tar.gz; tar xf nginx-1.20.1.tar.gz -C /usr/local/; useradd -M -s /sbin/nologin nginx; mkdir -p /var/log/nginx;cd /usr/local/nginx-1.20.1; ./configure --user=nginx --prefix=/usr/local/nginx --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --without-http_rewrite_module; make && make install; /usr/local/nginx/sbin/nginx -t;
- name: nginx start
shell: /usr/local/nginx/sbin/nginx
# 任务2 安装mysql
- hosts: 10.0.0.6
remote_user: root
tasks:
- name: install yum_package
yum: name=pcre-devel,openssl,openssl-devel,gd-devel,gcc,gcc-c++,ncurses-devel state=installed
- name: 下载安装包、并解压
shell: cd /opt/; tar -xf mysql-5.1.63.tar.gz -C /usr/local/
- name: 开始编译安装
shell: cd /usr/local/mysql-5.1.63/; ./configure --prefix=/usr/local/mysql --enable-assembler; make -j8&&make -j8 install; \cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf; \cp /usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysqld;
- name: 配置启动/重启
shell: chkconfig --add mysqld;chkconfig --level 35 mysqld on; service mysqld restart
# 任务3 安装php
- hosts: 10.0.0.5
remote_user: root
tasks:
- name: install php_package
yum: name=libxml2,libxml2-devel,openssl,openssl-devel,bzip2,bzip2-devel,libcurl,libcurl-devel,libjpeg,libjpeg-devel,libpng,libpng-devel,freetype,freetype-devel,gmp,gmp-devel,libmcrypt,libmcrypt-devel,readline,readline-devel,libxslt,libxslt-devel,pcre-devel,ncurses,ncurses-devel,bison,cmake state=installed
- name: 下载安装包、并解压
shell: cd /opt/; wget http://mirrors.sohu.com/php/php-7.2.10.tar.gz; tar xf php-7.2.10.tar.gz -C /usr/local/; cd /usr/local/php-7.2.10/; ./configure --prefix=/usr/local/php --disable-fileinfo --enable-fpm --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-openssl --with-zlib --with-curl --enable-ftp --with-gd --with-xmlrpc --with-jpeg-dir --with-png-dir --with-freetype-dir --enable-gd-native-ttf --enable-mbstring --with-mcrypt=/usr/local/libmcrypt --enable-zip --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mysql-sock=/var/lib/mysql/mysql.sock --without-pear --enable-bcmath; make && make install; ln -s /usr/local/php/bin/* /usr/local/bin/; \cp php.ini-production /etc/php.ini; \cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf; \cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf; \cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm; chmod +x /etc/init.d/php-fpm; chkconfig --add php-fpm
- name: 启动php服务
shell: systemctl start php-fpm
l --enable-ftp --with-gd --with-xmlrpc --with-jpeg-dir --with-png-dir --with-freetype-dir --enable-gd-native-ttf --enable-mbstring --with-mcrypt=/usr/local/libmcrypt --enable-zip --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mysql-sock=/var/lib/mysql/mysql.sock --without-pear --enable-bcmath; make && make install; ln -s /usr/local/php/bin/* /usr/local/bin/; \cp php.ini-production /etc/php.ini; \cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf; \cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf; \cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm; chmod +x /etc/init.d/php-fpm; chkconfig --add php-fpm
- name: 启动php服务
shell: systemctl start php-fpm