Ansible批量管理服务部署

一、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.官方介绍模块分类

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                 #实际运行剧本

猜你喜欢

转载自blog.csdn.net/qq_41938046/article/details/108104170