数据库运维
记录DBA学习成长历程

第19章:ansible批量管理

文章目录

1 ansible介绍

1.1 ansible服务存在意义

1. 采用并行方式进行批量管理自动化操作
2. 提高工作的效率
3. 提高工作准确度 1台存储设备进行迁移
4. 减少维护的成本 ELK HADOOP OPENSTACK 剧本==脚本

1.2 ansible软件功能作用

01. 可以实现批量系统操作配置
02. 可以实现批量软件服务部署
03. 可以实现批量文件数据分发
04. 可以实现批量系统信息收集

1.3 ansible软件 特点介绍

01. 管理端不需要启动服务程序(no server)
02. 管理端不需要编写配置文件(/etc/ansible/ansible.cfg)
03. 受控端不需要安装软件程序(#libselinux-python)
04. 受控端不需要启动服务程序(no agent)
05. 服务程序管理操作模块众多(module) * 精通ansible
06. 利用剧本编写来实现自动化(playbook) *

2 ansible部署过程

第一个历程: 在ansible管理主机上部署安装软件 
[root@m01 ~]#yum install -y ansible

第二个历程: 在ansible目录中编写hosts
[root@m01 ~]#vim /etc/ansible/hosts --- 定义ansible可以管理的主机清单
[oldboy]
172.16.1.41
172.16.1.31
172.16.1.7

第三个历程: 检查测试
语法格式: ansible 主机信息/主机组信息/all -m 模块信息 -a "模块的具体操作"
检查所有指定主机是否可以进行远程连接管理
[root@m01 ~]#ansible oldboy -m ping
172.16.1.41 | SUCCESS => {
...
}
172.16.1.7 | SUCCESS => {
...
}
172.16.1.31 | SUCCESS => {
...
}

3 ansible结构

ansible主机清单
ansible模块 
ansible剧本 
ansible程序架构
PS: 请参考官方手册

4 ansible主机清单配置方式

4.1 方式一: 定义一个主机组(主机信息)

[atlanta]
host1
host2

4.2 方式二: 定义主机配置信息

[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
实践配置:
[oldboy]
172.16.1.31 ansible_port=52113 ansible_user=oldboy ansible_ssh_pass=123456

常见的主机配置参数:
ansible_port 指定远程主机端口号信息
ansible_user 指定以什么用户身份进行远程连接管理
ansible_ssh_pass 指定远程连接用户的密码信息
[root@m01 ~]# ansible oldboy -m ping
172.16.1.31 | SUCCESS => {
...
}
[root@m01 ~]# ssh oldboy@172.16.1.31
oldboy@172.16.1.31's password: 
Last login: Thu May 18 23:57:16 2023 from 172.16.1.61
[oldboy@nfs01 ~]$ logout

4.3 方式三: 划分子组配置方式

[usa:children] 定义一个主机组
southeast 定义组里面细化的分组信息
northeast
southwest
northwest

实践配置信息:
[oldboyall:children]
oldboydb
oldboyweb

[oldboydb]
172.16.1.31

[oldboyweb]
172.16.1.7

4.4 方式四: 定义变量方式配置清单

[southeast:vars] --- 剧本有关
some_server=foo.southeast.example.com
halon_system_timeout=30
self_destruct_countdown=60
escape_pods=2

4.5 方式五: 利用符号匹配方式配置

[webservers]
www[01:50].example.com
实践配置:
[webservers]
172.16.1.[1:10]
172.16.1.[15:30]
官方参考: https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html

5 ansible模块使用

5.1 查看模块

[root@m01 ~]# ansible-doc -l|wc -l
3387(总共3387个模块)

ansible 主机信息 -m 模块名 -a "模块参数信息"

5.2 commands modules模块

模块使用注意事项:
https://docs.ansible.com/ansible/latest/modules/list_of_commands_modules.html
模块简单说明: Executes a command on a remote node 执行命令在远程节点
01. command模块-a后面的所有参数需要输入时利用空格分隔
[root@m01 ~]# ansible oldboy -m command -a "hostname"
02. 有些命令中的变量或符号信息无法被command模块识别,建议使用shell模块识别变量或特殊字符信息
[root@m01 ~]# ansible oldboy -m shell -a "hostname -i;pwd"
03. 如果目标主机是windows主机,请使用win_command

模块参数说明:
01. chdir --- 在切换目录之前执行相应命令
[root@m01 ansible]# ansible oldboy -m command -a "chdir=/etc ls /tmp"
172.16.1.7 | CHANGED | rc=0 >>
ansible_command_payload_QXQX8U
vmware-root
www

02. creates --- 判断一个指定文件是否存在,如果存在就不执行后面命令操作
[root@m01 ansible]# ansible oldboy -m command -a "creates=/tmp/oldboy.txt mkdir /oldboy100"
172.16.1.31 | CHANGED | rc=0 >>
172.16.1.41 | CHANGED | rc=0 >>
172.16.1.7 | SUCCESS | rc=0 >>
skipped, since /tmp/oldboy.txt exists
[root@backup ~]# ll /var/run/rsyncd.pid
-rw-r--r-- 1 root root 5 May 17 01:48 /var/run/rsyncd.pid
应用说明: 当判断pid文件已经存在,服务可以不用反复启动

03. removes --- 判断一个指定文件是否存在, 如果存在就执行后面的命令
[root@m01 ansible]# ansible oldboy -m command -a "removes=/tmp/oldboy.txt rm -f /tmp/oldboy.txt"
172.16.1.7 | CHANGED | rc=0 >>
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /tmp/oldboy.txt does not exist
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp/oldboy.txt does not exist
应用说明: 当判断pid文件不存在,服务可以不用反复停止

04. free_form --- 在command模块后面参数部分, 必须输入一个合理的linux命令信息
可以参考模块使用样例:剧本使用模块方式

5.3 script脚本模块

a 编辑一个脚本
cd /server/scripts/
vim yum.sh
#!/bin/bash
yum install -y htop
b 执行ansible命令
ansible oldboy -m script -a "/server/scripts/yum.sh"
说明: 利用script模块不需要将脚本分发给远程主机,可以实现脚本功能

5.4 shell万能模块

ansible oldboy -m shell -a "ls && pwd"
其他参数信息作用和command模块相同
但是有时使用时,不如专业模块更加方便,而且会有忠告提示
shell模块不如其它专业模块在使用时更加方便

5.5 copy模块

copy 复制文件到远程主机上(管理主机 -- 被管理主机上)
参数:
dest --- 指定复制的数据保存的路径信息
src --- 指定将本地什么数据信息进行复制
[root@m01 scripts]# ansible oldboy -m copy -a "src=/etc/hosts dest=/tmp/host_bak"

mode --- 在数据被复制之后,修改文件权限属性信息,如mode=0644或mode=u+x g+x o+x
owner --- 设置文件属主信息
group --- 设置文件属组信息
[root@m01 ~]# ansible oldboy -m copy -a "src=/root/oldboy.txt dest=/tmp/oldboy_bak03.txt mode=0444 owner=oldboy group=oldboy" 
[root@nfs01 ~]# ll /tmp/oldboy_bak03.txt
-r--r--r-- 1 oldboy oldboy 0 May 20 00:33 /tmp/oldboy_bak03.txt

backup --- 对文件进行备份
[root@m01 ~]# ansible oldboy -m copy -a "src=/root/oldboy.txt dest=/tmp/oldboy_bak03.txt mode=0444 owner=oldboy group=oldboy backup=yes" 
[root@backup ~]# cat /tmp/oldboy_bak03.txt
oldboy123
[root@backup ~]# cat /tmp/oldboy_bak03.txt.11838.2023-05-20\@00\:50\:51~ 
oldboy

remote_src --- 指定使用源信息是什么
               如果参数设置为no 表示src路径数据信息从管理主机进行获取
               如果参数设置为yes 表示src路径数据信息从被管理主机进行获取
[root@m01 ~]# ansible oldboy -m copy -a "src=/tmp/oldboy.txt dest=/tmp/oldboy.txt_bak mode=0444 owner=oldboy group=oldboy remote_src=yes" 
[root@backup tmp]# cat oldboy.txt
oldboy
[root@backup tmp]# cat oldboy.txt_bak 
oldboy
[root@m01 ~]# 
还原操作
[root@m01 ~]# ansible oldboy -m copy -a "src=/tmp/oldboy.txt_bak dest=/tmp/oldboy.txt mode=0644 owner=oldboy group=oldboy remote_src=yes"

content --- 批量在远程主机直接创建文件,并在在文件中写入简单的信息
新版ansible可以识别换行符号 \n  可以实现文件多行内容信息创建
[root@m01 ~]# ansible oldboy -m copy -a 'content="oldboy123\noldboy321\n" dest=/tmp/rsync.password mode=600'
[root@backup tmp]# cat rsync.password 
oldboy123
oldboy321

5.6 fetch模块

复制文件从远程主机到本地管理主机上 
src --- 指定将远程主机上的什么数据信息进行拉取
dest --- 指定将远程主机上的数据信息拉取保存到本地什么路径中
[root@m01 ~]# ansible 172.16.1.41 -m fetch -a "src=/tmp/olddog.txt dest=/root/"
[root@backup tmp]# echo olddog123 > /tmp/olddog.txt
[root@m01 ~]# cat 172.16.1.41/tmp/olddog.txt 
olddog123

5.7 file模块

设置文件属性信息/进行文件 目录 链接文件创建
path --- 指定要修改属性信息的数据信息
         指定要创建数据的路径信息 
         参数别名: dest, name
mode --- 表示修改文件权限信息
owner --- 修改数据属主信息
group --- 修改数据属组信息
修改远程主机文件权限属性信息
[root@m01 ~]# ansible oldboy -m file -a "dest=/tmp/host_bak mode=0400 owner=oldboy group=oldboy"
(目录属性权限信息修改,不会做递归修改) 
[root@nfs01 tmp]# mkdir oldboy_dir
[root@nfs01 tmp]# touch oldboy_dir/{01..10}.txt
[root@nfs01 tmp]# mkdir oldboy_dir/{01..10}_dir
[root@m01 tmp]# ansible oldboy -m file -a "dest=/tmp/oldboy_dir mode=0400 owner=oldboy group=oldboy"
[root@nfs01 tmp]# ll
dr-------- 12 oldboy oldboy 286 May 20 01:57 oldboy_dir

recurse --- 实现修改目录权限属性信息时,进行递归修改
[root@m01 ~]# ansible 172.16.1.31 -m file -a "dest=/tmp/oldboy_dir mode=0400 owner=oldboy group=oldboy recurse=yes"
[root@nfs01 tmp]# ll
dr-------- 12 oldboy oldboy 286 May 20 01:57 oldboy_dir
[root@nfs01 tmp]# ll oldboy_dir/
total 0
dr-------- 2 oldboy oldboy 6 May 20 01:57 01_dir
-r-------- 1 oldboy oldboy 0 May 20 01:57 01.txt

state --- 实现在远程主机上批量创建数据信息
          file --- 默认用于检测文件是否存在
          touch --- 用于创建普通文件
          directory --- 用于创建目录文件
          link --- 创建软链接
          hard --- 创建硬链接
          absent --- 删除数据信息
          src --- 指定创建链接文件的源文件信息
创建文件:
[root@m01 ~]# ansible 172.16.1.31 -m file -a "dest=/tmp/file-01 state=touch"
[root@nfs01 tmp]# ll
-rw-r--r-- 1 root root 0 May 20 02:03 file-01
创建目录:
[root@m01 ~]# ansible 172.16.1.31 -m file -a "dest=/tmp/dir-01 state=directory"
[root@nfs01 tmp]# ll
total 8
drwxr-xr-x 2 root root 6 May 20 02:04 dir-01

创建硬链接: 
[root@m01 ~]# ansible 172.16.1.31 -m file -a "src=/tmp/file-01 dest=/tmp/file-01-hard-link state=hard"
[root@nfs01 tmp]# ll
-rw-r--r-- 2 root root 0 May 20 02:03 file-01
-rw-r--r-- 2 root root 0 May 20 02:03 file-01-hard-link
创建硬软链接:
[root@m01 ~]# ansible 172.16.1.31 -m file -a "src=/tmp/file-01 dest=/tmp/file-01-soft-link state=link"
[root@nfs01 tmp]# ll
total 8
-rw-r--r-- 2 root root 0 May 20 02:03 file-01
lrwxrwxrwx 1 root root 12 May 20 02:09 file-01-soft-link -> /tmp/file-01

删除文件:
[root@m01 tmp]# ansible 172.16.1.31 -m file -a "dest=/tmp/file-01 state=absent"
删除目录(默认递归删除):
[root@m01 tmp]# ansible 172.16.1.31 -m file -a "dest=/tmp/dir-01 state=absent"

5.7 archive模块

对目录数据信息进行压缩处理
path --- 定义将一个或多个文件进行压缩处理 
dest --- 将压缩好的数据保存在什么路径中,并且可以命名压缩包信息
format --- 定义压缩类型 bz2 gz ← tar xz zip
remove --- 是否移除源文件信息,用于节省磁盘空间
exclude_path --- 当压缩一个目录时,目录中可以有部分数据信息进行排除 

将单个文件进行压缩处理
[root@nfs01 tmp]# echo oldboy > oldboy.txt 
[root@m01 ~]# ansible 172.16.1.31 -m archive -a "path=/tmp/oldboy.txt"
[root@nfs01 tmp]# ll
-rw-r--r-- 1 root root 38 May 23 13:38 oldboy.txt.gz
[root@nfs01 tmp]# gunzip oldboy.txt.gz 
[root@nfs01 tmp]# ll
-rw-r--r-- 1 root root 7 May 23 13:38 oldboy.txt
[root@nfs01 tmp]# cat oldboy.txt
123456
特殊需求: 压缩完成移除源文件
[root@m01 ~]# ansible 172.16.1.31 -m archive -a "path=/tmp/oldboy.txt remove=yes"
特殊需求: 将压缩包压缩为zip格式
[root@m01 ~]# ansible 172.16.1.31 -m archive -a "path=/tmp/oldboy.txt remove=yes format=zip"
将多个文件或目录进行压缩处理
[root@m01 ~]# ansible 172.16.1.31 -m archive -a "path=/tmp/oldboy.txt dest=/tmp/oldboy.tar.gz"

5.8 unarchive模块

对压缩包进行解压缩处理,但不是所有压缩包默认都可以解压
默认解压方式 /usr/bin/gtar /usr/bin/unzip

src --- 定义要解压的压缩文件路径信息(默认从本地查找) 必须要有参数 
dest --- 将数据解压到远程主机的什么路径中 必须要有参数
remote_src --- 指定是否识别远程主机压缩包信息 yes表示识别 no 表示不识别(识别本地压缩包)
copy --- 指定是否识别远程主机压缩包信息 yes表示不识别 no 表示识别
creates --- 判断是否已经存在解压后的文件,如果存在就跳过解压过程, 避免覆盖相应文件

利用remote_src参数实现解压远程主机中的压缩文件
[root@nfs01 tmp]# ll
total 4
-rw-r--r-- 1 root root 7 May 23 14:07 oldboy.txt
利用copy参数, 识别远程主机压缩文件
[root@m01 ~]# ansible 172.16.1.31 -m unarchive -a "src=/tmp/oldboy.txt.zip dest=/tmp/ copy=no"
[root@nfs01 tmp]# ll
total 8
-rw-r--r-- 1 root root 7 May 23 14:07 oldboy.txt
-rw-r--r-- 1 root root 127 May 23 14:07 oldboy.txt.zip

5.9 yum模块

name --- 指定下载软件的名称信息
state --- 指定是否下载 卸载
          installed present latest --- 下载安装
          absent removed --- 软件卸载
下载安装软件/卸载软件
[root@m01 ~]# ansible 172.16.1.31 -m yum -a "name=htop state=installed"
[root@m01 ~]# ansible 172.16.1.31 -m yum -a "name=htop state=removed"

5.10 service模块

管理服务启动/停止/重启 ; 管理服务是否开机自动运行或关闭
name --- 定于服务名称
enabled --- 控制服务是否开机自启动
state --- 服务启动状态
         reloaded 平滑重启
         restarted 重启
         started 启动 
         stopped 停止 
[root@m01 ~]# ansible 172.16.1.31 -m service -a "name=nfs state=started"
[root@m01 ~]# ansible 172.16.1.31 -m service -a "name=nfs state=stopped"
[root@m01 ~]# ansible 172.16.1.31 -m service -a "name=nfs state=started enabled=yes"

5.11 cron模块

批量设置定时任务
时间信息参数:
minute 分 0-59, *, */2
hour 时 0-23, *, */2
day 日 1-31, *, */2
month 月 1-12, *, */2 
weekday 周 0-6 for Sunday-Saturday, *, 
正常定时任务设置格式
* * * * * 定时任务信息 &>/dev/null

任务信息定义:
job 定义执行的定时任务信息
name 定义定时任务的注释信息, 注释信息相同的定时任务不会重复设置

扩展参数信息:
state 定义相应定时任务是否删除
       absent 表示删除
       present 表示创建
disabled 定义相应定时任务是否注释
         yes 注释定时任务
         no 取消注释
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name='oldboy01-cron' minute=20 hour=*/2 day=* month=* weekday=* job='/bin/sh /server/scripts/test.sh &>/dev/null'"
[root@nfs01 ~]# crontab -l
#Ansible: None
20 */2 * * * /bin/sh /server/scripts/test.sh &>/dev/null
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name='oldboy02-cron' minute=20 hour=*/2 day=* month=* weekday=* job='/bin/sh /server/scripts/test.sh &>/dev/null'"
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name='oldboy02-cron' minute=20 hour=*/3 day=* month=* weekday=* job='/bin/sh /server/scripts/test.sh &>/dev/null'"
[root@nfs01 ~]# crontab -l
#Ansible: oldboy01-cron
20 */2 * * * /bin/sh /server/scripts/test.sh &>/dev/null
#Ansible: oldboy02-cron
20 */3 * * * /bin/sh /server/scripts/test.sh &>/dev/null
删除指定定时任务
[root@nfs01 ~]# crontab -l
#Ansible: oldboy01-cron
20 */2 * * * /bin/sh /server/scripts/test.sh &>/dev/null
注释指定定时任务
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name='oldboy01-cron' job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=yes"
[root@nfs01 ~]# crontab -l
#Ansible: oldboy01-cron
#* * * * * /bin/sh /server/scripts/test.sh &>/dev/null

01. 任务名称相同,定时任务相同, 不会重复创建定时任务
03. 任务名称相同,定时任务不同, 会对原有名称定时任务进行修改

5.12 mount模块

控制设备信息进行挂载和卸载
path --- 定义挂载点信息
src --- 要被挂载的设备信息
fstype --- 指定挂载的文件系统类型
state --- 指定挂载操作方式(挂载 卸载)

mounted(推荐使用)/present --- 挂载
[root@m01 ~]# ansible 172.16.1.31 -m mount -a "src=172.16.1.31:/data path=/mnt fstype=nfs state=mounted"
[root@nfs01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
172.16.1.31:/data 48G 2.0G 47G 5% /mnt
[root@nfs01 ~]# cat /etc/fstab
172.16.1.31:/data /mnt nfs defaults 0 0
说明: 利用mounted挂载参数, 即完成了设备挂载操作, 又修改了fstab文件信息
[root@m01 ~]# ansible 172.16.1.31 -m mount -a "src=172.16.1.31:/data path=/mnt fstype=nfs state=present"
[root@nfs01 ~]# cat /etc/fstab
172.16.1.31:/data /mnt nfs defaults 0 0
说明: 利用present挂载参数, 不会完成设备挂载操作, 只是修改了fstab文件信息 

unmounted/absent(推荐使用) --- 卸载 
[root@m01 tmp]# ansible 172.16.1.31 -m mount -a "path=/mnt state=unmounted"
说明: 利用unmounted卸载参数, 只完成了设备卸载操作, 不会修改fstab文件信息 
[root@m01 tmp]# ansible 172.16.1.31 -m mount -a "path=/mnt state=absent"
说明: 利用absent卸载参数, 既完成了设备卸载操作, 又删除了fstab文件信息

5.13 user模块

创建新的用户, 给用户设置密码信息

name --- 定义用户名称信息 
password --- 定义用户密码信息(密码信息必须是密文信息)
ps: 密码密文生成方式:
https://docs.ansible.com/ansible/faq.html#how-do-i-generate-crypted-passwords-for-the-user-module
方法一: 
ansible all -i localhost, -m debug -a "msg={{ 'mypassword' | password_hash('sha512', 'mysecretsalt') }}"
mypassword --- 明文密码信息
sha512 --- 明文转换为密文加密方法
mysecretsalt --- 用什么做算法依据生成密文信息
aoldboy123 --->密文的信息 --->sha512(字母--数字+x--字母)
[root@m01 ~]# ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', 'oldboy123') }}"
localhost | SUCCESS => {
"msg": "$6$oldboy123$W3jkmkkVTr.9UStm4S50RT2uIEjB/4GEtaAeVCSZ..uWVN1YGxHvluss9JVfAPV0gSJoGn1qAfxGyttIsTjcz0"
}
方法二: 在centos7中无法使用
mkpasswd --method=sha-512
方法三: 利用python模块功能
yum install python-pip
pip install passlib 
python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"

shell --- 设置用户shell登陆方式, 默认/bin/bash, 虚拟用户应该改为 /sbin/nologin
create_home --- 是否创建家目录 默认yes创建家目录 修改为no 表示不创建家目录
home --- 指定用户家目录信息
move_home --- 是否移动家目录数据信息 默认为no不进行移动 修改为yes 表示移动家目录数据到指定目录
uid --- 指定用户uid数值信息
group --- 指定用户所属的主要组信息
groups --- 指定用户附加组信息
state --- 删除指定用户

创建一个新的用户, 并设置密码(普通用户)
[root@m01 ~]# ansible 172.16.1.31 -m user -a 'name=oldboy01 password=$6$oldboy123$W3jkmkkVTr.9UStm4S50RT2uIEjB/4GEtaAeVCSZ..uWVN1YGxHvluss9JVfAPV0gSJoGn1qAfxGyttIsTjcz0'
说明: 在给用户设置密码信息时, -a 后面要使用单引号信息

创建一个新的用户(虚拟用户)
[root@m01 ~]# ansible 172.16.1.31 -m user -a "name=oldboy02 shell=/sbin/nologin create_home=no"

指定用户uid信息 指定用户所属主要组信息 所属附加组信息
[root@m01 ~]# ansible 172.16.1.31 -m user -a "name=oldboy03 uid=2004 group=oldboy02 groups=oldboy"
[root@nfs01 tmp]# grep 1000 /etc/passwd
oldboy:x:1000:1000::/home/oldboy:/bin/bash
[root@nfs01 tmp]# grep 2004 /etc/passwd
[root@nfs01 tmp]# id oldboy03
uid=2004(oldboy03) gid=1002(oldboy02) groups=1002(oldboy02),1000(oldboy)
[root@nfs01 tmp]# 
[root@m01 ~]# ansible 172.16.1.31 -m user -a "name=oldboy04 uid=2005 group=1001 groups=1002"
[root@nfs01 tmp]# id oldboy04
uid=2005(oldboy04) gid=1001(oldboy01) groups=1001(oldboy01),1002(oldboy02)

对指定用户进行删除
[root@m01 ~]# ansible 172.16.1.31 -m user -a "name=oldboy04 state=absent"

5.14 group模块

添加用户组信息 
name --- 定义创建的组名称信息
gid --- 定义创建的组id数值信息
state --- 用于删除一个用户组

5.15 group模块

主要是获得远程主机信息模块
filter --- 多数据信息进行过滤

# 获取远程主机全部信息
[root@m01 ~]# ansible 172.16.1.31 -m setup

# 获取远程主机指定信息
[root@m01 ~]# ansible 172.16.1.31 -m setup -a "filter=ansible_all_ipv4_addresses"

常用系统信息收集方式:
ansible_all_ipv4_addresses: 仅显示ipv4的信息。
ansible_devices: 仅显示磁盘设备信息。
ansible_distribution: 显示是什么系统,例:centos,suse等。
ansible_distribution_major_version: 显示是系统主版本。
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个数(只显示总的个数)。

6 ansible的各种颜色作用

绿色 --- 检查测试命令,查看信息
黄色 --- 对远程主机有信息修改调整的时候
红色 --- 操作执行错误,报错提示
紫色 --- 警告(忠告建议信息)
蓝色 --- 提示信息,显示命令的执行过程

7 ansible模块使用自学方法

a 参考官方资料
b 参考博文信息
c 参考命令行帮助手册
ansible-doc -l 列出所有模块信息
ansible-doc -s 模块名 列出模块的参数信息
ansible-doc 模块名 列出模块剧本使用方法

8  剧本概念介绍

8.1 剧本作用说明

1) 实现自动化操作 
2) 重复性让剧本完成(减少失误率)

8.2 剧本文件组成部分(playbook)

1) play
定义主机信息
定义身份信息
定义变量信息
设置一些特殊功能
2) task
具有相应主机要完成的任务
完成任务的一些特殊方法 
任务中主要就是设置模块功能

