ansible 批量管理服务

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
  • 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 指定用户组信息
  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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容