第二章·自动化运维工具-Ansible ad-hoc

Ansible ad-hoc

什么是ad-hoc?

ad-hoc简而言之就是“临时命令”,执行完即结束,并不会保存

ad-hoc模式的使用场景

比如在多台机器上查看某个进程是否启动,或拷贝指定文件到本地,等等

ad-hoc模式的命令使用

file

ad-hoc结果返回颜色

  1. 绿色:命令执行成功且无变化的颜色
  2. 黄色:命令执行成功,但是有变化(有更改)
  3. 红色:命令执行失败,报错msg
  4. 粉色|紫色: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'

山林不向四季起誓 荣枯随缘