8.3 剧本编写规范说明

必须符合yaml语法规范 
1)空格缩进(两个空格代表一个缩进级别)
级别01
  级别02
    级别03

2)短横线空格
爱好信息:
  - 女
  - 男
  - 不男不女 

3) 冒号空格(变量设置/模块参数指定/参数中具体内容指定)
设置变量:
  oldboy01: file01
设置任务:
  copy:
    name: 第一个步骤:复制文件 
    src: /etc/hosts
    dest: /tmp
    mode: 0644
  PS: 如果冒号出现在结尾或者冒号出现在文件信息中,不需要在后面接空格

9 剧本编写实践

编写前环境准备:
mkdir /etc/ansible/ansible-playbook -p
vim /etc/ansible/hosts
[nfs]
172.16.1.31
172.16.1.7
简单剧本编写方式:
cd /etc/ansible/ansible-playbook
vim test01_playbook.yaml
# 创建文件信息
- hosts: nfs
  tasks:
    - name: 01:create file info
      file: path=/tmp/test01.txt state=touch

扩展: 取消剧本收集远程主机信息功能
加参数gather_facts: no
- hosts: nfs
  gather_facts: no
  tasks:
     - name: 01:create file info
       file: path=/tmp/test01.txt state=touch

10 剧本执行方式

