自动化运维工具Ansible详细介绍

一、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执行特定任务的代码块
Taskansible客户主机上执行的操作
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. 管理端测试

  • ping模块检查网络联通性
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
srctar包源路径,可以是 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


  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值