需要认真度的文章自动化运维

ansible 批量管理服务

2021-12-16  本文已影响0人  小屁孩云熙

1. ansible 批量管理服务概述

  1. 是基于python语言开发的自动化软件工具
  2. 是基于SSH远程管理服务实现的远程主机批量管理

2. ansible 批量管理服务意义

  1. 提高工作效率
  2. 提高工作准确度
  3. 减少维护的成本
  4. 减少重复性工作

3. ansible 批量管理服务特点

  1. 管理端不需要启动服务程序
    no server

  2. 管理端不需要编写配置文件
    /etc/ansible/ansible.cfg

  3. 受控端不需要安全软件程序
    libselinux-python

    被管理端 selinux 服务没有关闭 -- 影响 ansible 软件的管理

    libselinux-python 让 selinux 开启的状态也可以使用 ansible 程序

  4. 受控端不需要启动服务程序
    no agent

  5. 服务程序管理操作模块众多
    moudle

  6. 利用剧本编写来实现自动化
    playbook

4. ansible 批量管理服务功能

  1. 可以实现批量系统操作配置
  2. 可以实现批量软件服务部署
  3. 可以实现批量文件数据分发
  4. 可以实现批量系统信息收集

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 服务架构信息

  1. 主机清单配置

  2. 软件模块信息

  3. 基于秘钥连接主机

  4. 主机需要关闭 selinux

  5. 软件剧本功能

image-20211206114908830.png

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 参数功能:切换到指定目录,再执行后续操作
  1. 管理端通过 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
  1. 管理端通过 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 参数功能:若指定文件存在,不执行后续操作。相反,若指定文件不存在,执行后续操作
  1. 指定文件存在
# 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
  1. 指定文件不存在情况
# 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 参数功能:若指定文件存在,则执行后续操作。否则,不执行后续操作
  1. 指定文件存在情况
# 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
  1. 指定文件不存在情况
# 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 模块运行脚本

  1. 管理端编写脚本
[root@m01 scripts]# cat test.sh 
#!/bin/bash
yum install htop -y
  1. 将脚本发送至远程主机
# 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
  1. 将脚本权限进行修改,添加执行权限
[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
  1. 使用 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 模块运行脚本

  1. 编写脚本
[root@m01 scripts]# cat test.sh 
#!/bin/bash
yum install htop -y
  1. 执行命令
# 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, 
   ……
  1. 结果检查
[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
  1. 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. 结果:将管理端的 文件 传输到 被管理端对应目录(远程传输数据)
  1. 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
# 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

# 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 指定用户组信息
  1. 指定主要组信息
# 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)
  1. 指定次要组信息
# 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 基本用法

  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"
}
  1. 不可以 远程管理情况
[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 软件输出颜色说明

  1. 绿色信息:查看主机信息/对主机未做改动
  2. 黄色信息:对主机信息做修改
  3. 红色信息:命令执行出错
  4. 粉色信息:警告信息
  5. 蓝色信息:显示 ansible 命令执行过程

8.2 远程主机无法管理问题分析

  1. 管理端没看有分发好主机公钥

  2. 被管理端远程服务出现问题

  3. 被管理端 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 -- 三点要求

  1. 合理的信息缩进
# 两个空格一个缩进关系(建议不使用 TAB 键)
标题一
  标题二
    标题三
  1. 冒号的使用方法
# 使用冒号时,后面要有空格(一个空格)
# 以冒号结尾,冒号信息出现在注释说明中,后面不需要加上空格
hsots: 172.16.1.41
tasks: xxx
  1. 短横线应用 (列表功能)
# 使用短横线构成列表信息,短横线后面需要有空格
- 张三
    男
      - 打游戏
      - 运动
- 李四
    女
      学习

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 部署剧本编写
  1. 创建剧本保存目录
[root@m01 ~]# mkdir -p /etc/ansible/ansible-playbook
  1. 编写剧本
- 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
  1. 执行剧本
# 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 常见错误

  1. 剧本与语法规范是否符合(空格 冒号 短横线)
  2. 剧本中模块使用是否正确
  3. 剧本中一个name标识下面只能写一个模块任务信息
  4. 剧本中尽量不要大量使用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. 剧本执行出现错误排查思路

  1. 找到剧本中出现问题的关键点
  2. 将剧本中的操作转换成 模块 进行操作
  3. 将模块的功能操作 转换成 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 传统剧本存在的问题

  1. 目录结构不规范
  2. 编写好的任务如何重复调用
  3. 服务端配置文件改动,客户端参数信息也自动变化
  4. 汇总剧本中没有显示主机角色信息
  5. 一个剧本内容信息过多,不容易阅读,如何进行拆分

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 目录中创建相关文件

  1. 编写 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
  1. 编写 vars 目录中的 main.yaml 文件,变量信息
cd /etc/ansible/roles/nfs-server/vars
vim main.yaml

Data_dir: /data
  1. 编写 files 目录中的配置文件
cd /etc/ansible/roles/nfs-server/files
vim exports

/data 172.16.1.0/24(rw,sync)
  1. 编写 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
  1. 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 }}
  1. vars 下的 main.yaml 文件
  2. files 下的 配置文件
[root@m01 nfs_server]# cd files/
[root@m01 files]# cat exports 
/data  172.16.1.0/24(rw,sync)
  1. 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
  1. 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
  1. 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 }}
  1. vars 下的 main.yaml 文件
[root@m01 tasks]# cd ../vars/
[root@m01 vars]# cat main.yaml 
backup_dir: /backup
password_file: rsync.password
port_info: 873
  1. 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
  1. handlers 下的 main.yaml 文件
[root@m01 files]# cd ../handlers/
[root@m01 handlers]# cat main.yaml 
- name: Restart the rsync service
  service: name=rsyncd state=restarted
  1. 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
  1. 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
  1. 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
上一篇下一篇

猜你喜欢

热点阅读