1) 对剧本编写内容进行规范检查
[root@m01 ansible-playbook]# ansible-playbook --syntax-check test01_playbook.yaml
playbook: test01_playbook.yaml

2) 对剧本进行模拟执行
[root@m01 ansible-playbook]# ansible-playbook -C test01_playbook.yaml
# 定义主机组信息
PLAY [nfs] 
*************************
# 进行主机信息收集(比较慢)
TASK [Gathering Facts] 
**************************
ok: [172.16.1.31]
ok: [172.16.1.7]
# 定义具体任务信息
TASK [01:create file info] ******************************
ok: [172.16.1.31]
ok: [172.16.1.7]
# 任务完成结果信息 
PLAY RECAP 
****************************
172.16.1.31 : ok=2 changed=0 unreachable=0 failed=0 
172.16.1.7 : ok=2 changed=0 unreachable=0 failed=0 

3) 执行剧本
[root@m01 ansible-playbook]# ansible-playbook test01_playbook.yaml
[root@web01 ~]# ll /tmp
-rw-r--r-- 1 root root 0 May 24 13:20 test01.txt
[root@backup ~]# ll /tmp
-rw-r--r-- 1 root root 0 May 24 13:20 test01.txt

11 模块完成nfs服务部署操作

11.1 第一个历程: 设置主机清单

