综合架构批量管理服务之--ansible
00. 介绍部分
1) 利用剧本功能简单完成服务一键化部署
2) 主机清单配置
3) 剧本的扩展配置功能
4) 多个剧本如何进行整合
5) 剧本的角色目录???
01. 知识回顾
1) 将所有模块进行了讲解说明
command 模块: 在远程主机上执行命令操作 默认模块
shell 模块: 在远程主机上执行命令操作 万能模块
PS: 有时剧本不能反复执行!!!
script 模块: 批量执行本地脚本
copy 模块: 用于批量分发传输数据信息
fetch 模块: 用于将远程主机数据进行拉取到本地管理主机
file 模块: 修改数据属性信息/创建数据信息
yum 模块: 用于安装和卸载软件包
service 模块: 用于管理服务的运行状态
user 模块: 用于批量创建用户并设置密码信息
mount 模块: 用于批量挂载操作
cron 模块: 批量部署定时任务信息
ping 模块: 远程管理测试模块
ansible 172.16.1.31 -m ping
2) ansible服务剧本功能
剧本的组成部分:
剧本的语法规范:
- 空格规范: 实现缩进功能
- 冒号规范: 实现键值定义
- 横线规范: 实现列表显示
02. 利用剧本完成服务一键化部署-rsync:
rsync 服务部署
nfs 服务部署
sersync 服务部署
全网备份项目之-rsync
rsync服务剧本编写:
准备工作:
- 熟悉软件部署流程
- 熟悉ansible软件模块使用
- 熟悉ansible剧本编写规范
ansible:
ad-hoc临时实现批量管理功能(模块)--- 命令
playbook 永久实现批量管理功能(剧本)--- 脚本
[root@m01 ansible-playbook]# cat rsync_server.yaml
- hosts: rsync_server
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf file
copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
- name: 03-create user
user: name=rsync create_home=no shell=/sbin/nologin
#shell: useradd rsync -M -s /sbin/nologin --shell在剧本中不能反复执行,rsync用户存在时会报错
- name: 04-create backup dir
file: path=/backup state=directory owner=rsync group=rsync
- name: 05-create password file
copy: content=rsync_backup:oldboy123 dest=/etc/rsync.password mode=600
- name: 06-start rsync server
service: name=rsyncd state=started enabled=yes
- hosts: rsync_clients
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-create password file
copy: content=oldboy123 dest=/etc/rsync.password mode=600
- name: 03-create test file
file: dest=/tmp/test.txt state=touch
- name: 04-check test
shell: rsync -avz /tmp/test.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
剧本编写常见错误:
剧本语法规范是否符合(空格 冒号 短横线)
剧本中模块使用是否正确
剧本中一个name标识下面只能写一个模块任务信息
剧本中尽量不要大量使用shell模块
03. 如何配置主机清单
主机清单的配置方法官方地址:
https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
说明:/etc/ansible/hosts文件中
[]
表示[组名]
,方便批量使用主机ip地址的标签
最初的配置只有主机ip地址cat /etc/ansible/hosts 172.16.1.31 172.16.1.41 172.16.1.7
调用方式:
ansible all -a "hostname" 或者 ansible 172.16.1.31,172.16.1.41 -a "hostname"
第一种方式: 分组配置主机信息
cat /etc/ansible/hosts
[web]
172.16.1.7
172.16.1.8
172.16.1.9
[data]
172.16.1.31
172.16.1.41
操作过程
[root@m01 ansible-playbook]# ansible data -a "hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01
172.16.1.41 | CHANGED | rc=0 >>
backup
[root@m01 ansible-playbook]# ansible web -a "hostname"
172.16.1.7 | CHANGED | rc=0 >>
web01
第二种方式: 主机名符号匹配配置
[web]
172.16.1.[7:9] ---表示7-9共3台主机
[web]
web[01:03] ---表示1-3共3台主机,但前提条件是/etc/hosts中已经配置好地址解析
第三种方式: 跟上非标准远程端口
[web]
web01:52113 或
172.16.1.7:52113
操作命令:ansible web01 -a "hostname"
第四种方式: 主机使用特殊的变量
此种设置方式可以不提前分发ssh公钥即可使用
[web] ---方法一
172.16.1.7 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456
[web] ---方法二
web01 ansible_ssh_host=172.16.1.7 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456
第五种方式: 主机组名嵌入配置
[rsync:children]--- 嵌入子组信息,rsync包含rsync_server组合rsync_client组,需要使用参数children
rsync_server
rsync_client
[rsync_server]
172.16.1.41
[rsync_client]
172.16.1.31
172.16.1.7
下面的嵌入式变量方式配置主机,此种方式了解即可,后续其他地方会有用
[web:vars] --- 嵌入式变量信息
ansible_ssh_host=172.16.1.7
ansible_ssh_port=52113
ansible_ssh_user=root
ansible_ssh_pass=123456
[web]
web01
### 组web中web01主机会调用web:vars的变量值,功能同上述第四种方式方法二
04. 剧本的扩展功能配置
针对剧本/etc/ansible/ansible_playbook/rsync_server.yaml做变量信息优化
cp rsync_server.yaml rsync_server_varinfo.yaml
a.在剧本中设置变量信息
方式一:直接在剧本文件中编写
vars:
oldboy01: data01
oldboy02: data02注意变量引用:使用
{{ 变量 }}
使用方法:
[root@m01 ansible-playbook]# cat rsync_server_varinfo.yaml
- hosts: rsync_server
vars:
backupdir: /data
passfile: rsync-password
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf file
copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
- name: 03-create user
user: name=rsync create_home=no shell=/sbin/nologin
#shell: useradd rsync -M -s /sbin/nologin
- name: 04-create backup dir
file: path={{ backupdir }} state=directory owner=rsync group=rsync
- name: 05-create password file
copy: content=rsync_backup:oldboy123 dest=/etc/{{ passfile }} mode=600
- name: 06-start rsync server
service: name=rsyncd state=started enabled=yes
- hosts: rsync_clients
vars:
passfile: rsync-password
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf file
copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
- name: 03-create password file
copy: content=oldboy123 dest=/etc/{{ passfile }} owner=root group=root mode=600
- name: 04-start rsyncd server,set enabled.
service: name=rsyncd state=started enabled=yes
- name: 05-create test file
file: dest=/tmp/test.txt state=touch
- name: 06-check test data backup
shell: rsync -avz /tmp/test.txt rsync_backup@172.16.1.41::data --password-file=/etc/{{ passfile }}
方式二:在命令行中进行指定
ansible-playbook --extra-vars=oldboy01=data01
使用方法:可将上述变量定义部分注释掉,但剩下变量引用,这时引用的变量为临时变量,需要从命令行获取值
参数 --extra-vars 可用短格式 -e
[root@m01 ansible-playbook]# cat rsync_server_varinfo.yaml
- hosts: rsync_server
#vars:
# backupdir: /data
# passfile: rsync-password
tasks:
...
- hosts: rsync_clients
# vars:
# passfile: rsync-password
tasks:
...
命令执行前可先删除对应目录和密码文件再进行测试
[root@m01 ansible-playbook]# ansible-playbook --extra-var backupdir=/data -e passfile=/etc/rsync-password
方式三:在主机清单文件中编写
[oldboy]
oldboy01=data01
oldboy02=data02
## 配置信息vars部分
[root@m01 ansible-playbook]# cat /etc/ansible/hosts
[rsync:children]
rsync_server
rsync_clients
[rsync_server]
172.16.1.41
[rsync_server:vars]
backupdir=/data
passfile=rsync-password
[rsync_clients]
172.16.1.7
172.16.1.31
[rsync_clients:vars]
passfile=rsync-password
##执行
[root@m01 ansible-playbook]# ansible-playbook rsync_server_varinfo.yaml
注意问题:如果三种方式中都配置了,三种方式的有效优先级为:
最优先:命令行变量设置 (很少使用)
次优先:剧本中变量设置 (使用最多)
最后:主机清单变量设置 (使用次多)
可通过三种方式都配置不同变量进行测试优先级
##剧本中: backupdir=/data01 passfile=/rsync-password01 ##主机清单文件中: backupdir=/data03 passfile=/rsync-password03 ##命令行执行:--检测出/data02文件夹生成,命令行设置最优先 [root@m01 ansible-playbook]#ansible-playbook --extra-var backupdir=/data02 -e passfile=/etc/rsync-password02 rsync_server_varinfo.yaml ##命令行执行:--检测出/data01文件夹生成,剧本中变量设置次优先 [root@m01 ansible-playbook]#ansible-playbook rsync_server_varinfo.yaml ##注释掉剧本中变量设置后,命令行执行:--检测出/data03文件夹生成,主机清单中变量设置最后 [root@m01 ansible-playbook]#ansible-playbook rsync_server_varinfo.yaml
拓展思考:如何全局设置变量(在roles,剧本整合部分介绍)
b.在剧本中设置注册信息
说明:注册信息功能相当于定义一个变量,然后调用变量
比如在检查是否安装了rsync服务时,可通过查看端口,但是ansible的shell模块只提示ok,并不显示具体端口信息,这时就能使用注册功能,显示脚本执行的信息
使用方法:
cd /etc/ansible/ansible-playbook/
cp rsync_server.yaml rsync_server_reginfo.yaml
cat rsync_server_reginfo.yaml
- hosts: rsync_server
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf file
copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
- name: 03-create user
user: name=rsync create_home=no shell=/sbin/nologin
#shell: useradd rsync -M -s /sbin/nologin
- name: 04-create backup dir
file: path=/backup state=directory owner=rsync group=rsync
- name: 05-create password file
copy: content=rsync_backup:oldboy123 dest=/etc/rsync.password mode=600
- name: 06-start rsync server
service: name=rsyncd state=started enabled=yes
## 以下部分为register info
- name: 07-check server port info
shell: netstat -lntup|grep 873 ---端口信息
register: get_server_port ---定义保存端口信息的变量
- name display port name
debug: msg={{ get_server_port.stdout_lines }} ---debug调用变量输出信息,stdout_lines是标准输出格式显示的作用
## 执行结果
[root@m01 ansible-playbook]# ansible-playbook rsync_server_reginfo.yaml
...
TASK [07-check server port info] ****************************************************************************************
changed: [172.16.1.41]
TASK [display port name] ************************************************************************************************
ok: [172.16.1.41] => {
"msg": [
"tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 936/rsync ",
"tcp6 0 0 :::873 :::* LISTEN 936/rsync "
]
}
c.在剧本中设置判断信息
如何指定判断条件:
(ansible_hostname == "nfs")
setup模块中显示被管理主机系统的详细信息
获取内置变量方法:
ansible rsync_server -m setup -a "filter=ansible_hostname" -- ansible_hostname变量由setup模块提供
常见主机信息:
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_swaptotal_mb --显示总的swap内存
ansible_swapfree_mb --显示swap内存的可用内存
ansible_mounts --显示磁盘系统挂在情况
ansible_processor --显示CPU的个数(具体显示每个CPU的型号)
ansible_vcpus p p --显示总哦的CPU个数(只显示个数)
获取子项信息的方法:只获取eth0中的ipv4信息,但只有在脚本中才能起作用,在命令行不生效
ansible rsync_server -m setup -a "filter=ansible_eth0[ipv4]"
使用方法:
[root@m01 ansible-playbook]# cp rsync_server.yaml rsync_server_when.yaml
[root@m01 ansible-playbook]# cat rsync_server_when.yaml
- hosts: rsync_server
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf file
copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
- name: 03-create user
user: name=rsync create_home=no shell=/sbin/nologin
#shell: useradd rsync -M -s /sbin/nologin
- name: 04-create backup dir
file: path=/backup state=directory owner=rsync group=rsync
- name: 05-create password file
copy: content=rsync_backup:oldboy123 dest=/etc/rsync.password mode=600
- name: 06-start rsync server
service: name=rsyncd state=started enabled=yes
- hosts: rsync_clients
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf file
copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
- name: 03-create password file
copy: content=oldboy123 dest=/etc/rsync.password owner=root group=root mode=600
- name: 04-start rsyncd server,set enabled.
service: name=rsyncd state=started enabled=yes
- name: 05-create test_nfs file
file: dest=/tmp/test_nfs.txt state=touch
when: (ansible_hostname == "nfs01") ##上一行执行的判断条件,ansible_hostname由setup模块提供
- name: 05-create test_web file
file: dest=/tmp/test_web.txt state=touch
when: (ansible_hostname == "web01") ##上一行执行的判断条件
- name: 06-check test nfs data backup
shell: rsync -avz /tmp/test_nfs.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
when: (ansible_hostname == "nfs01") ##上一行执行的判断条件
- name: 07-check test web data backup
shell: rsync -avz /tmp/test_web.txt rsync_backup@172.16.1.41::web --password-file=/etc/rsync.password
when: (ansible_hostname == "web01") ##上一行执行的判断条件
## 注意在/etc/ansible/server_file/rsync_server/rsyncd.conf中增加web模块,并在41上增加对应目录,修改数组为chown rsync.rsync /web
[root@m01 ansible-playbook]# ansible-playbook rsync_server_when.yaml
d.在剧本中设置循环信息
循环的功能:yaml文件中有相同的模块时,使用循环进行合并
cd /etc/ansible/ansible-playbook/ && cp rsync_server.yaml rsync_server_loop.yaml
模块内定义变量,使用with_items赋值调用#循环结束 BEGIN - name: 02-push conf file && password file copy: src=/etc/ansible/server_file/rsync_server/{{ item.src }} dest={{ item.dest }} mode={{ item.mode }} ##定义copy模块变量src,dest,mode with_items: ##变量赋值并引用 - { src: 'rsyncd.conf', dest: '/etc/', mode: '644' } - { src: 'rsync.password', dest: '/etc/', mode: '600' } # 循环结束 END
使用方法:
[root@m01 ansible-playbook]# cat rsync_server_loop.yaml
- hosts: rsync_server
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
# 循环开始BEGIN
# 同一个name中有多个不同模块时直接报错,相同模块时会出现警告,只执行最后一个模块,此时使用循环功能
#- name: 02-push conf file && password file
# copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
# copy: content=rsync_backup:oldboy123 dest=/etc/rsync.password mode=600
# 将上述copy内容修改为格式大致相同
# copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/ mode=644
# copy: src=/etc/ansible/server_file/rsync_server/rsync.password dest=/etc/ mode=600
- name: 02-push conf file && password file
copy: src=/etc/ansible/server_file/rsync_server/{{ item.src }} dest={{ item.dest }} mode={{ item.mode }} ##定义copy模块变量src,dest,mode
with_items: ##变量赋值并引用
- { src: 'rsyncd.conf', dest: '/etc/', mode: '644' }
- { src: 'rsync.password', dest: '/etc/', mode: '600' }
# 循环结束 END
- name: 03-create user
user: name=rsync create_home=no shell=/sbin/nologin
#shell: useradd rsync -M -s /sbin/nologin
- name: 04-create backup dir
file: path=/backup state=directory owner=rsync group=rsync
#copy 模块放到上面的copy模块部分
#- name: 05-create password file
# copy: content=rsync_backup:oldboy123 dest=/etc/rsync.password mode=600
- name: 06-start rsync server
service: name=rsyncd state=started enabled=yes
- hosts: rsync_client
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf file
copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
- name: 03-create password file
copy: content=oldboy123 dest=/etc/rsync.password owner=root group=root mode=600
- name: 04-start rsyncd server,set enabled.
service: name=rsyncd state=started enabled=yes
- name: 05-create test file
file: dest=/tmp/test.txt state=touch
- name: 06-check test data backup
shell: rsync -avz /tmp/test.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
[root@m01 ansible-playbook]# ansible-playbook rsync_server_loop.yaml
...
ansible格式编写:
- name: install software
yum: name=wget state=installed
saltstack格式编写:
- name: install software
yum:
name: ['rsync','tree','wget']
state: installed
e.在剧本中设置错误忽略
功能:
在剧本中,前面部分出现错误时,剧本不再往下执行
若想继续往后执行,需要忽略当前错误,此时即可使用设置错误忽略
功能
可以加入ignore_errors: yes
忽略错误
使用方法:
- hosts: all
remote_user: root
tasks:
- name: Ignore False
command: /bin/false
ignore_errors: yes
- name: touch nowfile
file: path=/tmp/moox_ignore state=touch
f.在剧本中设置标签信息
功能:
在剧本中,若只想执行某个模块,或者跳过某个某块时,可以给该模块
设置标签
可以加入tags: tag1
指定模块
执行时使用参数-t
或--tags=tag1
指定标签,
指定执行哪个标签任务:ansible-playbook --tags=tag1 test_tags.yaml
跳过指定标签执行任务:ansible-playbook --skip-tags=tag1 test_tags.yaml
使用方法:
- hosts: all
remote_user: root
tasks:
- name: Ignore False
command: /bin/false
tags: tag1
- name: touch nowfile
file: path=/tmp/moox_ignore state=touch
g.在剧本中设置触发信息
h.在剧本中设置剧本整合
05. 知识总结
- rsync服务一键化部署剧本
- 主机清单编写方法
5种方式 - 剧本的扩展编写方法
如何设置变量信息 3种
如何设置注册信息 debug
如何设置判断信息 setup
作业:
-
一键化部署全网备份项目
-
一键化部署NFS服务
-
一键化部署实时同步服务