第二章·自动化运维工具-Ansible ad-hoc
Ansible ad-hoc
什么是ad-hoc?
ad-hoc简而言之就是“临时命令”,执行完即结束,并不会保存
ad-hoc模式的使用场景
比如在多台机器上查看某个进程是否启动,或拷贝指定文件到本地,等等
ad-hoc模式的命令使用
ad-hoc结果返回颜色
- 绿色:命令执行成功且无变化的颜色
- 黄色:命令执行成功,但是有变化(有更改)
- 红色:命令执行失败,报错msg
- 粉色|紫色:Warning,警告一般无需处理
Ansible-doc帮助手册
[root@m01 ~]# ansible-doc -l # 查看所有模块说明
[root@m01 ~]# ansible-doc 模块名 # 查看指定模块方法
找到帮助信息中的:EXAMPLES
[root@m01 ~]# ansible-doc -s 模块名 # 查看指定模块参数
ad-hoc常用模块
command # 执行shell命令(不支持管道等特殊字符)
shell # 执行shell命令
scripts # 执行shell脚本
yum_repository # 配置yum仓库
yum # 安装软件
copy # 变更配置文件
file # 建立目录或文件
service # 启动与停止服务
mount # 挂载设备
cron # 定时任务
get_url #下载软件
firewalld #防火墙
selinux #selinux
Ansible命令模块
command模块、shell模块
# 默认模块, 执行命令
[root@m01 ~]# ansible web_group -m shell -a 'yum install -y httpd'
# 如果需要一些管道操作,则使用shell
[root@m01 ~]# ansible web_group -m command -a 'yum install -y httpd'
#注意:command模块不支持特殊符号
script模块
# 编写脚本
[root@m01 ~]# vim /root/yum.sh
#!/usr/bin/bash
yum install -y vsftpd
#在本地运行模块,等同于在远程执行,不需要将脚本文件进行推送目标主机执行
[root@m01 ~]# ansible web_group -m script -a "/root/yum.sh"
Ansible文件管理模块
file模块
## file模块动作
src:指定软链接的源文件
dest:指定软链接的目标文件
path:指定文件路径
owner:指定文件属主
group:指定文件属组
mode:指定文件权限
recurse:递归
state:
- touch 创建文件
- absent 删除
- directory 创建目录
- link 软链接
- hard 硬链接
## 在/opt目录下创建test目录
[root@m01 ~]# ansible web_group -m file -a 'path=/opt/test state=directory'
## 在/opt目录下创建efg目录属主www 属组www 权限200
[root@m01 ~]# ansible web_group -m file -a 'path=/opt/efg owner=www group=www mode=200
state=directory'
## 在/opt目录下创建文件abc 属主www 属组www 权限200
[root@m01 ~]# ansible web_group -m file -a 'path=/opt/abc owner=www group=www mode=200
state=touch'
## 创建软链接文件
[root@m01 ~]# ansible web_group -m file -a 'path=/usr/opt_test_link state=link'
copy模块
#作用:统一配置管理
## copy模块动作
src:指定源文件的路径
dest:指定目标文件的路径
owner:指定属主
group:指定属组
mode:指定权限
content:指定内容写入文件 # (无法追加,适合短配置文件)
backup:备份
- yes/True
- no/False
remote_src:指定源文件在远端
-yes/True
-no/False
#将管理端的配置文件下发到被管理端
[root@m01 ~]# ansible web_group -m copy -a 'src=/root/lw.com.conf dest=/opt'
#使用backup做备份
[root@m01 ~]# ansible web_group -m copy -a 'src=/root/lw.com.conf dest=/opt backup=true
#指定属主和属组
[root@m01 ~]# ansible web_group -m copy -a 'src=/root/lw.com.conf dest=/opt owner=www group=www mode=644'
#remote_src指定源文件在远端
[root@m01 ~]# ansible web_group -m copy -a 'src=/opt/1.text dest=/tmp remote_src=true'
#content往指定文件中写入内容
[root@m01 ~]# ansible web_group -m copy -a 'dest=/opt/rsync.passwd content="lw:123" mode=600'
get_url模块
# = wget下载文件
## copy模块动作
url=下载的网址
dest=下载的路径
mode=指定权限
## 下载wordpress
[root@m01 ~]# ansible web_group -m get_url -a 'url="http://test.driverzeng.com/Nginx_Code/QQ2.8.zip" dest=/opt mode=777'
= wget -O /etc/yum.repos.d/CentOS-base.repo http://test.driverzeng.com/Nginx_Code/QQ2.8.zip" dest=/opt mode=777
#下载阿里云的base源
[root@m01 ~]# ansible web_group -m get_url -a 'url=="https://mirrors.aliyun.com/repo/Centos-7.repo" dest=/opt/CenOS-Base.repo'
Ansible软件管理模块
yum模块
## yum模块动作
name:指定安全包的名字
- http:// 从指定的url下载 = yum install -y http://网址
- file:// 从本地的rpm包安装 = yum localinstall
- 包名 从yum仓库中下载 = yum install -y 包名
stat:
-absent/removed:卸载 = yum remove
-present/install:安装 = yum install (默认)
-latest:安全最新版本
download_only:只下载不安装
#安装nginx和mysql客户端
[root@m01 ~]# ansible web_group -m yum -a 'name=nginx,mariadb'
yum_repository模块
##管理yum源、yum仓库
## yum源配置文件
[base] #仓库的名字
name=xxx #仓库的描述信息
baseurl=http://xxx #仓库的下载地址url地址
gpgcheck=0 #gpg签名验证开启或关闭
gpgkey=file
enable=1 #仓库开启或关闭
## yum_repository模块动作
name:仓库的名字
description:仓库的描述信息
baseurl:仓库的下载地址url地址
file:如果没有指定file则文件名和name指定的一致,如果指定了file,文件名为file指定的内容,仓库名 name指定的内容
owner:指定属主
group:指定属组
mode:指定权限
gpgcheck:密钥对检测
-yes/true gpgcheck=1
-no/false gpgcheck=0
enabled:是否开启仓库
-yes/true enable=1
-no/false enable=0
state:
-present:创建仓库
-absent:删除仓库
## 创建nginx官方的yum源
[root@01] #ansible web_group -m yum_repository -a 'name=nginx-stable descript="nginx stable repo" baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=false enable=true'
#查看结果
[root@web01 ~]# vim /etc/yum.repos.d/nginx-stable.repo
[nginx-stable]
baseurl = http://nginx.org/packages/centos/$releasever/$basearch/
enabled = 1
gpgcheck = 0
name = nginx stable repo
## 使用file指定yum源的文件名
[root@m01 ~]# ansible web_group -m yum_repository -a 'name=nginx-stable description="nginx stable repo" baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=false enabled=true file=nginx'
## 删除仓库
[root@m01 ~]# ansible web_group -m yum_repository -a 'name=nginx-stable file=nginx state=absent'
## 追加仓库到同一个文件中
[root@m01 ~]# ansible web_group -m yum_repository -a 'name=nginx-mainline description="nginx mainline repo" baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=false enabled=true file=nginx'
## 删除指定的仓库名
[root@m01 ~]# ansible web_group -m yum_repository -a 'name=nginx-mainline file=nginx state=absent'
Ansible 用户管理模块
user模块
## 创建用户
useradd www -u 666 -g 666 -s /sbin/nologin -M
-c:描述信息
# user模块动作
name:用户名
comment:-c指定用户描述信息
uid:-u指定用户的uid
group: -g指定用户的组 gid
shell: -s指定用户登录的shell -s /sbin/nologin
append:-a 指定附加组并追加附加组
groups:-G指定用户附加组
state:
- absent 删除用户 userdel
- present 创建用户 useradd (默认)
remove:
- yes/True userdel -r 删除用户和用户相关的文件
- no/False 默认
ssh_key_bits:创建用户时,创建私钥,私钥的位数 2048
ssh_key_file:指定私钥的位置
create_home:
- yes/True 创建用户同时创建家目录 (默认)
- no/False 创建用户不创建家目录
## 创建www用户禁止登陆,不创建家目录
[root@m01 ~]# ansible web_group -m user -a 'name=www uid=666 group=666 shell=/sbin/nologin create_home=false'
group模块
## 管理用户组
## group模块动作:
name:指定组名字
gid:指定组id
state:
- present 创建组 groupadd 默认
- absent 删除组 groupdel
## 创建一个www组并且gid是666
[root@m01 ~]# ansible web_group -m group -a 'name=www gid=666'
Ansible定时任务模块
cron模块
## 管理定时任务
00 04 * * * /usr/bin/ntpdate time1.aliyun.com &>/dev/null
## cron模块动作:
name:定时任务注释信息
minute:分 00
hour:时 04
day:日
month:月
weekday:周
job:执行的任务 /bin/ls
state:
- present 创建定时任务 默认
- absent 删除定时任务
## 创建时间同步定时任务
[root@m01 ~]# ansible web_group -m cron -a 'name="time sync" minute=00 hour=04 job="/usr/bin/ntpdate time1.aliyun.com &>/dev/null"'
## 删除定时任务
[root@m01 ~]# ansible web_group -m cron -a 'name="time sync" state=absent'
Ansible磁盘挂载模块
mount模块
## 管理磁盘挂载
mount -t nfs 172.16.1.31:/data /code/wordpress/wp-content/uploads
## 动作:
path:挂载路径 /code/wordpress/wp-content/uploads
src:挂载源 172.16.1.31:/data
fstype:文件类型 -t nfs
state:
- present:只将挂载信息记录在/etc/fstab中(开机挂载)
- mounted:立刻挂载,并将配置写入/etc/fstab中
- unmounted:卸载设备,但是不会清除/etc/fstab中的内容
- absent:卸载设备,并清除/etc/fstab中的内容
挂载:mounted
卸载:absent
mount -o rw,remount /
opts: 指定挂载路径是否可读可写 rw,remount
## 挂载nfs
[root@m01 ~]# ansible web_group -m mount -a 'path=/code/wordpress/wp-content/uploads src=172.16.1.31:/data fstype=nfs state=mounted'
小练习:搭建rsync
## 准备rsync配置文件
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to oldboyedu backup!
path = /backup
# 1.安装rsync
ansible web01 -m yum -a 'name=rsync'
# 2.修改配置文件
ansible web01 -m copy -a 'src=/root/rsyncd.conf dest=/etc/'
# 3.创建密码文件
ansible web01 -m copy -a 'content="rsync_backup:123456" dest=/etc/rsync.pass mode=600'
# 4.创建 www用户
ansible web01 -m group -a 'name=www gid=666'
ansible web01 -m user -a 'name=www uid=666 group=666 shell=/sbin/nologin
create_home=false'
# 5.创建备份目录
ansible web01 -m file -a 'path=/backup owner=www group=www state=directory'
# 6.启动服务
ansible web01 -m service -a 'name=rsyncd state=started enabled=true'
# 7.客户端
ansible web02 -m yum -a 'name=rsync'
# 8.创建密码文件
ansible web02 -m copy -a 'content="123456" dest=/etc/rsync.pass mode=600'
小练习:部署rsync、nfs
1.部署rsync
2.部署nfs
3.部署httpd,将zuoye代码部署进去,挂载上传作业的目录
先决条件
# zuoye代码压缩包
# rsync配置文件
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to oldboyedu backup!
path = /backup
# httpd配置文件
User www
Group www
[root@m01 web]# ll
total 44
-rw-r--r-- 1 root root 11753 Jun 28 16:41 httpd.conf
-rw-r--r-- 1 root root 26868 Jun 28 16:52 kaoshi.tgz
-rw-r--r-- 1 root root 336 Jun 27 20:35 rsyncd.conf
# 主机清单
[root@m01 web]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8
[nfs_group]
nfs ansible_ssh_host=10.0.0.31
[backup_group]
backup ansible_ssh_host=10.0.0.41
# 推送公钥
#!/bin/bash
. /etc/init.d/functions
ls -l ~/.ssh/id_rsa &>/dev/null || ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
for n in 7 8 31 41 51;do
sshpass -p 1 ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@10.0.0.$n &>/dev/null && \
action "10.0.0.$n send public key " /bin/true || \
action "10.0.0.$n send public key " /bin/false
done
环境准备
主机名 | WanIP | LanIP | 角色 | 部署服务 |
---|---|---|---|---|
web01 | 10.0.0.7 | 172.16.1.7 | 作业网站 | httpd、php、nfs |
web02 | 10.0.0.8 | 172.16.1.8 | 作业网站 | httpd、php、nfs |
nfs | 10.0.0.31 | 172.16.1.31 | 共享存储 | nfs、rsync、inotify |
backup | 10.0.0.41 | 172.16.1.41 | 实时同步备份 | nfs、rsync |
m01 | 10.0.0.61 | 172.16.1.61 | ansible管理机 | ansible |
编写Ad-hoc
ansible all -m group -a 'name=www gid=666'
ansible all -m user -a 'name=www uid=666 group=666 shell=/sbin/nologin
create_home=false'
# 1.安装rsync,nfs
ansible rsyncd -m yum -a 'name=rsync,nfs-utils state=present'
# 2.rsync服务端操作
ansible backup -m copy -a 'src=/root/web/rsyncd.conf dest=/etc/'
ansible backup -m copy -a 'content=rsync_backup:123 dest=/etc/rsync.passwd mode=600'
ansible backup -m file -a 'path=/backup owner=www group=www mode=755 state=directory'
ansible backup -m service -a 'name=rsyncd state=started'
# 3.rsync客户端
ansible nfs -m copy -a 'content=123 dest=/etc/rsync.passwd mode=600'
# 4.nfs服务端
ansible nfs -m copy -a 'content="/data
172.16.1.0/24(rw,sync,anonuid=666,anongid=666,all_squash)" dest=/etc/exports'
ansible nfs -m file -a 'path=/data owner=www group=www mode=755 state=directory'
ansible nfs -m service -a 'name=nfs state=started'
# 5.web服务器操作
ansible web_group -m yum -a 'name=httpd,php state=present'
ansible web_group -m copy -a 'src=/root/web/httpd.conf dest=/etc/httpd/conf'
ansible web_group -m unarchive -a 'src=/root/web/kaoshi.tgz dest=/var/www/html
owner=www group=www'
ansible web_group -m file -a 'path=/var/www/html/user_data owner=www group=www
state=directory'
ansible web_group -m mount -a 'src=172.16.1.31:/data fstype=nfs
path=/var/www/html/user_data state=mounted'
ansible web_group -m service -a 'name=httpd state=started'
Comments | NOTHING