vim /etc/ansible/hosts
[nfs:children]
nfsserver
nfsclients

[nfsserver]
172.16.1.31
[nfsclients]
172.16.1.7
172.16.1.41

11.2 第二个历程: 安装软件程序

ansible nfs -m yum -a "name=rpcbind,nfs-utils state=installed"

11.3 第三个历程: 编辑配置文件

a 在管理机上编辑好nfs配置文件
[root@m01 ~]# mkdir /etc/ansible/nfs-server -p
[root@m01 ~]# cd /etc/ansible/nfs-server -p
[root@m01 nfs-server]# cat exports
/data01 172.16.1.0/24(rw,sync)
b 将配置文件传输到相应主机上
ansible nfsserver -m copy -a "src=/etc/ansible/nfs-server/exports dest=/etc/"
[root@nfs01 ~]# cat /etc/exports
/data01 172.16.1.0/24(rw,sync)

11.4 第四个历程: 创建存储目录. 并进行授权

ansible nfsserver -m file -a "path=/data01 state=directory owner=nfsnobody group=nfsnobody" 
[root@nfs01 ~]# ll /data01 -d
drwxr-xr-x 2 nfsnobody nfsnobody 6 May 23 01:06 /data01

11.5 第五个历程: 启动服务程序

ansible nfsserver -m service -a "name='rpcbind.socket' name='nfs' state=started enabled=yes"
[root@nfs01 ~]# rpcinfo -p localhost
检查rpcbind先于nfs启动

