一、ansible批量管理服务介绍
1.ansible批量管理服务意义
#提高工作的效率
#提高工作准确度
#减少维护的成本
#减少重复性工作
2.ansible批量管理服务功能
#可以实现批量系统操作配置
#可以实现批量软件服务部署
#可以实现批量文件数据分发
#可以实现批量系统信息收集
3.ansible批量管理的前提
#管理端实现基于ssh秘钥连接被管理的客户端,此时管理端通过ansible批量管理客户端
#参考文档:https://blog.csdn.net/qq_41938046/article/details/108103028
二、ansible批量管理服务部署
1.第一个历程:安装部署软件(管理端)
#安装软件需要依赖epel的yum源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#安装ansible软件
yum install -y ansible
#ansible重要文件
rpm -ql ansible|more
/etc/ansible/ansible.cfg #ansible服务配置文件
/etc/ansible/hosts #主机清单文件(定义可以管理的主机信息)
/etc/ansible/roles #角色目录
2.第二个历程:需要编写主机清单文件(按照架构信息配置主机清单)
vim /etc/ansible/hosts
192.1.1.21
192.1.1.22
192.1.1.23
192.1.1.24
192.1.1.25
192.1.1.26
192.1.1.27
192.1.1.28
192.1.1.29
192.1.1.30
192.1.1.31
3.第三个历程:通过ansible管理多个主机
ansible all -a "hostname"
192.1.1.21 | CHANGED | rc=0 >>
lb01
192.1.1.22 | CHANGED | rc=0 >>
lb02
192.1.1.23 | CHANGED | rc=0 >>
web01
192.1.1.24 | CHANGED | rc=0 >>
web02
192.1.1.25 | CHANGED | rc=0 >>
web03
三、ansible服务架构信息
1.主机清单配置
2.软件模块信息
3.基于秘钥连接主机
4.主机需要关闭selinux
5.软件剧本功能
6.准备好管理服务端和被管理客户端
管理服务端 | 计算机名称 | 外网地址 | 内外地址 |
---|---|---|---|
批量管理服务器 | m01 | 172.1.1.29 | 192.1.1.29 |
被管理客户端 | 计算机名称 | 外网地址 | 内外地址 |
负载均衡服务器 | lb01 | 172.1.1.21 | 192.1.1.21 |
负载均衡服务器 | lb02 | 172.1.1.22 | 192.1.1.22 |
web服务器 | web01 | 172.1.1.23 | 192.1.1.23 |
web服务器 | web02 | 172.1.1.24 | 192.1.1.24 |
web服务器 | web03 | 172.1.1.25 | 192.1.1.25 |
数据库服务器 | db01 | 172.1.1.26 | 192.1.1.26 |
存储服务器 | nfs01 | 172.1.1.27 | 192.1.1.27 |
备份服务器 | backup | 172.1.1.28 | 192.1.1.28 |
跳板机服务器 | jumpserver | 172.1.1.30 | 192.1.1.30 |
监控服务器 | zabbix | 172.1.1.31 | 192.1.1.31 |
四、ansible模块
1.ansible官方网站
用户指南:https://docs.ansible.com/ansible/latest/user_guide/index.html
官方网站:https://docs.ansible.com/
2.模块的应用语法格式
ansible 主机名称/主机组名称/主机地址信息/all -m(指定应用的模块信息) 模块名称 -a(指定动作信息) "执行什么动作"
3.官方介绍模块分类
- All modules
- Cloud modules
- Clustering modules
- Commands modules
- Crypto modules
- Database modules
- Files modules
- Identity modules
- Inventory modules
- Messaging modules
- Monitoring modules
- Net Tools modules
- Network modules
- Notification modules
- Packaging modules
- Remote Management modules
- Source Control modules
- Storage modules
- System modules
- Utilities modules
- Web Infrastructure modules
- Windows modules
4.ansible软件输出信息颜色说明
绿色信息 #查看主机信息/对主机未做改动
黄色信息 #对主机数据信息做了修改
红色信息 #命令执行出错了
粉色信息 #忠告信息
蓝色信息 #显示ansible命令执行的过程
5.ansible查看帮助手册
ansible-doc -l #列出模块使用简介
ansible-doc -s shell #指定一个模块详细说明
ansible-doc shell #查询模块在剧本中应用方法
五、ansible命令类模块
1.command模块(默认模块)
#官方介绍:https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module
#简单用法
ansible 192.1.1.21 -m command -a "hostname"
192.1.1.21 | CHANGED | rc=0 >>
lb01
#扩展应用
chdir在执行命令之前对目录进行切换
ansible 192.1.1.21 -m command -a "chdir=/tmp touch test.txt"
creates如果文件存在了,不执行命令操作
ansible 192.1.1.21 -m command -a "creates=/tmp/hosts touch test.txt"
skipped, since /tmp/hosts exists #文件存在的时候跳过
removes如果文件存在了,这个步骤将执行
ansible 192.1.1.21 -m command -a "removes=/tmp/hosts chdir=/tmp touch test.txt"
#注意事项
使用command模块的时候,-a参数后面必须写上一个合法linux命令信息
有些符号信息无法识别:< > | ; &
2.shell模块(万能模块)
#官方介绍:https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module
#简单用法
ansible 192.1.1.21 -m shell -a "hostname"
192.1.1.21 | CHANGED | rc=0 >>
lb01
#拓展用法
chdir在执行命令之前对目录进行切换
ansible 192.1.1.21 -m shell -a "chdir=/tmp touch test.txt"
creates如果文件存在了,不执行命令操作
ansible 192.1.1.21 -m shell -a "creates=/tmp/hosts touch test.txt"
skipped, since /tmp/hosts exists #文件存在的时候跳过
removes如果文件存在了,这个步骤将执行
ansible 192.1.1.21 -m shell -a "removes=/tmp/hosts chdir=/tmp touch test.txt"
#注意事项
使用shell模块的时候,-a参数后面必须写上一个合法linux命令信息
由的命令使用shell模块的时候,不能反复被执行(反复执行会报错)
#利用shell模块执行脚本
第一个步骤:服务端编写一个脚本
vim /server/scripts/install.sh
#!/bin/bash
software=htop
yum install -y $software
第二个步骤:客户端安装免交互软件
ansible all -m shell -a "yum install -y sshpass"
第二个步骤:客户端从服务端拉取脚本文件
ansible all -m shell -a "sshpass -p123456 scp -rpo 'StrictHostKeyChecking no' [email protected]:/server/scripts/install.sh /server/scripts"
#sshpass -p123456跳过密码输入
#-o 'StrictHostKeyChecking no'跳过交互过程中的yes/no的确认过程
第三个步骤:确认文件已经传输到客户端
ansible all -m shell -a "ls /server/scripts/install.sh"
第四个步骤:将脚本权限进行修改(添加执行权限)
ansible all -m shell -a "chmod +x /server/scripts/install.sh"
第五个步骤:执行脚本
ansible all -m shell -a "sh /server/scripts/install.sh"
第六个步骤:检查软件是否安装
ansible all -m shell -a "rpm -qa htop"
第七个步骤:删除软件
ansible all -m shell -a "rpm -e htop "
3.script模块(脚本模块)
#官方介绍:https://docs.ansible.com/ansible/latest/modules/script_module.html#script-module
#利用script执行脚本
第一个步骤:服务端编写一个脚本
vim /server/scripts/install.sh
#!/bin/bash
software=htop
yum install -y $software
第二个步骤:执行脚本
ansible all -m script -a "sh /server/scripts/install.sh"
#scripts模块参数功能和command模块类似
六、ansible文件类模块
1.copy模块(批量分发文件)
#官方介绍:https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module
#管理端 ---> 被管理服务端
#基本用法
ansible 192.1.1.21 -m copy -a "src=/etc/hosts dest=/home"
192.1.1.21 | CHANGED => {
#对哪台主机进行操作
"ansible_facts":{
"discovered_interpreter_python":"/usr/bin/python"
},
"changed":true, #是否对主机信息进行改变
"checksum":"c6f27a462f8e262f6619e0207e306cfbaab5f517", #生成一个文件校验码==MD5数值
"dest":"/home/hosts", #显示目标路径信息
"gid":0, #显示复制后文件gid信息
"group":"root", #显示复制后文件属组信息
"md5sum":"e36984f13af1ef1b28d39da6c692dbc3", #生成一个文件校验码==MD5数值
"mode":"0644", #显示复制后文件权限信息
"owner":"root", #显示复制后文件属主信息
"size":335, #显示文件的大小信息
"src":"/root/.ansible/tmp/ansible-tmp-1597304972.82-9109-255091682397955/source",
"state":"file", #显示文件的类型信息
"uid":0 #显示复制后文件uid信息
}
#扩展用法
owner在传输文件时修改文件的属主新
group在传输文件时修改文件的属组信息
mode在传输文件时修改文件的权限信息
ansible 192.1.1.21 -m copy -a "src=/etc/hosts dest=/home owner=yangwn group=yangwn mode=1777"
backup在传输数据文件信息时对远程主机源文件进行备份
ansible 192.1.1.21 -m copy -a "src=/etc/hosts dest=/home backup=yes"
content创建一个文件并直接编辑文件的信息
ansible 192.1.1.21 -m copy -a "content='测试信息' dest=/home/test.txt"
remote_src可以指定移动的源文件是管理端的还是被管理端的,默认是关闭的
ansible 192.1.1.21 -m copy -a "src=/etc/hosts dest=/home" #远程传输文件,默认源文件是管理端的
ansible 192.1.1.21 -m copy -a "src=/etc/hosts dest=/home remote_src=yes" #远程移动文件,此时源文件是被管理端的
src后面目录没有/将目录本身以及目录下面的内容都进行远程传输复制
ansible 192.1.1.21 -m copy -a "src=/root dest=/home"
src后面目录有/只将目录下面的内容都进行远程传输复制
ansible 192.1.1.21 -m copy -a "src=/root/ dest=/home"
2.fetch模块(批量拉取数据)
#官方介绍:https://docs.ansible.com/ansible/latest/modules/fetch_module.html#fetch-module
#管理端 <--- 被管理客户端
#基本用法
ansible 192.1.1.21 -m fetch -a "src=/etc/hosts dest=/home" #保存的时候使用hostname来进行保存(拉取的时候能拉取的是多台客户端,方便区分)
192.1.1.21 | CHANGED => {
"changed":true,
"checksum":"c6f27a462f8e262f6619e0207e306cfbaab5f517",
"dest":"/home/192.1.1.21/etc/hosts",
"md5sum":"e36984f13af1ef1b28d39da6c692dbc3",
"remote_checksum":"c6f27a462f8e262f6619e0207e306cfbaab5f517",
"remote_md5sum":null
}
3.file模块(设置文件属性信息)
#官方介绍:https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module
#基本用法
ansible 192.1.1.21 -m file -a "dest=/etc/hosts owner=root group=root mode=666"
#扩展用法
state=directory创建目录信息(可以创建多级目录)
ansible 192.1.1.21 -m file -a "dest=/test/ state=directory"
ansible 192.1.1.21 -m file -a "dest=/test/01/02/03/ state=directory"
state=touch创建文件信息
ansible 192.1.1.21 -m file -a "dest=/test/1.txt state=touch"
state=hard创建硬链接文件
ansible 192.1.1.21 -m file -a "src=/test/1.txt dest=/test/1.txt_hard.txt state=hard"
state=link创建软链接文件
ansible 192.1.1.21 -m file -a "src=/test/1.txt dest=/test/1.txt_link.txt state=link"
state=file检查数据是否存在
ansible 192.1.1.21 -m file -a "dest=/test/1.txt state=file"
state=absent删除数据信息(可以删除文件也可以删除目录)
ansible 192.1.1.21 -m file -a "dest=/test/1.txt state=absent"
ansible 192.1.1.21 -m file -a "dest=/test state=absent"
recurse可以在目录内容上递归设置指定的文件属性,默认是关闭的
ansible 192.1.1.21 -m file -a "dest=/test recurse=yes owner=yangwn group=yangwn mode=777"
ansible 192.1.1.21 -m file -a "dest=/test owner=yangwn group=yangwn mode=777"
七、ansible其他模块
1.yum模块
name --- 指定安装软件名称
state --- 指定是否安装软件
installed/present/latest 安装软件
removed/absent 卸载软件
ansible 192.1.1.21 -m yum -a "name=iotop state=installed"
2.service模块
name --- 指定管理的服务名称
state --- 指定服务状态
started 启动
restarted 重启
stopped 停止
enabled --- 指定服务是否开机自启动
ansible 192.1.1.21 -m service -a "name=nfs state=started enabled=yes"
3.cron模块
minute --- 设置分钟信息
hour --- 设置小时信息
day --- 设置日期信息
month --- 设置月份信息
weekday --- 设置周信息
job --- 用于定义定时任务需要干的事情
#基本用法
ansible 192.1.1.21 -m cron -a "minute=0 hour=2 job='/usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1'"
#拓展用法
定时任务设置注释信息
ansible 192.1.1.21 -m cron -a "name='时间同步定时任务' minute=0 hour=2 job='/usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1'"
删除定时任务(只能是通过ansible设置好的定时任务)
ansible 192.1.1.21 -m cron -a "name='时间同步定时任务' state=absent"
注释定时任务
ansible 192.1.1.21 -m cron -a "name='时间同步定时任务' job='/usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1' disabled=yes"
取消注释定时任务
ansible 192.1.1.21 -m cron -a "name='时间同步定时任务' job='/usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1' disabled=no"
4.mount模块
src --- 需要挂载的存储设备或文件信息
path --- 指定目标挂载点目录
fstype --- 指定挂载时的文件系统类型
state --- 指定挂载或者卸载
present 新增挂载信息到/etc/fstab,实现开机自动挂载(重启生效)
mounted 新增挂载信息到/etc/fstab,实现开机自动挂载(立即生效)
absent 会从/etc/fstab文中删除挂载信息,禁止开机自动挂载(立即生效)
unmounted 不会从/etc/fstab文中删除挂载信息,禁止开机自动挂载(立即生效)
ansible 192.1.1.21 -m mount -a "src=192.1.1.27:/data path=/mnt fstype=nfs state=mounted"
ansible 192.1.1.21 -m mount -a "src=192.1.1.27:/data path=/mnt fstype=nfs state=unmounted"
5.user模块
#基本用法
ansible 192.1.1.21 -m user -a "name=test"
#扩展用法
指定用户uid信息
ansible 192.1.1.21 -m user -a "name=test uid=2000"
指定用户组信息
ansible 192.1.1.21 -m user -a "name=test group=yangwn groups=yangwn"
创建虚拟用户
ansible 192.1.1.21 -m user -a "name=rsync create_home=no shell=/sbin/nologin" #不创建家目录,登录方式为/sbin/nologin
给指定用户创建密码
#password生成的密码全部是明文密码不安全
ansible 192.1.1.21 -m user -a 'name=test password=123456'
#使用的是利用ansible的msg模块生成的密文密码
ansible 192.1.1.21 -m user -a 'name=test password=$6$abcd$BlbaPOqDDm3eVW.GrfRm4Vcuz4.0WgysdL5FY1CIn/4a5QwuySngbORfHwsHfXQERZejgHIflz1fJkKs82Iix.'
#使用的是利用python-pip生成的的密文密码
ansible 192.1.1.21 -m user -a 'name=test password=$6$S6iAx3ifT3MyWvXg$FTybz1ciJD05YFwfUfN.BslFYk/g16GUD2YqIWVOPrthXtQLdbdBnSvwHENujQW4fK5ReKU1bxWH02G9hE1/z.'
删除用户(等价于userdel -r)
ansible 192.1.1.21 -m user -a "name=test state=absent remove=yes"
#方法一:利用ansible的msg模块进行明文密码加密
ansible all -i localhost, -m debug -a "msg={
{ '123456' | password_hash('sha512', 'abcd') }}"
#其中'123456'是要加密的密码,'abcd'是加密校验信息,"msg"是加密后的密文密码
localhost | SUCCESS =>
{
"msg": "$6$abcd$BlbaPOqDDm3eVW.GrfRm4Vcuz4.0WgysdL5FY1CIn/4a5QwuySngbORfHwsHfXQERZejgHIflz1fJkKs82Iix."}
#方法二:利用python-pip进行明文密码加密
安装加密的软件
yum install -y python-pip
pip install passlib
进行密码加密
python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
Password: #输入要加密的密码
$6$S6iAx3ifT3MyWvXg$FTybz1ciJD05YFwfUfN.BslFYk/g16GUD2YqIWVOPrthXtQLdbdBnSvwHENujQW4fK5ReKU1bxWH02G9hE1/z.
6.setup模块
#setup模块中显示被管理主机系统的详细信息,主要用于剧本中设置判断信息
ansible 192.1.1.21 -m setup
#常见主机信息
ansible_all_ipv4_addresses: 仅显示IPV4的信息
ansible_devices: 仅显示磁盘设备信息
ansible_distribution: 显示是什么系统
ansible_distribution_major_version: 显示是系统主版本
ansible_distribution_version: 仅显示系统版本
ansible_machine: 显示系统类型
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个数(只显示总的个数)
#获取内置变量方法
ansible 192.1.1.21 -m setup -a "filter=ansible_hostname"
#获取子信息方法
ansible_eth0[ipv4] 显示eth0信息中IPV4的信息(在剧本中可以调取,直接执行会报错)
七、ansible剧本功能
1.ansible剧本功能的作用
可以一键化完成多个任务
2.ansible剧本编写规范
#合理的信息缩进(实现缩进功能)
两个空格表示一个缩进关系,在ansible中一定不能用tab进行缩进
#冒号的使用方法(实现键值定义)
使用冒号时后面要有空格信息,以冒号结尾或者冒号信息出现在注释说明中后面不需要加上空格
#短横线的使用方法(实现列表显示)
使用短横线构成列表信息,短横线后面需要有空格
3.ansible剧本编写常见错误
剧本语法规范是否符合(空格 冒号 短横线)
剧本中模块使用是否正确
剧本中一个name标识下面只能写一个模块任务信息
剧本中尽量不要大量使用shell模块
4.ansible模块和剧本的区别
ad-hoc 临时实现批量管理功能(模块) --- 命令
playbook 永久实现批量管理功能(剧本) --- 脚本
5.编写ansible剧本
#创建一个路径统一存放剧本文件
mkdir -p /etc/ansible/ansible-playbook
#创建一个路径统一存放配置文件
mkdir -p /etc/ansible/file/rsync-server
#创建rsync服务的配置文件
vim /etc/ansible/file/rsync-server/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 192.1.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsyncbackup
secrets file = /etc/rsync.password
[backup]
comment = "模块一备份路径"
path = /backup
#进入目录
cd /etc/ansible/ansible-playbook
#剧本文件扩展名为yaml
vim rsync_server.ymal #方便识别文件是一个剧本文件并且文件编写时会有颜色提示
- hosts: rsync_server
tasks:
- name: 01-安装rsync软件
yum: name=rsync state=installed
- name: 02-推送配置文件
copy: src=/etc/ansible/file/rsync-server/rsyncd.conf dest=/etc/
- name: 03-创建虚拟用户
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-创建备份目录
file: path=/backup state=directory owner=rsync group=rsync
- name: 05-创建密码文件并且权限设置为600
copy: content=rsyncbackup:123456 dest=/etc/rsync.password mode=600
- name: 06-启动rsync服务
service: name=rsyncd state=started enabled=yes
- hosts: rsync_client
tasks:
- name: 01-安装rsync软件
yum: name=rsync state=installed
- name: 02-创建密码文件并且权限设置为600
copy: content=123456 dest=/etc/rsync.password mode=600
- name: 03-创建测试文件
file: dest=/tmp/test.txt state=touch
- name: 04-测试rsync服务备份
shell: rsync -avz /tmp/test.txt rsyncbackup@backup::backup --password-file=/etc/rsync.password
#执行ansible剧本
第一个步骤: 检查剧本的语法格式
ansible-playbook --syntax-check rsync_server.ymal
第二个步骤: 模拟执行剧本
ansible-playbook -C rsync_server.ymal
第三个步骤: 直接执行剧本
ansible-playbook rsync_server.ymal
八、ansible配置主机清单
#官方介绍:https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
vim /etc/ansible/hosts
第一种方式:分组配置主机信息
[web]
192.1.1.23
192.1.1.24
192.1.1.25
第二种方式:主机名符号匹配配置(使用计算机名称的时候/etc/hosts文件要做好解析)
[web]
192.1.1.[23:25]
web[01:03]
第三种方式:跟上非标准远程端口
[web]
192.1.1.[23:25]:25
web[01:03]:25
第四种方式:主机使用特殊的变量(此时不用ssh密钥也能进行连接)
[web]
192.1.1.[23:25] ansible_ssh_port=25 nsible_ssh_user=root ansible_ssh_pass=123456
web[01:03] ansible_ssh_port=25 nsible_ssh_user=root ansible_ssh_pass=123456
第五种方式:主机组名嵌入配置-嵌入子组信息
#此时剧本里面可以直接调用rsync_server和rsync_client
[rsync:children]
rsync_server
rsync_client
[rsync_server]
192.1.1.28
[rsync_client]
192.1.1.29
192.1.1.30
第六种方式:主机组名嵌入配置-嵌入子组信息
[web:vars]
ansible_ssh_host=192.16.1.7
ansible_ssh_port=25
ansible_ssh_user=root
ansible_ssh_pass=123456
#此时没有/etc/hosts文件经行解析,web01也能被解析成IP地址并且会调用其他变量
[web]
web01
九、ansible剧本功能拓展
1.编写剧本的重要功能介绍
#官方介绍:https://docs.ansible.com/ansible/latest/user_guide/playbooks.html
a 在剧本中设置变量信息
b 在剧本中设置注册信息
b 在剧本中设置判断信息
c 在剧本中设置循环信息
d 在剧本中设置错误忽略
d 在剧本中设置标签信息
e 在剧本中设置触发信息
f 在剧本中进行剧本整合
2.在剧本中设置变量信息
- 方式一:直接在剧本文件编写
vim rsync_server.ymal
#rsync服务端设置相关变量,使用{
{}}来调取变量
- hosts: rsync_server
vars:
patch: /backup
password: 123456
file: rsync.password
tasks:
- name: 01-安装rsync软件
yum: name=rsync state=installed
- name: 02-推送配置文件
copy: src=/etc/ansible/file/rsync-server/rsyncd.conf dest=/etc/
- name: 03-创建虚拟用户
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-创建备份目录
file: path={
{
patch}} state=directory owner=rsync group=rsync
- name: 05-创建密码文件并且权限设置为600
copy: content=rsyncbackup:{
{
password}} dest=/etc/{
{
file}} mode=600
- name: 06-启动rsync服务
service: name=rsyncd state=started enabled=yes
#rsync客户端角色设置相关变量(不同的角色需要重新设置变量),使用{
{}}来调取变量
- hosts: rsync_client
vars:
password: 123456
file: rsync.password
tasks:
- name: 01-安装rsync软件
yum: name=rsync state=installed
- name: 02-创建密码文件并且权限设置为600
copy: content={
{
password}} dest=/etc/{
{
file}} mode=600
- name: 03-创建测试文件
file: dest=/tmp/test.txt state=touch
- name: 04-测试rsync服务备份
shell: rsync -avz /tmp/test.txt rsyncbackup@backup::backup --password-file=/etc/{
{
file}}
- 方式二:在命令行中进行指定剧本中变量的数值(只是临时的设置)
ansible-playbook -e path=/backup -e password=123456 -e file=rsync-password rsync_server.ymal
- 方式三:在主机清单文件编写
vim /etc/ansible/hosts
[rsync:children]
rsync_server
rsync_client
[rsync_server]
192.1.1.28
[rsync_server:vars]
path=/backup
password=123456
file=rsync-password
[rsync_client]
192.1.1.21
192.1.1.22
[rsync_client:vars]
password=123456
file=rsync-password
3.在剧本中设置注册信息
#以客户端进行演示在剧本中设置注册信息
vim rsync_server.ymal
- hosts: rsync_server
tasks:
- name: 01-安装rsync软件
yum: name=rsync state=installed
- name: 02-推送配置文件
copy: src=/etc/ansible/file/rsync-server/rsyncd.conf dest=/etc/
- name: 03-创建虚拟用户
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-创建备份目录
file: path=/backup state=directory owner=rsync group=rsync
- name: 05-创建密码文件并且权限设置为600
copy: content=rsyncbackup:123456 dest=/etc/rsync.password mode=600
- name: 06-启动rsync服务
service: name=rsyncd state=started enabled=yes
#设置注册信息
- name: 07-获取rsync端口
shell: netstat -lntup|grep 873
register: rsync_port
#显示注册信息
- name: 08-显示rsync端口
debug: msg={
{
rsync_port.stdout_lines}}
4.在剧本中设置判断信息
#剧本中指定判断条件
when: (ansible_hostname == "lb01")
when: (ansible_hostname == "lb02")
#以客户端进行演示在剧本中设置判断信息
vim rsync_server.ymal
- hosts: rsync_client
tasks:
- name: 01-安装rsync软件
yum: name=rsync state=installed
- name: 02-创建密码文件并且权限设置为600
copy: content=123456 dest=/etc/rsync.password mode=600
- name: 03-创建测试文件
file: dest=/tmp/test.txt state=touch
- name: 04-测试计算机lb01的rsync服务备份
when: (ansible_hostname == "lb01")
shell: rsync -avz /tmp/test.txt rsyncbackup@backup::backup/lb01/ --password-file=/etc/{
{
file}}
- name: 05-测试计算机lb02的rsync服务备份
when: (ansible_hostname == "lb02")
shell: rsync -avz /tmp/test.txt rsyncbackup@backup::backup/lb02/ --password-file=/etc/{
{
file}}
5.在剧本中设置循环信息
#提前创建rsync服务的配置文件和密码文件(文件内容省略)
vim /etc/ansible/file/rsync-server/rsyncd.conf
vim /etc/ansible/file/rsync-server/rsync.password
#以服务端进行演示在剧本中设置循环信息
vim rsync_server.ymal
- hosts: rsync_server
- name: 01-安装rsync软件
yum: name=rsync state=installed
- name: 02-推送配置文件&推送密码文件
#将两个copy的操作利用循环合并在一起
copy: src=/etc/ansible/file/rsync-server/{
{
item.src}} dest={
{
item.dest}} mode={
{
item.mode}}
with_items:
- {
src: 'rsyncd.conf', dest: 'etc', mode: '644'}
- {
src: 'rsync.password', dest: 'etc', mode: '600'}
- name: 03-创建虚拟用户
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-创建备份目录
file: path={
{
patch}} state=directory owner=rsync group=rsync
- name: 05-启动rsync服务
service: name=rsyncd state=started enabled=yes
#saltstack的方式设置循环
- hosts: all
tasks:
- name: 安装必备软件
yum:
name: ['rsync','tree','wget']
state: installed
#ansible的方式设置循环
- hosts: all
tasks:
- name: 安装必备软件
yum: name={
{
item}} state=installed
with_items:
- rsync
- tree
- wget
- hosts: all
tasks:
- name: 新增相关用户
user: name={
{
item.name}} group={
{
item.group}} groups={
{
item.groups}} uid={
{
item.uid}}
with_items:
- {
name: 'user1', group: 'user1', groups: 'user1', uid: '1100'}
- {
name: 'user2', group: 'user2', groups: 'user2', uid: '1200'}
6.在剧本中设置错误忽略
默认playbook会检查命令和模块的返回状态,如遇到错误就中断playbook的执行,可以在报错的剧本后面加上ignore_errors: yes忽略错误
#以服务端进行演示在剧本中设置错误忽略
vim rsync_server.ymal
- hosts: rsync_server
tasks:
- name: 01-安装rsync软件
yum: name=rsync state=installed
- name: 02-推送配置文件
copy: src=/etc/ansible/file/rsync-server/rsyncd.conf dest=/etc/
- name: 03-创建虚拟用户
shell: useradd rsync -M -s /sbin/nologin
#使用shell模块创建用户时如果用户已经存在会出现报错,此时可以在后面加上ignore_errors: yes忽略错误
ignore_errors: yes
- name: 04-创建备份目录
file: path=/backup state=directory owner=rsync group=rsync
- name: 05-创建密码文件并且权限设置为600
copy: content=rsyncbackup:123456 dest=/etc/rsync.password mode=600
- name: 06-启动rsync服务
service: name=rsyncd state=started enabled=yes
7.在剧本中设置标签功能
#以服务端进行演示在剧本中设置标签功能
vim rsync_server.ymal
- hosts: rsync_server
tasks:
- name: 01-安装rsync软件
yum: name=rsync state=installed
tags: t1
- name: 02-推送配置文件
copy: src=/etc/ansible/file/rsync-server/rsyncd.conf dest=/etc/
tags: t2
- name: 03-创建虚拟用户
user: name=rsync create_home=no shell=/sbin/nologin
tags: t3
- name: 04-创建备份目录
file: path=/backup state=directory owner=rsync group=rsync
tags: t4
- name: 05-创建密码文件并且权限设置为600
copy: content=rsyncbackup:123456 dest=/etc/rsync.password mode=600
tags: t5
- name: 06-启动rsync服务
service: name=rsyncd state=started enabled=yes
tags: t6
#指定执行标签任务(此时会去调用剧本中的标签)
ansible-playbook --tags=t2 rsync_server.ymal
#跳过指定标签任务(此时会去调用剧本中的标签)
ansible-playbook --skip-tags=t2 rsync_server.ymal
8.在剧本中设置触发功能
#以服务端进行演示在剧本中设置触发功能
vim rsync_server.ymal
- hosts: rsync_server
tasks:
- name: 01-安装rsync软件
yum: name=rsync state=installed
- name: 02-推送配置文件
copy: src=/etc/ansible/file/rsync-server/rsyncd.conf dest=/etc/
#推送配置文件后为了服务生效,设置重启服务的触发名称
notify: restart rsync server
- name: 03-创建虚拟用户
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-创建备份目录
file: path=/backup state=directory owner=rsync group=rsync
- name: 05-创建密码文件并且权限设置为600
copy: content=rsyncbackup:123456 dest=/etc/rsync.password mode=600
- name: 06-启动rsync服务
service: name=rsyncd state=started enabled=yes
#调取触发名称,经行相关操作
handlers:
- name: restart rsync server
service: name=rsyncd state=restarted
9.在剧本中进行剧本整合
#此时有两个剧本文件,经行剧本整合
/etc/ansible/ansible-playbook/rsync_server.ymal
/etc/ansible/ansible-playbook/nfs_server.ymal
#第一种方法
缺点:汇总的剧本hosts信息会和分剧本中的hosts信息冲突,分剧本中不要指定hosts信息并且客户端和服务端最好分开写剧本
vim include_tasks.ymal
- hosts: rsync_server
tasks:
- include_tasks: /etc/ansible/ansible-playbook/rsync_server.ymal
- hosts: nfs_server
tasks:
- include_tasks: /etc/ansible/ansible-playbook/nfs_server.ymal
- hosts: rsync_client
tasks:
- include_tasks: /etc/ansible/ansible-playbook/rsync_client.ymal
- hosts: nfs_client
tasks:
- include_tasks: /etc/ansible/ansible-playbook/nfs_client.ymal
#第二种方法
缺点:执行的时候会有警告信息
vim include_tasks.ymal
- include: /etc/ansible/ansible-playbook/rsync_server.ymal
- include: /etc/ansible/ansible-playbook/nfs_server.ymal
#第三种方法
vim include_tasks.ymal
- import_playbook: /etc/ansible/ansible-playbook/rsync_server.ymal
- import_playbook: /etc/ansible/ansible-playbook/nfs_server.ymal
#设置gather_facts: no来禁止ansible收集facts信息加快剧本执行效率
默认情况下在使用ansible对远程主机执行任何一个playbook之前,都会先通过setup模块获取facts,并暂存在内存中,直至该playbook执行结束(执行效率低)
vim rsync_server.ymal
- hosts: rsync_client
gather_facts: no
tasks:
- name: 01-安装rsync软件
yum: name=rsync state=installed
- name: 02-创建密码文件并且权限设置为600
copy: content=123456 dest=/etc/rsync.password mode=600
- name: 03-创建测试文件
file: dest=/tmp/test.txt state=touch
- name: 04-测试rsync服务备份
shell: rsync -avz /tmp/test.txt rsyncbackup@backup::backup --password-file=/etc/rsync.password
十、ansible剧本的角色功能-部署nfs服务
1.第一个历程规范目录结构
cd /etc/ansible/roles
mkdir -p {
nfs-server,nfs-client}/{
vars,tasks,templates,handlers,files}
tree
├── nfs-server #nfs服务端
│ ├── files 保存需要分发文件目录
│ ├── handlers 保存触发器配置文件信息
│ ├── tasks 保存要执行的动作信息文件
│ ├── templates 保存需要分发模板文件(模板文件中可以调用变量信息,使用template模块分发文件)
│ └── vars 保存变量信息文件
└── nfs-clien #nfs客户端
├── files 保存需要分发文件目录
├── handlers 保存触发器配置文件信息
├── tasks 保存要执行的动作信息文件
├── templates 保存需要分发模板文件(模板文件中可以调用变量信息,使用template模块分发文件)
└── vars 保存变量信息文件
2.第二个历程在roles目录中创建相关文件
- 服务端的角色
#编写tasks目录中的main.yml文件
vim /etc/ansible/roles/nfs-server/tasks/main.yml
- name: 01-安装必备软件
yum:
name: ['nfs-utils','rpcbind']
state: installed
- name: 02-推送配置文件(此时会自动去files目录中去找要分发的配置文件,所有不用绝对路径)
copy: src=exports dest=/etc/
notify: restart nfs server
- name: 03-创建备份目录
file: path={
{
patch}} state=directory owner=nfsnobody group=nfsnobody
- name: 04-启动rpcbind服务、再启动nfs服务
service: name={
{
item.name}} state={
{
item.state}} enabled={
{
item.enabled}}
with_items:
- {
name: 'rpcbind',state: 'started',enabled: 'yes'}
- {
name: 'nfs',state: 'started',enabled: 'yes'}
#编写vars目录中的main.yml文件
vim /etc/ansible/roles/nfs-server/vars/main.yml
patch: /data
#编写files目录中的文件
vim /etc/ansible/roles/nfs-server/files/exports
/data 192.1.1.0/24(rw,sync)
#编写handlers目录中的main.yml文件
vim /etc/ansible/roles/nfs-server/handlers/main.yml
- name: restart nfs server
service: name=nfs state=restarted
- 客户端的角色
#编写tasks目录中的main.yml文件
vim /etc/ansible/roles/nfs-client/tasks/main.yml
- name: 01-安装必备软件
yum:
name: ['nfs-utils','rpcbind']
state: installed
- name: 02-挂载nfs磁盘
mount: src=192.1.1.27:{
{
patch}} path=/mnt fstype=nfs state=mounted
- name: 03-获取磁盘信息
shell: df -h
register: nfs
- name: 03-显示磁盘信息
debug: msg={
{
nfs.stdout_lines}}
ignore_errors: yes
#编写vars目录中的main.yml文件
vim /etc/ansible/roles/nfs-client/vars/main.yml
patch: /data
3.第三个历程编写一个主剧本文件
vim /etc/ansible/roles/site-nfs.yml
- hosts: nfs_server
roles:
- nfs-server
- hosts: nfs_client
roles:
- nfs-client
4.第四个历程设置主机清单
vim /etc/ansible/hosts
[nfs:children]
nfs_server
nfs_client
[nfs_server]
192.1.1.27
[nfs_client]
192.1.1.21
192.1.1.22
192.1.1.23
192.1.1.24
192.1.1.25
192.1.1.26
192.1.1.28
192.1.1.29
192.1.1.30
192.1.1.31
5.第五个个历程运行主剧本文件
ansible-playbook --syntax-check /etc/ansible/roles/site-nfs.yml #检查剧本语法
ansible-playbook -C /etc/ansible/roles/site-nfs.yml #模拟运行剧本
ansible-playbook /etc/ansible/roles/site-nfs.yml #实际运行剧本
十一、ansible剧本的角色功能-部署rsync服务
1.第一个历程规范目录结构
cd /etc/ansible/roles
mkdir -p {rsync-server,rsync-client}/{vars,tasks,templates,handlers,files}
2.第二个历程在roles目录中创建相关文件
- 服务端的角色
#编写tasks目录中的main.yml文件(main.yml由6个子剧本构成)
vim /etc/ansible/roles/rsync-server/tasks/main.yml
- include_tasks: 01-安装软件.yml
- include_tasks: 02-推送文件.yml
- include_tasks: 03-创建用户.yml
- include_tasks: 04-创建目录.yml
- include_tasks: 05-启动服务.yml
- include_tasks: 06-注册信息.yml
- include_tasks: 07-显示信息.yml
vim /etc/ansible/roles/rsync-server/tasks/01-安装软件.yml
- name: 01-安装rsync软件
yum: name=rsync state=installed
vim /etc/ansible/roles/rsync-server/tasks/02-推送文件.yml
- name: 02-推送配置&密码文件
template: src={
{
item.src}} dest=/etc mode={
{
item.mode}}
with_items:
- {
src: 'rsyncd.conf', mode: '644'}
- {
src: 'rsync.password', mode: '600'}
notify: restart rsync server
vim /etc/ansible/roles/rsync-server/tasks/03-创建用户.yml
- name: 03-创建虚拟用户
user: name={
{
user1}} create_home=no shell=/sbin/nologin
vim /etc/ansible/roles/rsync-server/tasks/04-创建目录.yml
- name: 04-创建备份目录
file: path={
{
path}} state=directory owner={
{
user1}} group={
{
user1}}
vim /etc/ansible/roles/rsync-server/tasks/05-启动服务.yml
- name: 05-启动rsync服务
service: name=rsyncd state=started enabled=yes
vim /etc/ansible/roles/rsync-server/tasks/06-注册信息.yml
- name: 06-获取rsync端口
shell: netstat -lntup|grep {
{
rsync_port}}
register: rsync_port
vim /etc/ansible/roles/rsync-server/tasks/07-显示信息.yml
- name: 07-显示rsync端口
debug: msg={
{
rsync_port.stdout_lines}}
ignore_errors: yes
#编写vars目录中的main.yml文件
vim /etc/ansible/roles/rsync-server/vars/main.yml
rsync_port: 873
user1: rsync
user2: rsyncbackup
password: 123456
path: /backup
#编写templates目录中的文件
vim /etc/ansible/roles/rsync-server/templates/rsyncd.conf
uid = {
{
user1}}
gid = {
{
user1}}
port = {
{
rsync_port}}
fake super = yes
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 192.1.1.0/24
hosts deny = 0.0.0.0/32
auth users = {
{
user2}}
secrets file = /etc/rsync.password
[backup]
comment = "模块一备份路径"
path = {
{
path}}
vim /etc/ansible/roles/rsync-server/templates/rsync.password
{
{
user2}}:{
{
password}}
#编写handlers目录中的main.yml文件
vim /etc/ansible/roles/rsync-server/handlers/main.yml
- name: restart rsync server
service: name=rsyncd state=restarted
- 客户端的角色
#编写tasks目录中的main.yml文件(main.yml由6个子剧本构成)
vim /etc/ansible/roles/rsync-client/tasks/main.yml
- include_tasks: 01-安装软件.yml
- include_tasks: 02-推送文件.yml
- include_tasks: 03-创建文件.yml
- include_tasks: 04-测试服务.yml
vim /etc/ansible/roles/rsync-client/tasks/01-安装软件.yml
- name: 01-安装rsync软件
yum: name=rsync state=installed
vim /etc/ansible/roles/rsync-client/tasks/02-推送文件.yml
- name: 02-推送密码文件
template: src=rsync.password dest=/etc mode=600
vim /etc/ansible/roles/rsync-client/tasks/03-创建文件.yml
- name: 03-创建测试文件
file: dest=/tmp/test.txt state=touch
vim /etc/ansible/roles/rsync-client/tasks/04-测试服务.yml
- name: 测试计算机lb01的rsync服务备份
when: (ansible_hostname == "lb01")
shell: rsync -avz --port={
{
rsync_port}} /tmp/test.txt {
{
user2}}@backup::backup/lb01/ --password-file=/etc/rsync.password
- name: 测试计算机lb02的rsync服务备份
when: (ansible_hostname == "lb02")
shell: rsync -avz --port={
{
rsync_port}} /tmp/test.txt {
{
user2}}@backup::backup/lb02/ --password-file=/etc/rsync.password
- name: 测试计算机web01的rsync服务备份
when: (ansible_hostname == "web01")
shell: rsync -avz --port={
{
rsync_port}} /tmp/test.txt {
{
user2}}@backup::backup/web01/ --password-file=/etc/rsync.password
- name: 测试计算机web02的rsync服务备份
when: (ansible_hostname == "web02")
shell: rsync -avz --port={
{
rsync_port}} /tmp/test.txt {
{
user2}}@backup::backup/web02/ --password-file=/etc/rsync.password
- name: 测试计算机web03的rsync服务备份
when: (ansible_hostname == "web03")
shell: rsync -avz --port={
{
rsync_port}} /tmp/test.txt {
{
user2}}@backup::backup/web03/ --password-file=/etc/rsync.password
- name: 测试计算机db01的rsync服务备份
when: (ansible_hostname == "db01")
shell: rsync -avz --port={
{
rsync_port}} /tmp/test.txt {
{
user2}}@backup::backup/db01/ --password-file=/etc/rsync.password
- name: 测试计算机nfs01的rsync服务备份
when: (ansible_hostname == "nfs01")
shell: rsync -avz --port={
{
rsync_port}} /tmp/test.txt {
{
user2}}@backup::backup/nfs01/ --password-file=/etc/rsync.password
- name: 测试计算机m01的rsync服务备份
when: (ansible_hostname == "m01")
shell: rsync -avz --port={
{
rsync_port}} /tmp/test.txt {
{
user2}}@backup::backup/m01/ --password-file=/etc/rsync.password
- name: 测试计算机jumpserver的rsync服务备份
when: (ansible_hostname == "jumpserver")
shell: rsync -avz --port={
{
rsync_port}} /tmp/test.txt {
{
user2}}@backup::backup/jumpserver/ --password-file=/etc/rsync.password
- name: 测试计算机zabbix的rsync服务备份
when: (ansible_hostname == "zabbix")
shell: rsync -avz --port={
{
rsync_port}} /tmp/test.txt {
{
user2}}@backup::backup/zabbix/ --password-file=/etc/rsync.password
#编写vars目录中的main.yml文件
vim /etc/ansible/roles/rsync-client/vars/main.yml
rsync_port: 873
user1: rsync
user2: rsyncbackup
password: 123456
path: /backup
#编写templates目录中的文件
vim /etc/ansible/roles/rsync-client/templates/rsync.password
{
{
password}}
3.第三个历程编写一个主剧本文件
vim /etc/ansible/roles/site-rsync.yml
- hosts: rsync_server
roles:
- rsync-server
- hosts: rsync_client
roles:
- rsync-client
4.第四个历程设置主机清单
vim /etc/ansible/hosts
[rsync:children]
rsync_server
rsync_client
[rsync_server]
192.1.1.28
[rsync_client]
192.1.1.21
192.1.1.22
192.1.1.23
192.1.1.24
192.1.1.25
192.1.1.26
192.1.1.27
192.1.1.29
192.1.1.30
192.1.1.31
4.第四个历程运行主剧本文件
ansible-playbook --syntax-check /etc/ansible/roles/site-rsync.yml #检查剧本语法
ansible-playbook -C /etc/ansible/roles/site-rsync.yml #模拟运行剧本
ansible-playbook /etc/ansible/roles/site-rsync.yml #实际运行剧本