ansible 批量管理服务
2021-12-16 本文已影响0人
小屁孩云熙
1. ansible 批量管理服务概述
- 是基于python语言开发的自动化软件工具
- 是基于SSH远程管理服务实现的远程主机批量管理
2. ansible 批量管理服务意义
- 提高工作效率
- 提高工作准确度
- 减少维护的成本
- 减少重复性工作
3. ansible 批量管理服务特点
-
管理端不需要启动服务程序
no server -
管理端不需要编写配置文件
/etc/ansible/ansible.cfg -
受控端不需要安全软件程序
libselinux-python被管理端 selinux 服务没有关闭 -- 影响 ansible 软件的管理
libselinux-python 让 selinux 开启的状态也可以使用 ansible 程序
-
受控端不需要启动服务程序
no agent -
服务程序管理操作模块众多
moudle -
利用剧本编写来实现自动化
playbook
4. ansible 批量管理服务功能
- 可以实现批量系统操作配置
- 可以实现批量软件服务部署
- 可以实现批量文件数据分发
- 可以实现批量系统信息收集
5. ansible 批量管理服务部署
5.1 安装软件
# 依赖 epel 源
yum install ansible -y
5.2 编写主机清单文件
[root@m01 ~]# rpm -ql ansible | grep -Ev "^/usr/(share|lib)"
/etc/ansible
/etc/ansible/ansible.cfg -- ansible 服务配置文件
/etc/ansible/hosts -- 主机清单文件
/etc/ansible/roles -- 角色目录
……
[root@m01 ~]# vim /etc/ansible/hosts
[root@m01 ~]# tail -4 /etc/ansible/hosts
# 定义可以管理的主机
172.16.1.41
172.16.1.31
172.16.1.7
5.3 测试管理多个主机
# 测试命令
ansible all -a "hostname"
# 测试结果
[root@m01 ~]# ansible all -a "hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01
172.16.1.7 | CHANGED | rc=0 >>
web01
172.16.1.41 | CHANGED | rc=0 >>
backup
6. ansible 服务架构信息
-
主机清单配置
-
软件模块信息
-
基于秘钥连接主机
-
主机需要关闭 selinux
-
软件剧本功能
7. ansible 软件模块使用
ansible 官方网站 : https://docs.ansible.com/
7.1 模块的应用
ansible 主机名称/主机组名称/主机地址信息/all -m(指定应用模块信息) 模块名称 -a(指定动作信息) "执行动作"
7.2 command 模块 (默认模块)
command - Execute commands on targets
# 在目标上执行命令
- 常用参数
参数 | 功能 |
---|---|
chdir | 切换至指定目录,再执行后续操作 |
creates | 若指定文件存在,不执行后续操作。否则,执行后续操作 |
removes | 若指定文件存在,执行后续操作。否则,不执行后续操作 |
7.2.1 简单应用
[root@m01 ~]# ansible 172.16.1.31 -m command -a "hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01
# 因为 command 模块是默认模块,因此上述命令可写为:
[root@m01 ~]# ansible 172.16.1.31 -a "hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01
7.2.2 扩展应用
7.2.2.1 chdir 参数应用
chdir 参数功能:切换到指定目录,再执行后续操作
-
管理端通过 command 模块,不使用任何参数 在 被管理端创建文件
不使用任何参数情况下,被管理端创建文件均保存在用户家目录下
# 01. 在被管理端 root 用户家目录下创建 data.txt 文件
[root@m01 ~]# ansible 172.16.1.31 -m command -a "touch data.txt"
[WARNING]: Consider using the file module with state=touch rather than running 'touch'. If you need to use command because file is insufficient you can add 'warn: false' to this command task or set
'command_warnings=False' in ansible.cfg to get rid of this message.
172.16.1.31 | CHANGED | rc=0 >>
# 02. 被管理端检查创建情况
[root@nfs01 ~]# ll
total 4
-rw-------. 1 root root 1569 Oct 29 01:02 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 Dec 6 12:20 data.txt
- 管理端通过 command 模块,使用 chdir 参数,在被管理端指定目录下创建文件
01. 在被管理端 /tmp 目录下 创建 data.txt 文件
[root@m01 ~]# ansible 172.16.1.31 -m command -a "chdir=/tmp touch data.txt"
[WARNING]: Consider using the file module with state=touch rather than running 'touch'. If you need to use command because file is insufficient you can add 'warn: false' to this command task or set
'command_warnings=False' in ansible.cfg to get rid of this message.
172.16.1.31 | CHANGED | rc=0 >>
# 02. 被管理端检查创建情况
[root@nfs01 ~]# ll /tmp/
total 0
-rw-r--r-- 1 root root 0 Dec 6 12:23 data.txt
7.2.2.2 creates 参数应用
creates 参数功能:若指定文件存在,不执行后续操作。相反,若指定文件不存在,执行后续操作
- 指定文件存在
# 01. 被管理端 /tmp 目录下文件情况
[root@nfs01 ~]# ll /tmp/
total 0
-rw-r--r-- 1 root root 0 Dec 6 12:38 data.txt
# 02. 管理端执行操作 - 如果被管理端存在文件 /tmp/data.txt,则不会创建文件 yunxuan.txt
[root@m01 ~]# ansible 172.16.1.31 -m command -a "creates=/tmp/data.txt chdir=/tmp touch yunxuan.txt"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp/data.txt exists
# 03. 被管理端检查结果
[root@nfs01 ~]# ll /tmp/
total 0
-rw-r--r-- 1 root root 0 Dec 6 12:38 data.txt
- 指定文件不存在情况
# 01. 被管理端 /tmp 目录下文件情况
[root@nfs01 ~]# ll /tmp/
total 0
# 02. 管理端执行操作 - 如果被管理端存在文件 /tmp/data.txt,则不会创建文件 yunxuan.txt
[root@m01 ~]# ansible 172.16.1.31 -m command -a "creates=/tmp/data.txt chdir=/tmp touch yunxuan.txt"
[WARNING]: Consider using the file module with state=touch rather than running 'touch'. If you need to use command because file is insufficient you can add 'warn: false'
to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
172.16.1.31 | CHANGED | rc=0 >>
# 03. 被管理端检查结果
[root@nfs01 ~]# ll /tmp/
total 0
-rw-r--r-- 1 root root 0 Dec 8 22:09 yunxuan.txt
7.2.2.3 removes 参数应用
removes 参数功能:若指定文件存在,则执行后续操作。否则,不执行后续操作
- 指定文件存在情况
# 01. 被管理端文件情况
[root@nfs01 ~]# ll /tmp/
total 0
-rw-r--r-- 1 root root 0 Dec 6 12:38 data.txt
# 02. 管理端操作 - 若被管理端文件 /tmp/data.txt 存在,则创建文件 yunxuan.txt
[root@m01 ~]# ansible 172.16.1.31 -m command -a "removes=/tmp/data.txt chdir=/tmp touch yunxuan.txt"
[WARNING]: Consider using the file module with state=touch rather than running 'touch'. If you need to use command because file is insufficient you can add 'warn: false' to this command task or set
'command_warnings=False' in ansible.cfg to get rid of this message.
172.16.1.31 | CHANGED | rc=0 >>
# 03. 被管理端检查结果
[root@nfs01 ~]# ll /tmp/
total 0
-rw-r--r-- 1 root root 0 Dec 6 12:38 data.txt
-rw-r--r-- 1 root root 0 Dec 6 12:57 yunxuan.txt
- 指定文件不存在情况
# 01. 被管理端文件情况
[root@nfs01 ~]# ll /tmp/
total 0
# 02. 管理端操作 - 若被管理端文件 /tmp/data.txt 不存在,则不创建文件 yunxuan.txt
[root@m01 ~]# ansible 172.16.1.31 -m command -a "removes=/tmp/data.txt chdir=/tmp touch yunxuan.txt"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp/data.txt does not exist
03. 被管理端检查结果
[root@nfs01 ~]# ll /tmp/
total 0
7.2.3 注意事项
command 模块针对以下特殊符号无法识别:'>' '<' '|' ';' '&'
7.3 shell 模块 (万能模块)
shell - Execute shell commands on targets
在目标上执行shell命令
- 常用参数
参数 | 功能 |
---|---|
chdir | 切换至指定目录,再执行后续操作 |
creates | 若指定文件存在,不执行后续操作。否则,执行后续操作 |
removes | 若指定文件存在,执行后续操作。否则,不执行后续操作 |
7.3.1 简单应用
[root@m01 ~]# ansible all -m shell -a "hostname"
172.16.1.7 | CHANGED | rc=0 >>
web01
172.16.1.31 | CHANGED | rc=0 >>
nfs01
172.16.1.41 | CHANGED | rc=0 >>
backup
7.3.2 扩展应用
7.3.2.1 chdir 参数应用
chdir 参数功能:切换到指定目录后,再执行后续命令 (与command模块中 chdir参数功能一致)
7.3.2.2 creates 参数应用
creates 参数功能:若指定文件存在,不执行后续命令,否则,执行后续命令 (与command模块中 creates参数功能一致)
7.3.2.3 removes 参数应用
removes 参数功能:若指定文件存在,则执行后续命令,否则,不执行后续命令 (与command模块中 removes参数功能一致)
7.3.3 利用 shell 模块运行脚本
- 管理端编写脚本
[root@m01 scripts]# cat test.sh
#!/bin/bash
yum install htop -y
- 将脚本发送至远程主机
# 01. 发送脚本
[root@m01 scripts]# scp -rp /server/scripts/test.sh root@172.16.1.31:/tmp
test.sh 100% 33 24.3KB/s 00:00
# 02. 远程主机查看
[root@nfs01 ~]# ll /tmp/
total 4
-rw-r--r-- 1 root root 33 Dec 6 16:16 test.sh
- 将脚本权限进行修改,添加执行权限
[root@nfs01 ~]# chmod u+x /tmp/test.sh
[root@nfs01 ~]# ll /tmp/
total 4
-rwxr--r-- 1 root root 33 Dec 6 16:16 test.sh
- 使用 ansible 命令远程执行脚本
# 01. 被管理端检查是否安装软件 htop
[root@nfs01 ~]# rpm -qa|grep htop
[root@nfs01 ~]#
# 02. 管理端命令操作
[root@m01 scripts]# ansible 172.16.1.31 -m shell -a "/tmp/test.sh"
172.16.1.31 | CHANGED | rc=0 >>
……
# 03. 被管理端检查结果
[root@nfs01 ~]# rpm -qa|grep htop
htop-2.2.0-3.el7.x86_64
7.4 script 模块 (脚本模块)
script - Runs a local script on a remote node after transferring it
传输本地脚本后在远程节点上运行该脚本
- 常用参数
参数 | 功能 |
---|---|
chdir | 切换至指定目录,再执行后续操作 |
creates | 若指定文件存在,不执行后续操作。否则,执行后续操作 |
removes | 若指定文件存在,执行后续操作。否则,不执行后续操作 |
7.4.1 简单应用 - 利用 script 模块运行脚本
- 编写脚本
[root@m01 scripts]# cat test.sh
#!/bin/bash
yum install htop -y
- 执行命令
# 01. 被管理端检查 htop 软件是否安装
[root@nfs01 ~]# rpm -qa|grep htop
[root@nfs01 ~]#
# 02. 管理端使用 script 模块,执行脚本
[root@m01 scripts]# ansible 172.16.1.31 -m script -a "/server/scripts/test.sh"
172.16.1.31 | CHANGED => {
"changed": true,
……
- 结果检查
[root@nfs01 tmp]# rpm -qa|grep htop
htop-2.2.0-3.el7.x86_64
7.5 copy 模块 (管理端 ----> 被管理端)
copy - Copy files to remote locations
将文件复制到远程位置
- 常用参数
参数 | 功能 |
---|---|
src | 指定源文件或目录 |
dest | 指定目标目录或重命名文件 |
owner | 设置属主信息 |
group | 设置属组信息 |
mode | 设置目录或文件权限 |
content | 编辑文件内容 |
backup | 默认参数为 no,参数为 yes 时,若文件内容不铜,会在被管理端本地备份本文件 |
remote_src | 默认为 no,将管理端指定目录下的文件分发到被管理端指定目录。若参数为 yes 时,会在被管理端指定目录下的文件复制到指定目录下,相当于被管理端文件复制。 |
directory_mode | |
local_follow |
7.5.1 基本用法
# 01. 将管理端 /etc/hosts 文件分发至 被管理端主机的 /tmp 目录下 (可重命名)
[root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=/etc/hosts dest=/tmp"
172.16.1.31 | CHANGED => { # -- 表示对那台主机仅从操作
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true, # -- 是否对主机信息进行改变
"checksum": "dc5a7a89333b64ec3f94f4f74c113a2b870b81c2", # -- 生成一个文件的校验码
"dest": "/tmp/hosts", # -- 显示复制后目标路径信息
"gid": 0, # -- 显示复制后文件 gid 信息
"group": "root", # -- 显示复制后文件属组信息
"md5sum": "16b577fa13a9a42d92f4ce84c4a4cf5c", # -- 生成一个文件校验码
"mode": "0644", # -- 显示复制后文件权限信息
"owner": "root", # -- 显示复制后文件属主信息
"size": 320, # -- 显示文件的大小信息
"src": "/root/.ansible/tmp/ansible-tmp-1638782746.45-10986-196121942781723/source",
"state": "file", # -- 显示文件的类型信息
"uid": 0 # -- 显示文件的 uid 信息
}
# 02. 被管理端查看结果
[root@nfs01 tmp]# ll
total 4
-rw-r--r-- 1 root root 320 Dec 6 17:25 hosts
7.5.2 扩展用法
7.5.2.1 传输文件时,修改文件的属主和属组信息
# 01. 将管理端 /etc/hosts 文件分发至被管理端主机的 /tmp 目录下,并修改属主和属组信息
[root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=/etc/hosts dest=/tmp/ owner=yunxuan group=yunxuan"
172.16.1.31 | CHANGED => {
……
# 02. 被管理端查看结果
[root@nfs01 tmp]# ll
total 4
-rw-r--r-- 1 yunxuan yunxuan 320 Dec 6 17:40 hosts
7.5.2.2 传输文件时,修改文件的权限信息
# 01. 将管理端 /etc/hosts 文件分发至被管理端主机的 /tmp 目录下,并修改文件权限信息
[root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=/etc/hosts dest=/tmp/ mode=600"
172.16.1.31 | CHANGED => {
……
# 02. 查看结果
[root@nfs01 tmp]# ll
total 4
-rw------- 1 root root 320 Dec 6 17:44 hosts
7.5.2.3 传输文件时,对远程主机源文件进行备份(如果文件内容有变动才会生成备份文件)
# 01. 将管理端 /etc/hosts 文件分发至被管理端主机的 /tmp 目录下,并修改文件属主、属组和权限信息,并对源文件备份
[root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=/etc/hosts dest=/tmp/ owner=yunxuan group=yunxuan mode=644 backup=yes"
172.16.1.31 | CHANGED => {
……
# 02. 查看结果
[root@nfs01 tmp]# ll
total 8
-rw-r--r-- 1 yunxuan yunxuan 324 Dec 6 17:55 hosts
-rw------- 1 yunxuan yunxuan 320 Dec 6 17:44 hosts.13559.2021-12-06@17:55:16~
7.5.2.4 传输一个文件并直接编辑文件的信息
# 01. 在管理端 直接编辑文件内容,保存在受控端服务器 /tmp/test.txt 文件中
[root@m01 scripts]# ansible 172.16.1.31 -m copy -a "content='123456' dest=/tmp/test.txt"
172.16.1.31 | CHANGED => {
……
# 查看结果
[root@nfs01 tmp]# ll
total 12
-rw-r--r-- 1 yunxuan yunxuan 324 Dec 6 17:55 hosts
-rw------- 1 yunxuan yunxuan 320 Dec 6 17:44 hosts.13559.2021-12-06@17:55:16~
-rw-r--r-- 1 root root 6 Dec 6 18:00 test.txt
[root@nfs01 tmp]# cat test.txt
123456[root@nfs01 tmp]#
7.5.2.5 remote_src 参数案例
- 环境部署
# 01. 管理端
[root@m01 scripts]# cd /tmp/
[root@m01 tmp]# ll
total 0
[root@m01 tmp]# echo "1234" > data_test.txt
[root@m01 tmp]# cat data_test.txt
1234
# 02. 被管理端
[root@nfs01 tmp]# echo "5678" > data_test.txt
[root@nfs01 tmp]# cat data_test.txt
5678
- remote_src = no (默认参数,远程传输数据)
# 01. 管理端
[root@m01 tmp]# ansible 172.16.1.31 -m copy -a "src=/tmp/data_test.txt dest=/data"
172.16.1.31 | CHANGED => {
……
# 02. 被管理端查看结果
[root@nfs01 data]# ll
total 4
-rw-r--r-- 1 root root 5 Dec 6 18:17 data_test.txt
[root@nfs01 data]# cat data_test.txt
1234
# 03. 结果:将管理端的 文件 传输到 被管理端对应目录(远程传输数据)
- remote_src = yes
# 01. 管理端
[root@m01 tmp]# ansible 172.16.1.31 -m copy -a "src=/tmp/data_test.txt dest=/data remote_src=yes"
172.16.1.31 | CHANGED => {
……
# 02. 被管理端查看结果
[root@nfs01 data]# ll
total 4
-rw-r--r-- 1 root root 5 Dec 6 18:16 data_test.txt
[root@nfs01 data]# cat data_test.txt
5678
# 03. 总结:将被管理端 本地的 /tmp/data_test.txt 复制到 /data 目录下
7.5.3 远程传输目录
# 01. 环境准备
[root@m01 ~]# mkdir /data
[root@m01 ~]# mkdir /data/data{01..03} -p
[root@m01 ~]# touch /data/data01/{01..03}.txt
[root@m01 ~]# tree /data
/data
├── data01
│ ├── 01.txt
│ ├── 02.txt
│ └── 03.txt
├── data02
└── data03
3 directories, 3 files
# 02_1. 管理端数据传输(src=/data)
[root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=/data dest=/data"
172.16.1.31 | CHANGED => {
"changed": true,
"dest": "/data/",
"src": "/data"
}
# 02_2. 管理端数据传输(src=/data/)
[root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=/data/ dest=/data"
172.16.1.31 | CHANGED => {
"changed": true,
"dest": "/data/",
"src": "/data/"
}
# 03_1. 查看结果(对应02_1)
[root@nfs01 data]# ll
total 0
drwxr-xr-x 5 root root 48 Dec 6 18:25 data
[root@nfs01 data]# tree
.
└── data
├── data01
│ ├── 01.txt
│ ├── 02.txt
│ └── 03.txt
├── data02
└── data03
4 directories, 3 files
# 03_2. 查看结果(对应02_2)
[root@nfs01 data]# ll
total 0
drwxr-xr-x 2 root root 48 Dec 6 18:27 data01
drwxr-xr-x 2 root root 6 Dec 6 18:27 data02
drwxr-xr-x 2 root root 6 Dec 6 18:27 data03
[root@nfs01 data]# tree ./
./
├── data01
│ ├── 01.txt
│ ├── 02.txt
│ └── 03.txt
├── data02
└── data03
3 directories, 3 files
7.6 fetch 模块 (被管理端 ----> 管理端)
fetch - Fetch files from remote nodes
从远程节点获取文件
- 常用参数
参数 | 功能 |
---|---|
src | 指定被在管理端主机上欲获取的文件或目录 |
dest | 指定管理端存放的目录或重命名的文件名 |
7.6.1 简单应用
# 需求:将被管理端主机 /tmp/data_test.txt 文件拉取到管理端 /tmp 目录下
# 01. 被管理端情况
[root@nfs01 ~]# ll /tmp/
total 4
-rw------- 1 yunxuan yunxuan 5 Dec 6 18:16 data_test.txt
# 02. 管理端命令操作
[root@m01 ~]# ansible 172.16.1.31 -m fetch -a "src=/tmp/data_test.txt dest=/tmp/"
172.16.1.31 | CHANGED => {
"changed": true,
"checksum": "62cd6693a213782f2d387a4284034a47a623d4bc",
"dest": "/tmp/172.16.1.31/tmp/data_test.txt",
"md5sum": "53ac4bc41ee4ec77888ed4aa50677247",
"remote_checksum": "62cd6693a213782f2d387a4284034a47a623d4bc",
"remote_md5sum": null
}
# 03. 管理端查看结果 (防止多台主机操作,文件覆盖)
[root@m01 ~]# ll /tmp/
total 0
drwxr-xr-x 3 root root 17 Dec 8 15:48 172.16.1.31
[root@m01 ~]# tree /tmp/
/tmp/
└── 172.16.1.31
└── tmp
└── data_test.txt
2 directories, 1 file
7.7 file 模块
file - Manage files and file properties
管理文件和文件属性
- 常用参数
参数 | 功能 |
---|---|
src | 指定创建软硬连接的源文件 |
path(dest) | 被管理的文件或路径 |
owner | 设置文件或目录属主信息 |
group | 设置文件或目录属组信息 |
mode | 设置文件或目录权限信息 |
recurse | 默认为 no ,设置为 yes 时,递归修改目录和文件权限 |
state | absent(删除)、directory(创建目录)、file、hard(创建硬链接文件)、link(创建如那链接文件)、touch(创建文件) |
7.7.1 基本用法
# 01. 被管理端某文件属性
[root@nfs01 ~]# ll /tmp/
total 0
-rw-r--r-- 1 root root 0 Dec 8 22:25 yunxuan.txt
# 02. 管理端对 被管理端 /tmp/yunxuan.txt 文件属性进行修改
[root@m01 ~]# ansible 172.16.1.31 -m file -a "path(dest)=/tmp/yunxuan.txt owner=yunxuan group=yunxuan mode=600"
172.16.1.31 | CHANGED => {
……
# 03. 被管理端查看结果
[root@nfs01 ~]# ll /tmp/
total 0
-rw------- 1 yunxuan yunxuan 0 Dec 8 22:25 yunxuan.txt
7.7.2 扩展用法
-- 参数 state 及可选项
absent -- 删除数据信息
directory -- 创建一个目录信息
file -- 默认参数 检查创建的数据信息是否存在, 绿色存在 红色不存在
hard -- 创建一个硬链接文件
link -- 创建一个软链接文件
touch -- 创建一个文件信息
7.7.2.1 利用模块创建数据信息(文件、目录或链接文件)
- 创建目录(单级目录和多级目录)
# 01. 管理端 在被管理端主机上创建 /data01 目录
[root@m01 ~]# ansible 172.16.1.31 -m file -a "path(dest)=/data01 state=directory"
172.16.1.31 | CHANGED => {
……
# 02. 被管理端 查看结果
[root@nfs01 data]# ll -d /data01
drwxr-xr-x 2 root root 6 Dec 6 18:40 /data01
- 创建文件
# 01. 管理端 在被管理端主机上 创建文件 /data01/test.txt
[root@m01 ~]# ansible 172.16.1.31 -m file -a "path(dest)=/data01/test.txt state=touch"
172.16.1.31 | CHANGED => {
……
# 02. 被管理端 查看结果
[root@nfs01 data]# tree /data01
/data01
└── test.txt
0 directories, 1 file
[root@nfs01 data]# ll /data01/
total 0
-rw-r--r-- 1 root root 0 Dec 6 18:42 test.txt
- 创建硬链接文件
# 01. 管理端 在被管理端主机上 为 文件 /data01/test.txt 创建硬链接文件
[root@m01 ~]# ansible 172.16.1.31 -m file -a "src=/data01/test.txt path(dest)=/data01/test_hard.txt state=hard"
172.16.1.31 | CHANGED => {
……
# 02. 被管理端 查看结果
[root@nfs01 data]# ll -i /data01
total 0
294 -rw-r--r-- 2 root root 0 Dec 6 18:42 test_hard.txt
294 -rw-r--r-- 2 root root 0 Dec 6 18:42 test.txt
- 创建软链接文件
# 01. 管理端 被管理端主机上 为 文件 /data01/test.txt 创建软链接文件
[root@m01 ~]# ansible 172.16.1.31 -m file -a "src=/data01/test.txt path(dest)=/data01/test_link.txt state=link"
172.16.1.31 | CHANGED => {
……
# 02. 被管理端 查看结果
[root@nfs01 data]# ll /data01
total 0
-rw-r--r-- 2 root root 0 Dec 6 18:42 test_hard.txt
lrwxrwxrwx 1 root root 16 Dec 6 18:47 test_link.txt -> /data01/test.txt
-rw-r--r-- 2 root root 0 Dec 6 18:42 test.txt
7.7.2.2 利用模块删除数据信息
- 删除文件
# 01. 管理端
[root@m01 ~]# ansible 172.16.1.31 -m file -a "path(dest)=/data01/test.txt state=absent"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"path": "/data01/test.txt",
"state": "absent"
}
# 02. 被管理端 查看结果
[root@nfs01 data]# ll /data01
total 0
-rw-r--r-- 1 root root 0 Dec 6 18:42 test_hard.txt
lrwxrwxrwx 1 root root 16 Dec 6 18:47 test_link.txt -> /data01/test.txt
- 删除目录
# 01. 管理端
[root@m01 ~]# ansible 172.16.1.31 -m file -a "path(dest)=/data01 state=absent"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"path": "/data01",
"state": "absent"
}
# 02. 被管理端 查看结果
[root@nfs01 data]# ll /data01
ls: cannot access /data01: No such file or directory
7.7.2.3 递归修改目录及文件权限(recurse参数)
# 环境部署 (受控端)
[root@nfs01 ~]# ll /data01
total 0
drwxr-xr-x 2 root root 6 Dec 6 19:02 data02
-rw-r--r-- 1 root root 0 Dec 6 19:02 test01.txt
-rw-r--r-- 1 root root 0 Dec 6 19:02 test02.txt
-rw-r--r-- 1 root root 0 Dec 6 19:02 test03.txt
-rw-r--r-- 1 root root 0 Dec 6 19:02 test04.txt
-rw-r--r-- 1 root root 0 Dec 6 19:02 test05.txt
[root@nfs01 ~]# ll /data01 -d
drwxr-xr-x 3 root root 110 Dec 6 19:02 /data01
- recurse 参数 - no
# 01. 管理端
[root@m01 ~]# ansible 172.16.1.31 -m file -a "path(dest)=/data01 owner=yunxuan mode=777"
172.16.1.31 | CHANGED => {
……
# 02. 被管理端 查看结果
[root@nfs01 ~]# ll /data01 -d
drwxrwxrwx 3 yunxuan root 110 Dec 6 19:02 /data01
[root@nfs01 ~]# ll /data01
total 0
drwxr-xr-x 2 root root 6 Dec 6 19:02 data02
-rw-r--r-- 1 root root 0 Dec 6 19:02 test01.txt
-rw-r--r-- 1 root root 0 Dec 6 19:02 test02.txt
-rw-r--r-- 1 root root 0 Dec 6 19:02 test03.txt
-rw-r--r-- 1 root root 0 Dec 6 19:02 test04.txt
-rw-r--r-- 1 root root 0 Dec 6 19:02 test05.txt
- recurse 参数 - yes
# 01. 管理端
[root@m01 ~]# ansible 172.16.1.31 -m file -a "path(dest)=/data01 owner=yunxuan mode=777 recurse=yes"
172.16.1.31 | CHANGED => {
……
# 02. 被管理端 查看结果
[root@nfs01 ~]# ll /data01 -d
drwxrwxrwx 3 yunxuan root 110 Dec 6 19:02 /data01
[root@nfs01 ~]# ll /data01
total 0
drwxrwxrwx 2 yunxuan root 6 Dec 6 19:02 data02
-rwxrwxrwx 1 yunxuan root 0 Dec 6 19:02 test01.txt
-rwxrwxrwx 1 yunxuan root 0 Dec 6 19:02 test02.txt
-rwxrwxrwx 1 yunxuan root 0 Dec 6 19:02 test03.txt
-rwxrwxrwx 1 yunxuan root 0 Dec 6 19:02 test04.txt
-rwxrwxrwx 1 yunxuan root 0 Dec 6 19:02 test05.txt
7.8 yum 模块
yum - Manages packages with the 'yum' package manager
用yum包管理器管理包
- 常用参数
参数 | 功能 |
---|---|
name | 指定软件名称 |
state | 安装软件(installed、latest、present) 卸载软件(absent、removed) |
7.8.1 基本用法
# 需求: 管理端为 被管理端 安装软件 htop
# 01. 受控端检查是否安装
[root@nfs01 ~]# rpm -qa|grep htop
[root@nfs01 ~]#
# 02. 管理端执行命令
[root@m01 ~]# ansible 172.16.1.31 -m yum -a "name=htop state=installed"
172.16.1.31 | CHANGED => {
……
# 03. 被管理端检查结果
[root@nfs01 ~]# rpm -qa|grep htop
htop-2.2.0-3.el7.x86_64
7.9 service 模块
service - Manage services
管理服务
- 常用参数
参数 | 功能 |
---|---|
name | 指定管理的服务名称 |
state | started(启动)、restarted(重启)、stopped(停止)、reloaded(重载) |
enabled | yes(开机自启动)、no(禁止开机自启动) |
7.9.1 基本用法
# 需求:管理端 停止 被管理端的 nfs 服务
# 01. 被管理端检查 nfs服务 当前运行状态
[root@nfs01 ~]# systemctl status nfs
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: active (exited) since Wed 2021-12-08 23:43:32 CST; 6h left
Process: 6853 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi (code=exited, status=0/SUCCESS)
Process: 6811 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
Process: 6806 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Main PID: 6811 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/nfs-server.service
Dec 08 23:43:32 nfs01 systemd[1]: Starting NFS server and services...
Dec 08 23:43:32 nfs01 systemd[1]: Started NFS server and services.
# 02. 管理端 停止服务,并设置开机 不 自启动
[root@m01 ~]# ansible 172.16.1.31 -m service -a "name=nfs state=stopped enabled=no"
172.16.1.31 | CHANGED => {
……
# 03. 被管理端检查 结果
[root@nfs01 ~]# systemctl status nfs
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: inactive (dead) since Wed 2021-12-08 16:53:57 CST; 59s ago
Process: 7818 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
Process: 7814 ExecStopPost=/usr/sbin/exportfs -au (code=exited, status=0/SUCCESS)
Process: 7813 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
Main PID: 7655 (code=exited, status=0/SUCCESS)
Dec 08 16:53:37 nfs01 systemd[1]: Starting NFS server and services...
Dec 08 16:53:37 nfs01 systemd[1]: Started NFS server and services.
Dec 08 16:53:57 nfs01 systemd[1]: Stopping NFS server and services...
Dec 08 16:53:57 nfs01 systemd[1]: Stopped NFS server and services.
7.10 cron 模块
cron - Manage cron.d and crontab entries
管理定时任务
- 常用参数
参数 | 功能 |
---|---|
minute | 设置分钟信息 |
hour | 设置小时信息 |
day | 设置日期信息 |
month | 设置月份信息 |
weekday | 设置周信息 |
job | 设置定时任务信息 |
name | 设置定时任务描述信息(必须选项) |
state | absent(删除定时任务) |
disbaled | yes (注释 定时任务)、no (取消注释) |
backup | yes (修改前备份,备份的位置由这个模块在' backup_file'变量中返回) 、 no (不备份) |
7.10.1 基本用法
# 需求: 在被管理端服务器上 设置 每天凌晨2点,进行一次时间同步
# 01. 受控端定时任务 原配置
[root@nfs01 ~]# crontab -l
# crond-id-001:time sync by yunxuan at 2021-11-10
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
# crond_id-002:backup data by yunxuan at 2021-11-23
#0 0 * * * /bin/bash /server/scripts/backup.sh > /dev/null 2>&1
# 02. 管理端 - 设置 被管理端服务器的定时任务
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name='Time sync by ansible cron module' minute=0 hour=2 job='/usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1'"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"Time sync by ansible cron module"
]
}
# 03. 被管理端检查结果
[root@nfs01 ~]# crontab -l
# crond-id-001:time sync by yunxuan at 2021-11-10
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
# crond_id-002:backup data by yunxuan at 2021-11-23
#0 0 * * * /bin/bash /server/scripts/backup.sh > /dev/null 2>&1
#Ansible: Time sync by ansible cron module
0 2 * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
7.10.2 扩展用法
7.10.2.1 给定时任务设置描述信息(基本用法中已经演示)
注意:如果设置描述信息,多次执行不会出现重复的定时任务。如果没有描述信息,多次执行,受控端会出现多个定时任务。
7.10.2.2 删除指定 定时任务
注意:ansible 无法删除自行手动设置的定时任务,只能删除 ansible 自己设置的定时任务
# 需求: 删除 凌晨2点 时间同步 定时任务
# 01. 查看被管理端 服务器 定时任务情况
[root@nfs01 ~]# crontab -l
# crond-id-001:time sync by yunxuan at 2021-11-10
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
# crond_id-002:backup data by yunxuan at 2021-11-23
#0 0 * * * /bin/bash /server/scripts/backup.sh > /dev/null 2>&1
#Ansible: Time sync by ansible cron module
0 2 * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
# 02. 管理端 进行删除
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name='Time sync by ansible cron module' state=absent"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": []
}
# 03. 被管理端检查结果
[root@nfs01 ~]# crontab -l
# crond-id-001:time sync by yunxuan at 2021-11-10
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
# crond_id-002:backup data by yunxuan at 2021-11-23
#0 0 * * * /bin/bash /server/scripts/backup.sh > /dev/null 2>&1
7.10.2.3 注释 与 取消注释 定时任务
- 注释 定时任务
# 需求: 注释 被管理端服务器 每天凌晨2点 时间同步 定时任务
# 01. 被管理端服务器 定时任务检查
[root@nfs01 ~]# crontab -l
# crond-id-001:time sync by yunxuan at 2021-11-10
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
# crond_id-002:backup data by yunxuan at 2021-11-23
#0 0 * * * /bin/bash /server/scripts/backup.sh > /dev/null 2>&1
#Ansible: Time sync by ansible cron module
0 2 * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
# 02. 管理端 执行注释操作
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name='Time sync by ansible cron module' minute=0 hour=2 job='/usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1' disabled=yes"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"Time sync by ansible cron module"
]
}
# 03. 被管理端检查结果
[root@nfs01 ~]# crontab -l
# crond-id-001:time sync by yunxuan at 2021-11-10
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
# crond_id-002:backup data by yunxuan at 2021-11-23
#0 0 * * * /bin/bash /server/scripts/backup.sh > /dev/null 2>&1
#Ansible: Time sync by ansible cron module
#0 2 * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
- 取消注释 定时任务
# 取消注释
# 01. 管理端
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name='Time sync by ansible cron module' minute=0 hour=2 job='/usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1' disabled=no"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"Time sync by ansible cron module"
]
}
# 02. 被管理端 检查结果
[root@nfs01 ~]# crontab -l
# crond-id-001:time sync by yunxuan at 2021-11-10
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
# crond_id-002:backup data by yunxuan at 2021-11-23
#0 0 * * * /bin/bash /server/scripts/backup.sh > /dev/null 2>&1
#Ansible: Time sync by ansible cron module
0 2 * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
7.10.2.4 设置定时任务时,备份源文件
# 01. 被管理端 定时任务情况
[root@nfs01 ~]# crontab -l
# crond-id-001:time sync by yunxuan at 2021-11-10
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
# crond_id-002:backup data by yunxuan at 2021-11-23
#0 0 * * * /bin/bash /server/scripts/backup.sh > /dev/null 2>&1
# 02. 管理端 - 为被管理端 设置定时任务,并备份源文件
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name='Time sync by ansible cron module' minute=0 hour=2 job='/usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1' backup=yes"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"backup_file": "/tmp/crontab30g9Jn",
"changed": true,
"envs": [],
"jobs": [
"Time sync by ansible cron module"
]
}
# 03. 被管理端 检查定时任务 情况
[root@nfs01 ~]# crontab -l
# crond-id-001:time sync by yunxuan at 2021-11-10
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
# crond_id-002:backup data by yunxuan at 2021-11-23
#0 0 * * * /bin/bash /server/scripts/backup.sh > /dev/null 2>&1
#Ansible: Time sync by ansible cron module
0 2 * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
# 04. 被管理端 检查备份文件
[root@nfs01 ~]# cat /tmp/crontab30g9Jn
# crond-id-001:time sync by yunxuan at 2021-11-10
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1
# crond_id-002:backup data by yunxuan at 2021-11-23
#0 0 * * * /bin/bash /server/scripts/backup.sh > /dev/null 2>&1
7.11 mount 模块
mount - Control active and configured mount points
控制活动和配置的挂载点
- 常用参数
参数 | 功能 |
---|---|
src | 需要挂载的存储设备或文件信息 |
path | 指定挂载点 |
fstype | 指定挂载时的文件系统类型 |
state | 挂载 (present / mounted) 、 卸载 (absent / unmounted) |
7.11.1 基本应用
7.11.1.1 利用 present 参数 将 主机31 的 /data 目录挂载在 主机7 的 /mnt 目录下
# 01. 管理端执行操作
[root@m01 ~]# ansible 172.16.1.7 -m mount -a "src=172.16.1.31:/data fstype=nfs path=/mnt state=present"
172.16.1.7 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dump": "0",
"fstab": "/etc/fstab",
"fstype": "nfs",
"name": "/mnt",
"opts": "defaults",
"passno": "0",
"src": "172.16.1.31:/data"
}
# 02. 主机7 上 查看结果
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 28G 1.7G 26G 7% /
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.6M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 473M 125M 349M 27% /boot
tmpfs 98M 0 98M 0% /run/user/0
[root@web01 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Oct 29 00:56:11 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=0c216d60-d304-49af-831f-cb92577e2dc1 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
172.16.1.31:/data /mnt nfs defaults 0 0
# 总结:present 参数,不会立即挂载,修改 fstab 文件实现开机自动挂载
7.11.1.2 利用 mounted 参数 将 主机 31 的 /data 目录挂载在 主机7 的 /mnt 目录下
# 01. 管理端 执行操作
[root@m01 ~]# ansible 172.16.1.7 -m mount -a "src=172.16.1.31:/data fstype=nfs path=/mnt state=mounted"
172.16.1.7 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dump": "0",
"fstab": "/etc/fstab",
"fstype": "nfs",
"name": "/mnt",
"opts": "defaults",
"passno": "0",
"src": "172.16.1.31:/data"
}
# 02. 主机7 上查看结果
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 28G 1.7G 26G 7% /
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.6M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 473M 125M 349M 27% /boot
tmpfs 98M 0 98M 0% /run/user/0
172.16.1.31:/data 28G 1.9G 26G 7% /mnt
[root@web01 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Oct 29 00:56:11 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=0c216d60-d304-49af-831f-cb92577e2dc1 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
172.16.1.31:/data /mnt nfs defaults 0 0
# 总结:mounted 参数,会立即挂载,并修改 fstab 文件,实现开机自动挂载
7.11.1.3 利用 absent 参数卸载 挂载在主机7 /mnt 上的设备
# 01. 查看主机7 当前挂载情况
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 28G 1.7G 26G 7% /
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.6M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 473M 125M 349M 27% /boot
tmpfs 98M 0 98M 0% /run/user/0
172.16.1.31:/data 28G 1.9G 26G 7% /mnt
[root@web01 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Oct 29 00:56:11 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=0c216d60-d304-49af-831f-cb92577e2dc1 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
172.16.1.31:/data /mnt nfs defaults 0 0
# 02. 管理端执行 卸载操作
[root@m01 ~]# ansible 172.16.1.7 -m mount -a "src=172.16.1.31:/data path=/mnt fstype=nfs state=absent"
172.16.1.7 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dump": "0",
"fstab": "/etc/fstab",
"fstype": "nfs",
"name": "/mnt",
"opts": "defaults",
"passno": "0",
"src": "172.16.1.31:/data"
}
# 03. 主机7 查看结果
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 28G 1.7G 26G 7% /
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.6M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 473M 125M 349M 27% /boot
tmpfs 98M 0 98M 0% /run/user/0
[root@web01 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Oct 29 00:56:11 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=0c216d60-d304-49af-831f-cb92577e2dc1 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
# 总结:absent参数,会立即卸载,并清理 fstab 文件
7.11.1.4 利用 unmounted 参数卸载 挂载在主机7 /mnt 上的设备
# 01. 查看主机7 当前挂载情况
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 28G 1.7G 26G 7% /
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.6M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 473M 125M 349M 27% /boot
tmpfs 98M 0 98M 0% /run/user/0
172.16.1.31:/data 28G 1.9G 26G 7% /mnt
[root@web01 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Oct 29 00:56:11 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=0c216d60-d304-49af-831f-cb92577e2dc1 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
172.16.1.31:/data /mnt nfs defaults 0 0
# 02. 管理端执行 卸载操作
[root@m01 ~]# ansible 172.16.1.7 -m mount -a "src=172.16.1.31:/data path=/mnt fstype=nfs state=unmounted"
172.16.1.7 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dump": "0",
"fstab": "/etc/fstab",
"fstype": "nfs",
"name": "/mnt",
"opts": "defaults",
"passno": "0",
"src": "172.16.1.31:/data"
}
# 03. 主机7 查看结果
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 28G 1.7G 26G 7% /
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.6M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 473M 125M 349M 27% /boot
tmpfs 98M 0 98M 0% /run/user/0
[root@web01 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Oct 29 00:56:11 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=0c216d60-d304-49af-831f-cb92577e2dc1 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
172.16.1.31:/data /mnt nfs defaults 0 0
# 总结:unmounted 参数,会立即卸载,但不修改 fstab 文件
7.12 user 模块
user - Manage user accounts
管理用户账户
- 常用参数
参数 | 功能 |
---|---|
name | 指定要创建、删除或修改的 用户名 |
uid | 创建用户时,设置用户 uid |
group | 设置用户的主要组 |
groups | 设置用户的次要组 |
create_home | yes(默认选项)、no (不创建家目录) |
shell | 指定 shell 信息 |
password | 设置密码信息(密文) |
7.12.1 基本用法
# 在被管理端 主机上 创建用户
# 01. 管理端 执行操作
[root@m01 ~]# ansible 172.16.1.31 -m user -a "name=sysadmin"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": true,
"group": 1006,
"home": "/home/sysadmin",
"name": "sysadmin",
"shell": "/bin/bash",
"state": "present",
"system": false,
"uid": 1006
}
# 02. 被管理端查看结果
[root@nfs01 ~]# id sysadmin
uid=1006(sysadmin) gid=1006(sysadmin) groups=1006(sysadmin)
7.12.2 扩展用法
7.12.2.1 指定用户 uid 信息
# 在被管理端 主机上 创建指定uid的用户
# 01. 管理端 执行操作
[root@m01 ~]# ansible 172.16.1.31 -m user -a "name=test uid=1001"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": true,
"group": 1001,
"home": "/home/test",
"name": "test",
"shell": "/bin/bash",
"state": "present",
"system": false,
"uid": 1001
}
# 02. 被管理端查看结果
[root@nfs01 ~]# id test
uid=1001(test) gid=1001(test) groups=1001(test)
7.12.2.2 指定用户组信息
- 指定主要组信息
# 01. 管理端 - 在被管理端 主机上 创建用户 test01 , 属组 设置为 root
[root@m01 ~]# ansible 172.16.1.31 -m user -a "name=test01 group=root"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": true,
"group": 0,
"home": "/home/test01",
"name": "test01",
"shell": "/bin/bash",
"state": "present",
"system": false,
"uid": 1007
}
# 02. 被管理端主机 查看结果
[root@nfs01 ~]# id test01
uid=1007(test01) gid=0(root) groups=0(root)
- 指定次要组信息
# 01. 管理端 - 在被管理端 主机上 创建用户 test02 , 主要组为 test02 次要组为 root
[root@m01 ~]# ansible 172.16.1.31 -m user -a "name=test02 groups=root"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": true,
"group": 1008,
"groups": "root",
"home": "/home/test02",
"name": "test02",
"shell": "/bin/bash",
"state": "present",
"system": false,
"uid": 1008
}
# 02. 被管理端主机 查看结果
[root@nfs01 ~]# id test02
uid=1008(test02) gid=1008(test02) groups=1008(test02),0(root)
7.12.2.3 创建虚拟用户
# 01. 管理端 - 在被管理端主机上 创建 mysql 虚拟用户
[root@m01 ~]# ansible 172.16.1.31 -m user -a "name=mysql create_home=no shell=/sbin/nologin"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": false,
"group": 1009,
"home": "/home/mysql",
"name": "mysql",
"shell": "/sbin/nologin",
"state": "present",
"system": false,
"uid": 1009
}
# 02. 被管理端 查看结果
[root@nfs01 ~]# grep mysql /etc/passwd
mysql:x:1009:1009::/home/mysql:/sbin/nologin
[root@nfs01 ~]# ll /home/
total 0
drwx------ 2 sysadmin sysadmin 62 Dec 9 13:16 sysadmin
drwx------ 2 test test 62 Dec 9 13:25 test
drwx------ 2 test01 root 62 Dec 9 17:01 test01
drwx------ 2 test02 test02 62 Dec 9 17:03 test02
drwx------ 2 www www 62 Nov 27 21:13 www
drwx------. 2 yunxuan yunxuan 83 Nov 11 18:49 yunxuan
7.12.2.4 给指定用户设置密码
# 利用 ansible 程序 user 模块设置用户密码信息,需要将密码明文信息转换为密文信息进行设置,生成密文密码信息方法:
# 01. 方法1
[root@m01 ~]# ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512','yunxuan')}}"
localhost | SUCCESS => {
"msg": "$6$yunxuan$pKlgPFhdDjAfGRH5QK7GIRchSw0RieaGbO0EkW22W/TYRYW8.4pRBFFrITH7aU0dhrODC6rVpt80vAmH1bSDc."
}
# 02. 方法2
yum install python-pip -y
pip install passlib
python -c "from passlib.hash import sha512_crypt;import getpass;print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
# 管理端 - 在被管理端服务器上 创建用户 test03 ,并设置密码为 123456
# 01. 生成密文
[root@m01 ~]# ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512','yunxuan')}}"
localhost | SUCCESS => {
"msg": "$6$yunxuan$pKlgPFhdDjAfGRH5QK7GIRchSw0RieaGbO0EkW22W/TYRYW8.4pRBFFrITH7aU0dhrODC6rVpt80vAmH1bSDc."
}
# 02. 管理端 - 为 被管理端服务器 创建用户 并 设置密码信息
[root@m01 ~]# ansible 172.16.1.31 -m user -a 'name=test03 password=$6$yunxuan$pKlgPFhdDjAfGRH5QK7GIRchSw0RieaGbO0EkW22W/TYRYW8.4pRBFFrITH7aU0dhrODC6rVpt80vAmH1bSDc.'
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": true,
"group": 1010,
"home": "/home/test03",
"name": "test03",
"password": "NOT_LOGGING_PASSWORD",
"shell": "/bin/bash",
"state": "present",
"system": false,
"uid": 1010
}
# 03. 被管理端 检查结果
[root@nfs01 ~]# grep test03 /etc/shadow
test03:$6$yunxuan$pKlgPFhdDjAfGRH5QK7GIRchSw0RieaGbO0EkW22W/TYRYW8.4pRBFFrITH7aU0dhrODC6rVpt80vAmH1bSDc.:18970:0:99999:7:::
[root@nfs01 ~]# su - yunxuan
Last login: Thu Nov 11 18:47:39 CST 2021 on pts/2
[yunxuan@nfs01 ~]$ su - test03
Password:
[test03@nfs01 ~]$
7.13 ping 模块
ping - Try to connect to host, verify a usable python and return `pong' on success
远程连接测试模块
7.13.1 基本用法
- 可远程管理情况
[root@m01 ~]# ansible 172.16.1.31 -m ping
172.16.1.31 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
- 不可以 远程管理情况
[root@m01 ~]# ansible 172.16.1.41 -m ping
172.16.1.41 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: connect to host 172.16.1.41 port 22: No route to host",
"unreachable": true
}
8. 补充说明
8.1 ansible 软件输出颜色说明
- 绿色信息:查看主机信息/对主机未做改动
- 黄色信息:对主机信息做修改
- 红色信息:命令执行出错
- 粉色信息:警告信息
- 蓝色信息:显示 ansible 命令执行过程
8.2 远程主机无法管理问题分析
-
管理端没看有分发好主机公钥
-
被管理端远程服务出现问题
-
被管理端 sshd: root@notty 进程出现僵死情况
解决方法:杀掉该进程
# ssh 服务进程说明
[root@nfs01 ~]# ps -ef|grep ssh
root 6739 1 0 Dec07 ? 00:00:00 /usr/sbin/sshd -D
root 15710 6739 0 13:36 ? 00:00:00 sshd: root@pts/1
root 15739 6739 0 13:38 ? 00:00:00 sshd: root@notty
# /usr/sbin/sshd -D -- 负责建立远程连接
# sshd: root@pts/1 -- 用于维护远程连接
# sshd: root@notty -- 用于维护远程连接(ansible 和 被管理端)
8.3 ansible 帮助手册使用
ansible-doc -l # -- 列出所有模块简介
ansible-doc -s 模块名 # -- 指定模块的详细说明
ansible-doc 模块名 # -- 查询模块在剧本中的应用方法
9. 剧本
9.1 剧本作用
可以一键化完成多个任务
9.2 剧本组成
hsots # 主机信息
tasks # 任务
9.3 剧本编写规范
pyyaml -- 三点要求
- 合理的信息缩进
# 两个空格一个缩进关系(建议不使用 TAB 键)
标题一
标题二
标题三
- 冒号的使用方法
# 使用冒号时,后面要有空格(一个空格)
# 以冒号结尾,冒号信息出现在注释说明中,后面不需要加上空格
hsots: 172.16.1.41
tasks: xxx
- 短横线应用 (列表功能)
# 使用短横线构成列表信息,短横线后面需要有空格
- 张三
男
- 打游戏
- 运动
- 李四
女
学习
9.4 编写剧本
9.4.1 自动化部署 rsync 服务
9.4.1.1 rsync 服务部署流程
# 服务端
# 01. 安装软件
ansible 172.16.1.41 -m yum -a "name=rsync state=installed"
# 02. 编写文件
ansible 172.16.1.41 -m copy -a "src=/xx/rsyncd.conf dest=/etc/"
# 03. 创建用户
ansible 172.16.1.41 -m user -a "name=rsync create_home=no shell=/sbin/nologin"
# 04. 创建目录
ansible 172.16.1.41 -m file -a "dest=/backup state=directory owner=rsync group=rsync"
# 05. 创建密码文件
ansible 172.16.1.41 -m copy -a "content='rsync_backup:123456' dest=/etc/rsync.password mode=600"
# 06. 启动服务
ansible 172.16.1.41 -m service -a "name=rsyncd state=started enabled=yes"
# 客户端
# 01. 创建密码文件
ansible 客户端地址 -m copy -a "content='123456' dest=/etc/rsync.password mode=600"
# 02. 安装 rsync 软件
ansible 客户端地址 -m yum -a "name=rsync state=installed"
# 03. 检查结果
ansible 客户端地址 -m shell -a "rsync -avz /etc/hosts rsync_backup@172.16.1.31::backup --password-file=/etc/rsync.password"
9.4.1.2 rsync 部署剧本编写
- 创建剧本保存目录
[root@m01 ~]# mkdir -p /etc/ansible/ansible-playbook
- 编写剧本
- hosts: 172.16.1.41
tasks:
- name: 01:安装rsync软件
yum: name=rsync state=installed
- name: 02:创建rsync虚拟用户
user: name=rsync create_home=no shell=/sbin/nologin
- name: 03:推送配置文件
copy: src=/server/files/rsyncd.conf dest=/etc/ backup=yes
- name: 04:编写认证文件
copy: content='rsync_backup:123456' dest=/etc/rsync.password mode=600
- name: 05:创建备份目录
file: path=/backup state=directory owner=rsync group=rsync
- name: 06:启动服务
service: name=rsyncd state=started enabled=yes
- hosts: 172.16.1.31
tasks:
- name: 编写密码认证文件
copy: content='123456' dest=/etc/rsync.password mode=600
- 执行剧本
# 01. 检查剧本的语法格式
ansible-playbook --syntax-check rsync_server.yaml
# 02. 模拟执行剧本
ansible-playbook -C rsync_server.yaml
# 03. 执行剧本
ansible-palybook rsync_server.yaml
9.4.2 自动化部署 nfs 服务
9.4.2.1 nfs 服务部署流程
# 服务端
# 01. 安装 nfs-utils rpcbind 软件
ansible 172.16.1.31 -m yum -a "name=nfs-utils state=installed"
ansible 172.16.1.31 -m yum -a "name=rpcbind state=installed"
# 02. 创建虚拟用户
ansible 172.16.1.31 -m user -a "name=www uid=1005 create_home=no shell=/sbin/nologin"
# 03. 创建共享目录
ansible 172.16.1.31 -m file -a "path=/data owner=www group=www"
# 04. 推送配置文件
ansible 172.16.1.31 -m copy -a "src=/server/files/exports dest=/etc/"
# 05. 启动 rpcbind nfs 服务
ansible 172.16.1.31 -m service -a "name=rpcbind state=started enabled=yes"
ansible 172.16.1.31 -m service -a "name=nfs state=started enabled=yes"
# 客户端
# 01. 安装 nfs-utils 软件
ansible 172.16.1.41 -m yum -a "name=nfs-utils state=installed"
# 02. 创建虚拟用户
ansible 172.16.1.41 -m user -a "name=www uid=1005 create_home=no shell=/sbin/nologin"
# 03. 挂载共享目录
ansible 172.16.1.41 -m mount -a "src=172.16.1.31:/data path=/mnt state=mounted"
9.4.2.2 nfs 部署剧本编写
- hosts: 172.16.1.31
tasks:
- name: 01:安装 nfs 软件
yum: name=nfs-utils state=installed
- name: 02:安装 rpcbind 软件
yum: name=rpcbind state=installed
- name: 03:创建虚拟用户
user: name=www uid=1005 create_home=no shell=/sbin/nologin
- name: 04:创建共享目录
file: path=/data state=directory owner=www group=www
- name: 05:推送配置文件
copy: src=/server/files/exports dest=/etc/
- name: 06:启动rpcbind服务
service: name=rpcbind state=started enabled=yes
- name: 07:启动nfs服务
service: name=nfs state=started enabled=yes
- hosts: 172.16.1.41
tasks:
- name: 01:安装 nfs 软件
yum: name=nfs-utils state=installed
- name: 02:创建虚拟用户
user: name=www uid=1005 create_home=no shell=/sbin/nologin
- name: 03:挂载到指定目录
mount: src=172.16.1.31:/data path=/mnt fstype=nfs state=mounted
9.5 剧本编写注意事项
9.5.1 常见错误
- 剧本与语法规范是否符合(空格 冒号 短横线)
- 剧本中模块使用是否正确
- 剧本中一个name标识下面只能写一个模块任务信息
- 剧本中尽量不要大量使用shell模块
10. 主机清单配置
10.1 分组配置主机清单信息
[data]
172.16.1.31
172.16.1.41
[web]
172.16.1.7
172.16.1.8
172.16.1.9
10.2 主机名符号匹配配置
[web]
172.16.1.[7:9] # -- 等价于 172.16.1.7-9
[web]
web[01:03] # -- 等价于 web01 - web03 , 前提是配置 /etc/hosts 文件
10.3 跟上非标准远程端口
[web]
web01:52113 # -- 远程端口变动
172.16.1.7:52113
10.4 主机使用特殊变量信息(没有分发公钥可以使用)
[web]
172.16.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=root
[web]
web01 ansible_ssh_host=172.16.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=root
10.5 主机组名嵌入式配置
# -- 嵌入子组信息
[rsync:children]
rsync_server
rsync_client
[rsync_server]
172.16.1.41
[rsync_client]
172.16.1.31
172.16.1.7
# -- 嵌入式变量信息
[web:vars]
ansible_ssh_host=172.16.1.7
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass=root
[web]
web01
11. 剧本的扩展功能配置
11.1 在剧本中设置变量信息
11.1.1 直接在剧本文件编写(常用)
# 变量定义
vars:
oldboy01: data01
oldboy02: data02
# 剧本中变量调用
{{ oldboy01 }}
11.1.2 在命令行中进行指定
ansible-playbook --extra-vars=oldboy01=data01 # -- 长格式
ansible-playbook -e backupdir=/data -e passfile=rsync-password # -- 短格式
11.1.3 在主机清单文件编写
[rsync:children]
rsync_server
rsync_client
[rsync_server]
172.16.1.41
[rsync_server:vars]
backupdir=/data
passfile=raync-password
[rsync_client]
172.16.1.31
172.16.1.7
[rsync_client:vars]
passfile=raync-password
11.1.4 扩展 - 如果三种方式都配置了,优先级对比
命令行设置方式 > 剧本中变量设置方式 > 主机清单变量设置方式
11.1.5 案例-剧本 rsync
- hosts: rsync
tasks:
- name: 01-Install the rsync software
yum: name=rsync state=installed
- hosts: rsync_server
vars:
backup_dir: /backup
password_file: rsync.password
tasks:
- name: 01-Create virtual user rsync
user: name=rsync create_home=no shell=/sbin/nologin
- name: 02-Create a backup directory
file: path={{ backup_dir }} state=directory owner=rsync group=rsync
- name: 02-Create a backup directory
file: path=/data state=directory owner=rsync group=rsync
- name: 03-Push the rsync service configuration file
copy: src=/etc/ansible/server_file/rsyncd.conf dest=/etc/
- name: 04-Push anthentication file
copy: content=rsync_backup:123456 dest=/etc/{{ password_file }} mode=600
- name: 05-Start the rsync service
service: name=rsyncd state=started enabled=yes
- name: 06-Check the rsync service status
shell: netstat -lntup|grep 873
register: get_rsync_service_port
- name: 07-Display the rsync service port info
debug: msg={{ get_rsync_service_port }}
- hosts: rsync_client
vars:
password_file: rsync.password
tasks:
- name: 01-Push password file
copy: content=123456 dest=/etc/{{ password_file }} mode=600
- name: 02-Create a test file for the Web Server
copy: content=web01 dest=/tmp/test.txt
when: (ansible_hostname == "web01")
- name: 03-Create a test file for the nfs server
copy: content=nfs01 dest=/tmp/test.txt
when: (ansible_hostname == "nfs01")
- name: 04-Web server transport test
shell: rsync -avz /tmp/test.txt rsync_backup@172.16.1.41::backup --password-file=/etc/{{ password_file }}
when: (ansible_hostname == "web01")
- name: 05-nfs server transport test
shell: rsync -avz /tmp/test.txt rsync_backup@172.16.1.41::data --password-file=/etc/{{ password_file }}
11.2 在剧本中设置注册信息
执行剧本时,可以显示输出命令结果信息
- hosts: rsync
tasks:
- name: check server port
shell: netstat -lntup|grep 873
register: get_server_port
- name: display port info
debug: msg={{ get_server_port.stdout_lines }}
11.3 在剧本中设置判断信息
11.3.1 使用案例
# 案例
- name: 04-Web server transport test
shell: rsync -avz /tmp/test.txt rsync_backup@172.16.1.41::backup --password-file=/etc/{{ password_file }}
when: (ansible_hostname == "web01")
# 如何指定判断条件(setup 模块)
(ansible_hostname == "xxx")
11.3.2 setup 模块介绍
setup 模块中显示被管理主机系统的详细信息
- 获取内置变量的方法
[root@m01 ~]# ansible all -m setup -a "filter=ansible_hostname"
172.16.1.31 | SUCCESS => {
"ansible_facts": {
"ansible_hostname": "nfs01",
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
172.16.1.7 | SUCCESS => {
"ansible_facts": {
"ansible_hostname": "web01",
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
172.16.1.41 | SUCCESS => {
"ansible_facts": {
"ansible_hostname": "backup",
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
11.3.3 常见主机信息
主机信息 | 解释说明 |
---|---|
ansible_all_ipv4_addresses | 仅显示ipv4的信息 |
ansible_devices | 仅显示磁盘设备信息 |
ansible_distribution | 显示是什么系统 |
ansible_distribution_major_versio | 显示系统主版本 |
ansible_distribution_version | 仅显示系统版本 |
ansible_machine | 显示系统类型(32位、64位) |
ansible_eth0 | 显示网卡eth0信息 |
ansible_hostname | 仅显示主机名 |
ansible_kernel | 仅显示内核版本 |
ansible_lvm | 显示lvm相关信息 |
ansible_memtotal_mb | 显示系统总内存 |
ansible_memfree_mb | 显示系统可用内存 |
ansible_memory_mb | 详细显示内存情况 |
ansible_swaptotal_mb | 显示总的swap内存 |
ansible_swapfree_mb | 显示swap内存的可用内存 |
ansible_mounts | 显示系统磁盘的挂载情况 |
ansible_processor | 显示cpu个数(具体显示每个cpu的型号) |
ansible_processor_vcpus | 显示cpu个数(只显示总的个数) |
11.4 在剧本中设置循环信息
# 01. 方式一(字典)
-name: Push conf file
copy: src={{ item.src }} dest={{ item.dest }} mode={{ item.mode }}
with_items:
- { src: '/etc/ansible/server_file/rsyncd.conf', dest: '/etc/', mode: '644'}
- { src: '/etc/ansible/server_file/rsync.password', dest: '/etc/', mode: '600'}
# 02. 方式二(字典)
-name: Push conf file
copy: src=/etc/ansible/server_file/{{ item.src }} dest={{ item.dest }} mode={{ item.mode }}
with_items:
- { src: 'rsyncd.conf', dest: '/etc/', mode: '644'}
- { src: 'rsync.password', dest: '/etc/', mode: '600'}
# 03. 方式三(列表)
- name: Installed Software
yum: name={{ item }} state=installed
with_items:
- wget
- tree
- lrzsz
# 04. 方式四(列表)
- name: Installed Software
yum:
name: ['rsync', 'tree', 'wget']
state: installed
11.5 在剧本中设置错误忽略
报错误模块处
ignore_errors: yes
11.6 在剧本中设置标签信息
yum: name=rsync state=installed
tags: xxx(标签信息不能单独使用数字)
# 只运行标签信息(即安装 rsync)
ansible-playbook --tags=xxx xx.yaml
# 跳过标签执行其他任务
ansible-playbook --skip-tags=xxx xx.yaml
11.7 在剧本中设置触发信息
- hosts: rsync
tasks:
- name: 01-Install the rsync software
yum: name=rsync state=installed
- hosts: rsync_server
vars:
backup_dir: /backup
password_file: rsync.password
tasks:
- name: 01-Create virtual user rsync
user: name=rsync create_home=no shell=/sbin/nologin
- name: 02-Create a backup directory
file: path={{ backup_dir }} state=directory owner=rsync group=rsync
- name: 03-Push the rsync service configuration file
copy: src=/etc/ansible/server_file/rsyncd.conf dest=/etc/
# 触发条件(传输文件有变动,黄色)
notify: restart rsync server
- name: 04-Push anthentication file
copy: content=rsync_backup:123456 dest=/etc/{{ password_file }} mode=600
- name: 05-Start the rsync service
service: name=rsyncd state=started enabled=yes
- name: 06-Check the rsync service status
shell: netstat -lntup|grep 873
register: get_rsync_service_port
- name: 07-Display the rsync service port info
debug: msg={{ get_rsync_service_port }}
# 触发执行信息(和 tasks 对齐)
handlers:
- name: restart rsync server
service: name=rsyncd state=restarted
11.8 进行剧本整合
11.8.1 方式一(include_tasks: f1.yml)
# 不推荐使用,子文件中要将 hosts 信息删除,只保留 tasks
- hosts: all
tasks:
- include_tasks: f1.yml
- include_tasks: f2.yml
11.8.2 方式二 (in clude: f1.yml)
- include: f1.yml
- include: f2.yml
# 扩展 - 关闭 Gather-Fact 关闭之后不收集主机信息,执行速度快
- hosts: xxx
gather_facts: no
11.8.3 方式三 (推荐使用)
- import_playbook: f1.yml
- import_playbook: f2.yml
12. 剧本执行出现错误排查思路
- 找到剧本中出现问题的关键点
- 将剧本中的操作转换成 模块 进行操作
- 将模块的功能操作 转换成 Linux 命令执行
13. 规范化编写剧本
13.1 创建目录
[root@m01 ansible]# pwd
/etc/ansible
[root@m01 ansible]# tree
.
├── ansible.cfg
├── ansible-playbook
│ ├── nfs-file
│ │ ├── nfs-client
│ │ └── nfs-server
│ ├── rsync-file
│ │ ├── rsync-client
│ │ └── rsync-server
│ │ └── rsyncd.conf
│ ├── rsync_server.yaml
│ └── test.yaml
├── hosts
└── roles
13.2 编写剧本信息
13.2.1 主机清单配置
[nfs:children]
nfs_server
nfs_client
[nfs_server]
172.16.1.31
[nfs_client]
172.16.1.7
13.2.2 编写剧本内容
13.2.2.1 NFS 服务剧本
- hosts: nfs
tasks:
- name: 01-Install software
yum: name=nfs-utils state=installed
- hosts: nfs_server
tasks:
- name: 01-Install the rpcbind software
yum: name=rpcbind state=installed
- name: 02-Push the nfs service configuration file
copy: src=/etc/ansible/ansible-playbook/nfs-file/nfs-server/exports dest=/etc/
notify: Restart nfs service
- name: 03-Create a backup directory
file: path=/data state=directory owner=nfsnobody group=nfsnobody
- name: 04-Start the service
service: name={{ item }} state=started enabled=yes
with_items:
- rpcbind
- nfs
- name: 05-Check service
shell: rpcinfo -p localhost
register: service_status
- name: 06-Display the service status
debug: msg={{ service_status.stdout_lines }}
handlers:
- name: Restart nfs service
service: name=nfs state=restarted
- hosts: nfs_client
tasks:
- name: 01-Mount a shared directory
mount: src=172.16.1.31:/data path=/mnt fstype=nfs state=mounted
- name: 02-Check result
shell: df -h|grep /data
register: mount_result
- name: 03-The client mounting result is displayed
debug: msg={{ mount_result.stdout_lines }}
13.2.2.2 rsync 服务剧本
- hosts: rsync
tasks:
- name: 01-Install the rsync software
yum: name=rsync state=installed
- hosts: rsync_server
vars:
backup_dir: /backup
password_file: rsync.password
tasks:
- name: 01-Create virtual user rsync
user: name=rsync create_home=no shell=/sbin/nologin
- name: 02-Create a backup directory
file: path={{ backup_dir }} state=directory owner=rsync group=rsync
- name: 03-Push the rsync service configuration file
copy: src=/etc/ansible/ansible-playbook/rsync-file/rsync-server/rsyncd.conf dest=/etc/
notify: Restart the rsync service
- name: 04-Push anthentication file
copy: content=rsync_backup:123456 dest=/etc/{{ password_file }} mode=600
- name: 05-Start the rsync service
service: name=rsyncd state=started enabled=yes
- name: 06-Check the rsync service status
shell: netstat -lntup|grep 873
register: get_rsync_service_port
- name: 07-Display the rsync service port info
debug: msg={{ get_rsync_service_port.stdout_lines }}
handlers:
- name: Restart the rsync service
service: name=rsyncd state=restarted
- hosts: rsync_client
vars:
password_file: rsync.password
tasks:
- name: 01-Push password file
copy: content=123456 dest=/etc/{{ password_file }} mode=600
13.3 进行测试
13.3.1 NFS 服务测试
# 01. web01 服务器在共享目录中保存数据
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 28G 1.7G 26G 7% /
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 14M 473M 3% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 473M 125M 349M 27% /boot
tmpfs 98M 0 98M 0% /run/user/0
172.16.1.31:/data 28G 1.9G 26G 7% /mnt
[root@web01 ~]# cd /mnt
[root@web01 mnt]# echo "web01" > root_test.txt
# 02. backup 服务器查看结果
[root@backup ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 28G 1.7G 26G 6% /
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 14M 473M 3% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 473M 125M 349M 27% /boot
172.16.1.31:/data 28G 1.9G 26G 7% /mnt
tmpfs 98M 0 98M 0% /run/user/0
[root@backup ~]# cd /mnt/
[root@backup mnt]# ll
total 4
-rw-r--r-- 1 nfsnobody nfsnobody 6 Dec 11 21:42 root_test.txt
[root@backup mnt]# cat root_test.txt
web01
13.3.2 rsync 服务测试
# 01. web01 服务器同步数据测试
[root@web01 tmp]# echo "web01:10.1.1.7" > test_web01.txt
[root@web01 tmp]# cat test_web01.txt
web01:10.1.1.7
[root@web01 tmp]# rsync -avz test_web01.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
sending incremental file list
test_web01.txt
sent 114 bytes received 43 bytes 314.00 bytes/sec
total size is 15 speedup is 0.10
# 02. backup 服务器检查
[root@backup ~]# ll /backup/
total 4
-rw-r--r-- 1 rsync rsync 15 Dec 11 20:53 test_web01.txt
[root@backup ~]# cat /backup/test_web01.txt
web01:10.1.1.7
14. ansible 程序 roles 功能 -- 规范化 标准化
14.1 传统剧本存在的问题
- 目录结构不规范
- 编写好的任务如何重复调用
- 服务端配置文件改动,客户端参数信息也自动变化
- 汇总剧本中没有显示主机角色信息
- 一个剧本内容信息过多,不容易阅读,如何进行拆分
14.2 利用 角色 功能编写剧本
14.2.1 规范目录结构
cd /etc/ansible/roles
mkdir {rsync,nfs} -- 创建相应角色目录
mkdir {rsync,nfs}/{vars,tasks,templates,handlers,files} -- 创建角色目录下的子目录
[root@m01 roles]# pwd
/etc/ansible/roles
[root@m01 roles]# tree
.
├── nfs
│ ├── files -- 保存需要分发文件目录
│ ├── handlers -- 保存触发器配置文件信息
│ ├── tasks -- 保存要执行的动作信息文件
│ ├── templates -- 保存需要分发的模板文件,模板文件中可以设置变量信息(template模块代替copy模块)
│ └── vars -- 保存变量信息文件
└── rsync
├── files
├── handlers
├── tasks
├── templates
└── vars
14.2.2 在 roles 目录中创建相关文件
- 编写 tasks 中的 main.yaml 文件(以 nfs 为例)
# 01. 服务端
cd /etc/ansible/roles/nfs-server/tasks
vim main.yaml
- name: 01-copy conf file
copy: src=exports dest=/etc/
notify: restart nfs server
- name: 02-create data dir
file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody
- name: 03-boot server
service: name={{ item }} state=started enabled=yes
with_items:
- rpbind
- nfs
# 02. 客户端
cd /etc/ansible/roles/nfs-client/tasks
vim main.yaml
- 编写 vars 目录中的 main.yaml 文件,变量信息
cd /etc/ansible/roles/nfs-server/vars
vim main.yaml
Data_dir: /data
- 编写 files 目录中的配置文件
cd /etc/ansible/roles/nfs-server/files
vim exports
/data 172.16.1.0/24(rw,sync)
- 编写 handlers 目录中的 main.yaml 文件
cd /etc/ansible/roles/nfs-server/handlers
vim main.yaml
- name: restart nfs server
service: name=nfs state=restarted
14.2.3 编写一个主剧本文件 (自定义文件名)
cd /etc/ansible/roles
vim site.yaml
- hosts: nfs_server
roles:
- nfs-server
- hosts: nfs_client
roles:
- nfs-client
14.2.4 主剧本调用执行
ansible-playbook site.yaml
template 模块 调用 模板文件
14.3 案例 (rsync 和 nfs 服务一键化部署)
[root@m01 roles]# tree
.
├── nfs_client
│ ├── files
│ │ └── exports
│ ├── handlers
│ │ └── main.yaml
│ ├── tasks
│ │ └── main.yaml
│ ├── templates
│ └── vars
│ └── main.yaml
├── nfs_server
│ ├── files
│ │ └── exports
│ ├── handlers
│ │ └── main.yaml
│ ├── tasks
│ │ └── main.yaml
│ ├── templates
│ └── vars
│ └── main.yaml
├── nfs.yaml
├── rsync_client
│ ├── files
│ ├── handlers
│ ├── tasks
│ │ └── main.yaml
│ ├── templates
│ └── vars
│ └── main.yaml
├── rsync_server
│ ├── files
│ │ └── rsyncd.conf
│ ├── handlers
│ │ └── main.yaml
│ ├── tasks
│ │ └── main.yaml
│ ├── templates
│ │ └── rsyncd.conf
│ └── vars
│ └── main.yaml
├── rsync.yaml
└── site.yaml
24 directories, 18 files
[root@m01 roles]# pwd
/etc/ansible/roles
14.3.1 nfs 案例
14.3.1.1 nfs_server
[root@m01 nfs_server]# pwd
/etc/ansible/roles/nfs_server
[root@m01 nfs_server]# tree
.
├── files
│ └── exports
├── handlers
│ └── main.yaml
├── tasks
│ └── main.yaml
├── templates
└── vars
5 directories, 3 files
- tasks 下的 main.yaml 文件
- name: 01-Install the rpcbind software
yum: name=rpcbind state=installed
- name: 02-Push the nfs service configuration file
copy: src=/etc/ansible/ansible-playbook/nfs-file/nfs-server/exports dest=/etc/
notify: Restart nfs service
- name: 03-Create a backup directory
file: path=/data state=directory owner=nfsnobody group=nfsnobody
- name: 04-Start the service
service: name={{ item }} state=started enabled=yes
with_items:
- rpcbind
- nfs
- name: 05-Check service
shell: rpcinfo -p localhost
register: service_status
- name: 06-Display the service status
debug: msg={{ service_status.stdout_lines }}
- vars 下的 main.yaml 文件
- files 下的 配置文件
[root@m01 nfs_server]# cd files/
[root@m01 files]# cat exports
/data 172.16.1.0/24(rw,sync)
- handlers 下的 main.yaml 文件
- name: Restart nfs service
service: name=nfs state=restarted
14.3.1.2 nfs_client
[root@m01 nfs_client]# tree
.
├── files
├── handlers
├── tasks
│ └── main.yaml
├── templates
└── vars
5 directories, 1 file
- tasks 下的 main.yaml 文件
- name: 01-Mount a shared directory
mount: src=172.16.1.31:/data path=/mnt fstype=nfs state=mounted
- name: 02-Check result
shell: df -h|grep /data
register: mount_result
- name: 03-The client mounting result is displayed
debug: msg={{ mount_result.stdout_lines }}
14.3.1.3 nfs.yaml 文件 (服务端和客户端同时需要部署内容,可单独定义一个角色)
[root@m01 roles]# pwd
/etc/ansible/roles
[root@m01 roles]# cat nfs.yaml
- hosts: nfs
tasks:
- name: 01-Install software
yum: name=nfs-utils state=installed
14.3.1.4 主剧本文件
[root@m01 roles]# pwd
/etc/ansible/roles
[root@m01 roles]# cat site.yaml
- import_playbook: nfs.yaml
- hosts: nfs_server
roles:
- nfs_server
- hosts: nfs_client
roles:
- nfs_client
14.3.2 rsync 案例
14.3.2.1 rsync_server
[root@m01 rsync_server]# pwd
/etc/ansible/roles/rsync_server
[root@m01 rsync_server]# tree
.
├── files
│ └── rsyncd.conf
├── handlers
│ └── main.yaml
├── tasks
│ └── main.yaml
├── templates
│ └── rsyncd.conf
└── vars
└── main.yaml
5 directories, 5 files
- tasks 下的 main.yaml 文件
- name: 01-Create virtual user rsync
user: name=rsync create_home=no shell=/sbin/nologin
- name: 02-Create a backup directory
file: path={{ backup_dir }} state=directory owner=rsync group=rsync
- name: 03-Push the rsync service configuration file
#copy: src=rsyncd.conf dest=/etc/
template: src=rsyncd.conf dest=/etc/
notify: Restart the rsync service
- name: 04-Push anthentication file
copy: content=rsync_backup:123456 dest=/etc/{{ password_file }} mode=600
- name: 05-Start the rsync service
service: name=rsyncd state=started enabled=yes
- name: 06-Check the rsync service status
shell: netstat -lntup|grep rsync
register: get_rsync_service_port
- name: 07-Display the rsync service port info
debug: msg={{ get_rsync_service_port.stdout_lines }}
- vars 下的 main.yaml 文件
[root@m01 tasks]# cd ../vars/
[root@m01 vars]# cat main.yaml
backup_dir: /backup
password_file: rsync.password
port_info: 873
- files 下的配置文件
[root@m01 vars]# cd ../files/
[root@m01 files]# cat rsyncd.conf
# rsync_config
# created by yunxuan at 2021
# rsyncd.conf start
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 172.16.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
comment = "backup dir by yunxuan"
path = /backup
- handlers 下的 main.yaml 文件
[root@m01 files]# cd ../handlers/
[root@m01 handlers]# cat main.yaml
- name: Restart the rsync service
service: name=rsyncd state=restarted
- templates 下的 模板配置 文件
[root@m01 handlers]# cd ../templates/
[root@m01 templates]# cat rsyncd.conf
# rsync_config
# created by yunxuan at 2021
# rsyncd.conf start
uid = rsync
gid = rsync
port = {{ port_info }}
fake super = yes
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 172.16.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
comment = "backup dir by yunxuan"
path = /backup
14.3.2.2 rsync_client
[root@m01 rsync_client]# pwd
/etc/ansible/roles/rsync_client
[root@m01 rsync_client]# tree
.
├── files
├── handlers
├── tasks
│ └── main.yaml
├── templates
└── vars
└── main.yaml
5 directories, 2 files
- tasks 下的 main.yaml 文件
[root@m01 rsync_client]# cd tasks/
[root@m01 tasks]# cat main.yaml
- name: 01-Push password file
copy: content=123456 dest=/etc/{{ password_file }} mode=600
- vars 下的 main.yaml 文件
[root@m01 tasks]# cd ../vars/
[root@m01 vars]# cat main.yaml
password_file: rsync.password
14.3.2.3 rsync.yaml 文件 (客户端和服务端同时需要部署)
[root@m01 roles]# cat rsync.yaml
- hosts: rsync
tasks:
- name: 01-Install the rsync software
yum: name=rsync state=installed
14.3.2.4 主剧本文件
[root@m01 roles]# pwd
/etc/ansible/roles
[root@m01 roles]# cat site.yaml
- import_playbook: rsync.yaml
- hosts: rsync_server
roles:
- rsync_server
14.3.3 实时同步 案例
1. 备份服务器 部署 rsync 守护进程
2. 客户端 安装 inotify-tools
ansible 172.16.1.31 -m yum -a "name=inotify-tools state=installed"
3. 安装 sersync
3.1 上传 文件 至 指定目录
ansible 172.16.1.31 -m synchronize -a "src=/etc/ansible/server_file/sersync.zip dest=/tmp/"
3.2 解压 并 配置环境变量
ansible 172.16.1.7 -m unarchive -a "src=/tmp/sersync.zip dest=/usr/local/ remote_src=yes"
# 合并以上两步
ansible 172.16.1.7 -m unarchive -a "src=/etc/ansible/server_file/sersync.zip dest=/usr/local/"
ansible 172.16.1.7 -m file -a "path=/usr/local/sersync/bin/sersync mode=744"
ansible 172.16.1.7 -m shell -a "echo 'export PATH=$PATH:/usr/local/sersync/bin' >> /etc/profile"
3.3 启动服务
ansible 172.16.1.7 -m shell -a "sersync -dro /usr/local/sersync/conf/confxml.xml"
- hosts: 172.16.1.31
tasks:
- name: 01-安装软件
yum: name=inotify-tools state=installed
- name: 02-解压传输sersync文件
unarchive: src=/etc/ansible/server_file/sersync.zip dest=/usr/local/
- name: 03-授权
file: path=/usr/local/sersync/bin/sersync mode=744
- name: 04-推送配置文件
copy: src=confxml.xml dest=/usr/local/sersync/conf/ backup=yes
notify: restart sersync service
- name: 05-启动服务
shell: /usr/local/sersync/bin/sersync -dro /usr/local/sersync/conf/confxml.xml
handlers:
- name: restart sersync service
shell: killall sersync && /usr/local/sersync/bin/sersync -dro /usr/local/sersync/conf/confxml.xml
14.3.3.1 以 roles 功能实现
task
[root@m01 tasks]# cat main.yaml
- name: 01-安装软件
yum: name=inotify-tools state=installed
- name: 02-解压传输sersync文件
unarchive: src=/etc/ansible/server_file/sersync.zip dest=/usr/local/
- name: 03-授权
file: path=/usr/local/sersync/bin/sersync mode=744
- name: 04-推送配置文件
template: src=confxml.xml dest=/usr/local/sersync/conf/ backup=yes
#copy: src=confxml.xml dest=/usr/local/sersync/conf/ backup=yes
notify: restart sersync service
- name: 05-启动服务
shell: /usr/local/sersync/bin/sersync -dro /usr/local/sersync/conf/confxml.xml
vars
[root@m01 vars]# cat main.yaml
inotify_dir: /data
backup_server_ip: 172.16.1.41
parameter: -az
auth_status: "true"
auth_user: rsync_backup
auth_password: /etc/rsync.password
backup_module: backup
files
[root@m01 files]# cat confxml.xml
……
<!-- 23-35行 核心部分 -->
<sersync>
<localpath watch="/data"> <!-- 指定监控目录 -->
<remote ip="172.16.1.41" name="backup"/> <!-- ip:指定备份服务器地址 name:指定备份服务器模块信息 -->
<!--<remote ip="192.168.8.39" name="tongbu"/>--> <!-- 可以向多个备份服务器 备份数据 -->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="-az"/> <!-- 指定rsync推送命令参数 -->
<!-- 指定rsync认证用户和认证文件,保证状态为true,开启认证 -->
<auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>
<!-- 指定rsync守护进程端口号,默认为873端口。若rsync守护进程不是默认端口,需要配置下面内容,状态true,端口为修改后的端口号 -->
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<!-- 建立连接超时设设置100s -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
……
handlers
[root@m01 handlers]# cat main.yaml
- name: restart sersync service
shell: killall sersync && /usr/local/sersync/bin/sersync -dro /usr/local/sersync/conf/confxml.xml
templates
[root@m01 templates]# cat confxml.xml
……
<!-- 23-35行 核心部分 -->
<sersync>
<localpath watch="{{ inotify_dir }}"> <!-- 指定监控目录 -->
<remote ip="{{ backup_server_ip }}" name="{{ backup_module }}"/> <!-- ip:指定备份服务器地址 name:指定备份服务器模块信息 -->
<!--<remote ip="192.168.8.39" name="tongbu"/>--> <!-- 可以向多个备份服务器 备份数据 -->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="{{ parameter }}"/> <!-- 指定rsync推送命令参数 -->
<!-- 指定rsync认证用户和认证文件,保证状态为true,开启认证 -->
<auth start="{{ auth_status }}" users="{{ auth_user }}" passwordfile="{{ auth_password }}"/>
<!-- 指定rsync守护进程端口号,默认为873端口。若rsync守护进程不是默认端口,需要配置下面内容,状态true,端口为修改后的端口号 -->
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<!-- 建立连接超时设设置100s -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
……
site01.yaml
[root@m01 roles]# cat site01.yaml
- hosts: 172.16.1.31
roles:
- sersync