11.6 第六个历程: 进行挂载操作

ansible nfsclients -m mount -a "src=172.16.1.31:/data01 path=/mnt fstype=nfs state=mounted"
[root@web01 ~]# touch /mnt/01.txt
[root@nfs01 ~]# ll /data01
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 May 23 01:12 01.txt

12 剧本完成nfs服务部署操作

第一个历程: 设置主机清单
[oldboy]
172.16.1.31
172.16.1.41
172.16.1.7

第二个历程: 编写剧本文件--nfs-playbook
环境准备:
[root@m01 ansible-playbook]#mkdir /etc/ansible/ansible-playbook/conf_file -p
[root@m01 ansible-playbook]#cd ./conf_file
[root@m01 ansible-playbook]#vim export_nfs.temp
/data 712.16.1.0/24(rw,rsync)
[root@nfs01 ~]# >/etc/exports
[root@nfs01 ~]# rpm -qa nfs-utils
nfs-utils-1.3.0-0.68.el7.2.x86_64
[root@nfs01 ~]# systemctl stop nfs
[root@nfs01 ~]# systemctl stop rpcbind.socket
[root@web01 ~]# umount /mnt -lf
[root@web01 ~]# df -h

[root@m01 ansible-playbook]# cd /etc/ansible/ansible-playbook
[root@m01 ansible-playbook]# vim nfs-playbook.yaml
# install nfs server
    - hosts: all
      remote_user: root
      gather_facts: no
      tasks:
        - name: install nfs software
          yum:
            name:
              - nfs-utils
              - rpcbind
            state: installed
            
    - hosts: 172.16.1.31
      remote_user: root
      gather_facts: no
      tasks:
        - name: 01:push exports config_file
          copy: src='./conf_file/export_nfs.temp' dest='/etc/exports'
        - name: 02:create data dir
          file: path='/data' owner=nfsnobody group=nfsnobody state=directory
        - name: 03:boot nfs and rpcbind
          service:
            name: rpcbind.socket
            name: nfs
            state: started
            enabled: yes
          tags: test-nfs-boot
              
    - hosts: 172.16.1.41,172.16.1.7
      remote_user: root 
      gather_facts: no
      tasks:
        - name: 01:mount option
          mount: src='172.16.1.31:/data' path='/mnt' fstype='nfs' state='mounted'

第三个历程: 模拟及执行剧本

