文章目录
- 1 ansible介绍
- 1.1 ansible服务存在意义
- 1.2 ansible软件功能作用
- 1.3 ansible软件 特点介绍
- 2 ansible部署过程
- 3 ansible结构
- 4 ansible主机清单配置方式
- 4.1 方式一: 定义一个主机组(主机信息)
- 4.2 方式二: 定义主机配置信息
- 4.3 方式三: 划分子组配置方式
- 4.4 方式四: 定义变量方式配置清单
- 4.5 方式五: 利用符号匹配方式配置
- 5 ansible模块使用
- 5.1 查看模块
- 5.2 commands modules模块
- 5.3 script脚本模块
- 5.4 shell万能模块
- 5.5 copy模块
- 5.6 fetch模块
- 5.7 file模块
- 5.7 archive模块
- 5.8 unarchive模块
- 5.9 yum模块
- 5.10 service模块
- 5.11 cron模块
- 5.12 mount模块
- 5.13 user模块
- 5.14 group模块
- 5.15 group模块
- 6 ansible的各种颜色作用
- 7 ansible模块使用自学方法
- 8 剧本概念介绍
- 8.1 剧本作用说明
- 8.2 剧本文件组成部分(playbook)
- 8.3 剧本编写规范说明
- 9 剧本编写实践
- 10 剧本执行方式
- 11 模块完成nfs服务部署操作
- 11.1 第一个历程: 设置主机清单
- 11.2 第二个历程: 安装软件程序
- 11.3 第三个历程: 编辑配置文件
- 11.4 第四个历程: 创建存储目录. 并进行授权
- 11.5 第五个历程: 启动服务程序
- 11.6 第六个历程: 进行挂载操作
- 12 剧本完成nfs服务部署操作
- 13 剧本执行异常排错流程
- 14 剧本编写特殊功能
- 14.1 在剧本中设置变量信息
- 14.2 在剧本中设置注册信息
- 14.3 在剧本中设置判断信息
- 14.4 在剧本中设置循环信息
- 14.5 在剧本中设置错误忽略
- 14.6 在剧本中设置标签信息
- 14.7 在剧本中设置触发信息
- 15 剧本中设置变量信息
- 15.1 设置的方法
- 15.2 在剧本中设置
- 15.3 在命令中设置变量
- 15.4 在主机清单设置变量
- 15.5 结论
- 16 在剧本中设置注册信息
- 16.1 简介
- 16.2 输出nfs客户端主机挂载信息
- 17. 在剧本中设置判断信息
- 17.1 测试1
- 17.2 测试2
- 18 在剧本中设置循环信息
- 18.1 测试1
- 18.2 实际应用循环到nfs部署剧本
- 18.3 取消警告方法
- 18.4 最终nfs完善剧本信息
- 19 剧本标签功能
- 19.1 作用
- 19.2 只让指定任务执行
- 19.3 不让指定任务执行
- 20 剧本忽略错误功能
- 21 剧本触发器功能
- 22 rsync服务一键化部署
- 23 多个剧本进行汇总整合
- 23.1 利用指令参数 (roles)
- 23.2 利用指令参数include (已废弃)
- 23.3 利用指令参数import_playbook
- 24 ansible角色概念
- 24.1 角色作用
- 24.2 实现roles部署
- 24.2.1 第一步: 有角色信息
- 24.2.2 第二步: 在角色目录中创建相应子目录
- 24.2.3 第三步: 在相应目录中编辑nfs剧本文件
- 24.3 角色模式执行剧本遇到的问题
- 24.4 角色变量的设置方法
- 24.5 主机清单进行分类编写
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
具有相应主机要完成的任务
完成任务的一些特殊方法
任务中主要就是设置模块功能
第一个历程: 在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
具有相应主机要完成的任务
完成任务的一些特殊方法
任务中主要就是设置模块功能
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
具有相应主机要完成的任务
完成任务的一些特殊方法
任务中主要就是设置模块功能
绿色 --- 检查测试命令,查看信息 黄色 --- 对远程主机有信息修改调整的时候 红色 --- 操作执行错误,报错提示 紫色 --- 警告(忠告建议信息) 蓝色 --- 提示信息,显示命令的执行过程
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.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 在剧本中设置
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 在剧本中设置
第一个历程: 设置主机清单 [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 在剧本中设置
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
新版,在一个主机清单中进行规划就可以了
[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
用于调试剧本,忽略错误参数有时会更多用在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
新版,在一个主机清单中进行规划就可以了
[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.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
新版,在一个主机清单中进行规划就可以了
[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
新版,在一个主机清单中进行规划就可以了