[root@m01 ansible-playbook]# ansible-playbook -C nfs-playbook.yaml 
[root@m01 ansible-playbook]# ansible-playbook nfs-playbook.yaml 

13 剧本执行异常排错流程

1) 重复执行一遍
ansible-playbook nfs-playbook.yaml

2) 定位异常问题位置, 将异常剧本内容转换成模块测试执行
ansible 172.16.1.31 -m service -a "name='rpcbind.socket' name='nfs' state=started enabled=yes"

3) 将模块操作信息转换成命令,在远程主机上直接执行测试
systemct start nfs rpcbind.socket

14  剧本编写特殊功能

14.1 在剧本中设置变量信息

1) 剧本有重复信息一旦进行调整,比较复杂
示例变量: dir=oldboy
copy src=/"dir"/oldboy01.txt dest=/etc/
copy src=/"dir"/oldboy02.txt dest=/opt/
copy src=/"dir"/oldboy03.txt dest=/usr/
2) 剧本中可以设置多个配置文件的变量信息,便于在剧本直接修改配置文件
示例变量:
nfs_port_num=
nginx_port_num=
rsync_port_num=
有一个服务配置文件rsync.conf.temp中port="port_num" 端口号需要经常变化

14.2 在剧本中设置注册信息

多剧本操作结果进行验证
netstat -lntup|grep sshd->注册->port_info变量 ->在剧本执行完将port_info变量进行输出

14.3 在剧本中设置判断信息

对不同的主机进行分类操作
架构中有不同的linux系统主机清单示例:
[oldboy]
centos httpd
ubunt  httpd2
debian httpd3
suse   httpd4

如:安装应用程序软件
判断: 如果系统==centos
yum: name="httpd" state=installed
判断: 如果系统==debian
yum: name="httpd3" state=installed

14.4 在剧本中设置循环信息

如:创建五个用户信息
user: name="user_info"
循环:user_info=01
     user_info=02

14.5 在剧本中设置错误忽略

剧本默认执行特性: 一旦出现错误,就停止剧本的执行操作
错误忽略功能, 先让剧本执行完毕
剧本中使用大量shell模块所准备的

14.6 在剧本中设置标签信息

单独在指定位置定义标签信息,可以让剧本只指定标签定义的任务
便于进行测试排错

14.7 在剧本中设置触发信息

15 剧本中设置变量信息

15.1 设置的方法

1) 直接在剧本中定义变量,并进去调取 vars:
2) 直接在命令中定义变量,并进行调取 --extra-vars
3) 直接在主机清单定义变量,并进行调取 变量名=变量值

15.2 在剧本中设置

[root@m01 ansible-playbook]# cat test_var.yaml

- hosts: oldboy
remote_user: root
vars:
file_info: oldboy01.txt
dir_info: /oldboy/
tasks:
- name: create dir
file: path={{ dir_info }} state=directory
- name: copy data info
copy: src={{ dir_info }}{{ file_info }} dest={{ dir_info }}

15.3 在命令中设置变量

ansible-playbook -e dir_info=/oldboy/ -e file_info=oldboy01.txt test_var.yaml

15.4 在主机清单设置变量

[oldboy:vars]
dir_info=/oldboy/
file_info=oldboy01.txt
[oldboy]
172.16.1.31
172.16.1.41
172.16.1.7

15.5 结论

三种变量同时设置的优先级
01. 在剧本中设置变量 file_info oldboy01.txt 次优先02
02. 在命令中设置变量 file_info oldboy02.txt 最优先01
03. 在主机清单中设置 file_info oldboy03.txt 最不优先03

16 在剧本中设置注册信息

16.1 简介

[root@m01 ansible-playbook]# vim nfs-playbook.yaml 
# install nfs server
- hosts: all
  remote_user: root
  gather_facts: no
  tasks:
    - name: install nfs software
      yum:
        name:
          - nfs-utils
          - rpcbind
        state: installed
- hosts: 172.16.1.31
  remote_user: root
  gather_facts: no
  tasks:
    - name: 01:push exports config_file
      copy: src='./conf_file/export_nfs.temp' dest='/etc/exports'
    - name: 02:create data dir
      file: path='/data' owner=nfsnobody group=nfsnobody state=directory
    - name: 03:boot nfs and rpcbind
      service:
        name: rpcbind.socket
        name: nfs
        state: started
        enabled: yes
      tags: test-nfs-boot
    - name: 04:check rpc server port info
      shell: netstat -lntup|grep 111 
      register: check_port_info 

    - name: output check info
      debug: msg={{ check_port_info.stdout_lines }}
01. 执行命令操作产生信息
02. 将产生信息注册给一个指定的变量
03. 利用debug模块中msg参数将注册变量信息进行调取,并标准输出

16.2 输出nfs客户端主机挂载信息

第一步: 在客户端执行命令进行检查测试

[root@backup ~]# df -h|grep "172.16.1.31"
172.16.1.31:/data 48G 1.6G 47G 4% /mnt

第二步: 编写剧本信息,实现注册功能

- hosts: 172.16.1.41,172.16.1.7
  remote_user: root
  gather_facts: no
  tasks:
    - name: 01:mount option
      mount: src='172.16.1.31:/data' path='/mnt' fstype='nfs' state='mounted'
    - name: 02:check mount info
      shell: df -h|grep "172.16.1.31"
      register: mount_info
    - name: output info
      debug: msg={{ mount_info.stdout_lines }}

17. 在剧本中设置判断信息

17.1 测试1

剧本中判断信息需要调取setup模块获取到的主机内置变量信息,用作判断
如果IP地址=172.16.1.7(web01) 推送oldboy/oldboy01 文件到172.16.1.7的/tmp
如果IP地址=172.16.1.31(nfs01) 推送oldboy/oldboy02 文件到172.16.1.31的/tmp
如果IP地址=172.16.1.41(backup) 推送oldboy/oldboy03 文件到172.16.1.41的/tmp

剧本内容信息

[root@m01 ansible-playbook]# cat test_judge.yaml
- hosts: oldboy
  remote_user: root
  tasks:
    - name: push file01 info
      copy: src="/oldboy/oldboy01.txt" dest=/tmp/
      when: (ansible_hostname == 'web01')
    - name: push file02 info
      copy: src="/oldboy/oldboy02.txt" dest=/tmp/
      when: (ansible_hostname == 'nfs01')
    - name: push file03 info
      copy: src="/oldboy/oldboy03.txt" dest=/tmp/
      when: (ansible_hostname == 'backup')
[root@m01 ansible-playbook]# ansible-playbook test_judge.yaml

17.2 测试2

当主机名是web01 并且系统为centos, 就把/oldboy/oldboy01.txt 文件推送到主机/opt目录

剧本编写信息

[root@m01 ansible-playbook]# cat test_judge02.yaml
- hosts: oldboy
  remote_user: root
  tasks:
    - name: push file info
      copy: src=/oldboy/oldboy01.txt dest=/opt/
      when: (ansible_hostname == "web01") and (ansible_distribution == "CentOS")
[root@m01 ansible-playbook]# ansible-playbook test_judge02.yaml

18 在剧本中设置循环信息

18.1 测试1

a 同一个模块中的参数在同一个任务中出现多次,就可以使用循环功能
b 同一个模块在同一个任务中出现多次,就可以使用循环功能

[root@m01 ansible-playbook]# cat test_loop.yaml
- hosts: oldboy
  tasks:
    - name: create user info
      user: name={{ item.name }} uid={{ item.uid }} shell={{ item.shell }}
      with_items:
        - { name: "alex01", uid: "3001", shell: "/sbin/nologin" }
        - { name: "alex02", uid: "3002", shell: "/sbin/nologin" }
        - { name: "alex03", uid: "3003", shell: "/sbin/nologin" }

18.2 实际应用循环到nfs部署剧本

启动服务可以设置循环

vim nfs-playbook.yaml
- hosts: 172.16.1.31
  remote_user: root
  gather_facts: no
  tasks:
    - name: 01:push exports config_file
      copy: src='./conf_file/export_nfs.temp' dest='/etc/exports'
    - name: 02:create data dir
      file: path='/data' owner=nfsnobody group=nfsnobody state=directory
    - name: 03:boot nfs and rpcbind
      service: name={{ item }} state=started enabled=yes
      with_items:
       - rpcbind.socket
       - nfs

18.3 取消警告方法

vim /etc/ansible/ansible.cfg
deprecation_warnings = false 配置关闭警告参数

18.4 最终nfs完善剧本信息

[root@m01 ansible-playbook]# cat nfs-playbook.yaml
# install nfs server
- hosts: all
  remote_user: root
  gather_facts: no
  tasks:
    - name: install nfs software
      yum:
        name:
          - nfs-utils
          - rpcbind
        state: installed

- hosts: 172.16.1.31
  remote_user: root
  gather_facts: no
  tasks:
    - name: 01:push exports config_file
      copy: src='./conf_file/export_nfs.temp' dest='/etc/exports'
      notify: restart nfs server
    - name: 02:create data dir
      file: path='/data' owner=nfsnobody group=nfsnobody state=directory
    - name: 03:boot nfs and rpcbind
      service: name={{ item }} state=started enabled=yes
      with_items:
        - rpcbind.socket
        - nfs
    - name: 04:check rpc server port info
      shell: netstat -lntup|grep 111
      register: check_port_info
      tags: check_port

    - name: output check info
      debug: msg={{ check_port_info.stdout_lines }}
      tags: output
  handlers:
    - name: restart nfs server
      service: name=nfs state=restarted

- hosts: all
  remote_user: root
  gather_facts: no
  tasks:
    - name: 01:boot nfs and rpcbind
      service:
        name: nfs
        state: restarted
        enabled: yes
      tags: test-nfs
 
- hosts: 172.16.1.41,172.16.1.7
  remote_user: root
  gather_facts: no
  tasks:
    - name: 01:mount option
      mount: src='172.16.1.31:/data' path='/mnt' fstype='nfs' state='mounted'
    - name: 02:check mount info
      shell: df -h|grep "172.16.1.31"
      register: mount_info
      tags: check_info

    - name: output info
      debug: msg={{ mount_info.stdout_lines }}
      tags: output_info

19 剧本标签功能

19.1 作用

默认剧本执行过程, 会将所有任务进行执行,用于调试剧本
如果只想让剧本中某些任务执行, 就可以使用标签功能
如果只想让剧本中除了某些任务不要执行,其他任务都执行,可以使用标签功能

19.2 只让指定任务执行

[root@m01 ansible-playbook]#vim nfs-nfs-playbook.yaml
  - name: 04:check rpc server port info
    shell: netstat -lntup|grep 111
    register: check_port_info
    tags: check_port

    - name: output check info
      debug: msg={{ check_port_info.stdout_lines }}
      tags: output
[root@m01 ansible-playbook]# ansible-playbook -t check_port -t output nfs-playbook.yaml

19.3 不让指定任务执行

    - name: install nfs software
      yum: 
      name: ['nfs-utils','rpcbind' ]
      state: installed
      tags: install_software
ansible-playbook --skip-tags=install_software nfs-playbook.yaml

20 剧本忽略错误功能

用于调试剧本,忽略错误参数有时会更多用在shell模块下面
默认剧本执行过程,一旦出现报错,剧本执行过程立即结束
ignore_errors: yes  --- 忽略指定任务错误
忽略错误配置
- name: install nfs software
      yum:
      name: ['nfs-utils','rpcbind' ]
      stat: installed
      tags: install_software
      ignore_errors: yes      --- 忽略错误参数

21 剧本触发器功能

当做了什么事之后,就完成什么触发操作
实践操作01: 当配置文件发生改变,就重启相应服务
tasks:
  - name: 01:push exports config_file
    copy: src='./conf_file/export_nfs.temp' dest='/etc/exports'
    notify: restart nfs server  #--- 触发器名字 

handlers:
  - name: restart nfs server
    service: name=nfs state=restarted

22 rsync服务一键化部署

[root@m01 ansible-playbook]# cat rsync-playbook.yaml 
- hosts: all
  remote_user: root
  tasks:
    - name: install rsync software
      yum: name=rsync state=installed
      tags: install

- hosts: 172.16.1.41
  tasks:
    - name: 01:copy rsync conf & password file
      copy: src=conf_file/{{ item.src }} dest=/etc/{{ item.dest }} mode={{ item.mode }}
      with_items:
        - {src: 'rsyncd.conf.temp',dest: 'rsyncd.conf',mode: '0644'}
        - {src: 'rsync.password.temp',dest: 'rsync.password',mode: '0600'}
      notify: restart rsync server
    - name: 02:create user info
      user: name=rsync shell=/sbin/nologin create_home=no
    - name: 03:create backup dir
      file: path={{ item }} owner=rsync group=rsync state=directory
      with_items:
        - /backup/
        - /backup_dev/
        - /backup_dba/
        - /data/
    - name: 04:boot rsync server
      service: name=rsyncd state=started
    - name: 05:check server
      shell: netstat -lntup|grep 873
      register: check_pass
      tags: check_port
    - name: 06:output
      debug: msg={{ check_pass.stdout_lines }}
      tags: output_port
  handlers:
    - name: restart rsync server
      service: name=rsyncd state=restarted

- hosts: 172.16.1.31,172.16.1.7
  tasks:
    - name: 01:create pass file
      file: content="oldboy123\n" path=/etc/rsync.password mode=600 state=touch
    - name: 02:edit file info
      shell: echo oldboy123 >/etc/rsync.password
    - name: push check
      shell: rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
      register: check_pass
      tags: check
    - name: output info
      debug: msg={{ check_pass.stdout_lines }}
      tags: output

23 多个剧本进行汇总整合

23.1 利用指令参数 (roles)

       - include_tasks: 剧本名称01
       - include_tasks: 剧本名称02
说明: 采用第一种方式,需要规划剧本中的hosts信息,最好为all

23.2 利用指令参数include (已废弃)

       - include: 剧本名称01
       - include: 剧本名称02
说明: 会有警告提示

23.3 利用指令参数import_playbook

- import_playbook: 剧本名称01
- import_playbook: 剧本名称02

24 ansible角色概念

24.1 角色作用

01 让剧本编写更加规范
02 方便在汇总文件中显示主机信息
[root@m01 ansible-playbook]# cat site.yaml
- hosts: 172.16.1.31
  roles:
    - {role: 'nfs-playbook.yaml'}

- hosts: 172.16.1.41
  roles:
    - {role: 'rsync-playbook.yaml'}

24.2 实现roles部署

24.2.1 第一步: 有角色信息

[root@m01 ansible]#mkdir /etc/ansible/roles/{nfs,rsync}
[root@m01 ansible]# tree roles/
    roles/
    ├── nfs
    └── rsync

24.2.2 第二步: 在角色目录中创建相应子目录

    [root@m01 roles]#mkdir {nfs,rsync}/{vars,tasks,templates,handlers,files}
    [root@m01 roles]# mkdir {nfs,rsync}/{vars,tasks,templates,handlers,files}
    [root@m01 roles]# tree
    ├── nfs
    │ ├── files       --- 保存要推送的文件信息  ok         保存真正配置文件  copy模块推送      所见即所得
    │ ├── handlers    --- 保存触发器剧本文件    ok
    │ ├── tasks       --- 保存任务剧本文件      ok
    │ ├── templates   --- 保存模板文件目录  jinja模板      保存模板配置文件  template模块推送  可以识别变量
    │ └── vars        --- 保存变量文件目录      ok
    └── rsync
        ├── files
        ├── handlers
        ├── tasks
        ├── templates
        └── vars
[root@m01 nfs]# cp /etc/ansible/ansible-playbook/conf_file/export_nfs.temp /etc/ansible/roles/nfs/files/export<br />[root@m01 nfs]# ll files/export <br />-rw-r--r-- 1 root root 33 Aug 1 23:23 files/export

24.2.3 第三步: 在相应目录中编辑nfs剧本文件

1. vars目录剧本文件编写
[root@m01 vars]# cat main.yaml
    data_dir: /data
2. task目录剧本文件编写汇总所有任务信息

[root@m01 tasks]# vim main.yaml
- name: 01:install nfs software
  yum:
    name: ['nfs-utils','rpcbind' ]
    state: installed
  tags: install_software
  ignore_errors:yes

- name: 02:push exports config_file
  copy: src='export' dest='/etc/'
  when: (ansible_eth1.ipv4.address == '172.16.1.31')
  notify: restart nfs server

- name: 03:create data dir
  file: path={{ data_dir }} owner=nfsnobody group=nfsnobody state=directory
  when: (ansible_eth1.ipv4.address == '172.16.1.31')

- name: 04:boot nfs and rpcbind
  service: name={{ item }} state=started enabled=yes
  with_items:
    - rpcbind.socket
    - nfs
  when: (ansible_eth1.ipv4.address == '172.16.1.31')

- name: 05:check rpc server port info
  shell: netstat -lntup|grep 111
  when: (ansible_eth1.ipv4.address == '172.16.1.31')
  register: check_port_info
  tags: check_port
  
- name: 06:output check info
  debug: msg={{ check_port_info.stdout_lines }}
  when: (ansible_hostname == 'nfs01')

- name: 07:mount option
  mount: src='172.16.1.31:/data' path='/mnt' fstype='nfs' state='mounted'
  when: (ansible_eth1.ipv4.address == '172.16.1.41') or (ansible_eth1.ipv4.address == '172.16.1.7')
task目录剧本文件编写拆分所有任务信息
[root@m01 tasks]#vim yum.yaml
- name: 01:install nfs software
  yum:
    name: ['nfs-utils','rpcbind' ]
    state: installed
[root@m01 tasks]#vim conf.yaml
- name: 02:push exports config_file
  copy: src='export' dest='/etc/'
  when: (ansible_eth1.ipv4.address == '172.16.1.31')
  notify: restart nfs server
[root@m01 tasks]#vim main.yaml
- include_task: yum.yaml
- include_task: conf.yaml
3.  headler目录剧本文件编写拆分所有任务信息
[root@m01 handlers]# vim main.yaml
    - name: restart nfs server
      service: name=nfs state=restarted
4.  编写汇总文件
cd /etc/ansible/roles
vim site.yaml
- hosts: oldboy
roles:
- {role: 'nfs'}
[root@m01 roles]# ansible-playbook site.yaml

24.3 角色模式执行剧本遇到的问题

01. 缩进出现问题了
02. 判断变量信息时, 判断的数值内容信息需要加引号(单 双)
03. 默认当一个任务执行失败,后续任务不会执行

24.4 角色变量的设置方法

1) 在相应角色目录中vars目录中设置角色变量文件
2) 在roles目录中创建一个group_vars文件, 在组变量文件中进行变量定义
3) 在host主机清单进行定义 [oldboy:vars]

24.5 主机清单进行分类编写

ansible-playbook -i hosts_rsync ansible-playbook/test_hosts.yaml
新版,在一个主机清单中进行规划就可以了
赞(0)
MySQL学习笔记 » 第19章:ansible批量管理