剧本执行出现错误排查思路/步骤
- 找到剧本中出现问题的关键点
- 将剧本中的操作转换成模块进行操作
- 将模块的功能操作转换成linux命令
3.1 本地管理主机执行命令测试
3.2 远程被管理主机上执行命令测试
在剧本中设置循环信息
- 在剧本中进行语法检查时,一个注释信息下面可以写两个同一个模块的操作。
如果一个注释信息下面写两个不同模块的操作,那么检查语法会直接报错的。
vim rsync_server_测试语法.yaml
- hosts: 172.16.1.41
tasks:
- name: 01-test
yum: name=rsync state=installed
file: dest=test.txt state=touch
ansible-playbook --syntax-check rsync_server_测试语法.yaml
# 语法检测结果会直接报错
vim rsync_server_测试语法01.yaml
- hosts: 172.16.1.41
tasks:
- name: 01-test
yum: name=rsync state=installed
yum: name=nginx state=installed
ansible-playbook --syntax-check rsync_server_测试语法.yaml
# 语法检测结果会有[WARNING]提示,但是可以执行的
如上图所示,我们在同一个注释信息中写上两个相同模块的操作,检查语法发现也是可以执行的,但是会有一个警告的提示。如果我们想要消除警告提示,那么我们可以通过循环来解决问题。
- 在剧本中设置循环代码演示
echo lala:123 > rsync.passwd
vim rsync_server_循环.yaml
- hosts: rsync_server
tasks:
- name: 01-install rsync
# yum: name=rsync state=installed # --ansible识别的格式(ansible识别的格式包含saltstack识别的格式)
yum: # --saltstack识别的格式
name: ["rsync","tree","nginx"] # python中的列表
state: intsall
- name: 02-push conf file & password file
# copy: src=/etc/ansible/ansible-playbook/rsyncd.conf dest=/etc mode=644
# copy: src=/etc/ansible/ansible-playbook/rsync.password dest=/etc/ mode=600
copy: src=/etc/ansible/ansible-playbook/{{ item.src }} dest={{ item.dest }} mode={{ item.mode }}
with_items:
- { src: "rsyncd.conf",dest: "/etc/",mode: "644" } # python中的字典
- { src: "rsyncd.passwd",dest: "/etc/",mode: "600" } # python中的字典
- name: 03-useradd
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-bak
file: dest=/lala_bak state=directory owner=rsync group=rsync
- name: 05-start
service: name=rsyncd state=started enabled=yes
在剧本中设置错误忽略
- 一般用于剧本出现问题,进行剧本调试
vim rsync_server_忽略错误.yaml
- hosts: rsync_server
tasks:
- name: 01-ERROR
file: dest=/a.txt state=touh
ignore_errors: yes # 忽略错误,继续执行下面的模块。
- name: 01-pass
file: dest=/A.txt state=touch
ansible-playbook rsync_server_忽略错误.yaml
# TASK [01-ERROR] *********************************************************************************
# fatal: [172.16.1.41]: FAILED! => {"changed": false, "msg": "value of state must be one of: absent, directory, file, hard, link, touch, got: touh"}
# ...ignoring
# TASK [01-pass] ***********************************************************************************
# changed: [172.16.1.41]
在剧本中设置标签信息
- 一般用于剧本出现问题,进行剧本调试
vim rsync_server_标签信息.yaml
- hosts: rsync_server
tasks:
- name: 01-ERROR
file: dest=/a.txt state=touch
tags: error # 标签,使用标签尽量不要使用数字,系统无法识别。
- name: 01-pass
file: dest=/A.txt state=touch
ansible-playbook --tags=error rsync_server_标签信息.yaml
# 只执行打上标签的一个模块
ansible-playbook --skip-tags=error rsync_server_标签信息.yaml
# 忽略标签,执行标签以外的其他模块
在剧本中设置触发信息
- 一般用于一些配置文件修改了,通知service模块重启服务
vim 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/ansible-playbook/rsyncd.conf dest=/etc
# 通知: 判断上面的配置文件是否又改动,如果上面的配置文件如果改动了,那么就电话统治运维人员,重启服务,执行handlers
notify: restart rsync server
- name: 03-useradd
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-bak
file: dest=/lala_bak state=directory owner=rsync group=rsync
- name: 05-passwd
copy: content='lala:123' dest=/etc/rsync.passwd mode=600
- name: 06-start
service: name=rsyncd state=started enabled=yes
# 接收通知:
# 接受通知信息: 重启服务
handlers:
- name: restart rsync server # 注释信息必须跟notify的通知信息保持一致
service: name=rsyncd state=restarted
- hosts: rsync_client
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-create passwd file
copy: content='123' dest=/etc/rsync.password mode=600
- name: 03-check test data back
file: dest=/test.txt state=touch
- name: 04-test
shell: rsync -az /test.txt lala@172.16.1.41::nana --password-file=/etc/rsync.password
编写NFS服务剧本
编写剧本的三个主要流程
- 创建剧本目录
mkdir nfs_file
mkdir nfs_file/{nfs_server,nfs_client}
tree nfs_file/
# nfs_file/
# ├── nfs_client
# └── nfs_server
- 编写剧本信息
1. 配置主机清单文件
vim /etc/ansible/hosts
[nfs:children]
nfs_server
nfs_client
[nfs_server]
172.16.1.31
[nfs_client]
172.16.1.9
# 172.16.1.8
# 172.16.1.7
172.16.1.41
2. 修改主配置文件
cd /etc/ansible/ansible-playbook
vim nfs_server.yaml
- hosts: nfs
tasks:
- name: 01-install nfs
yum:
name: ["nfs-utils","rpcbind"] # 在客户端和服务端都下载nfs,rpc
state: installed
- hosts: nfs_server
vars:
- data_dir: /data
tasks:
- name: 01-copy conf
copy: src=/etc/ansible/ansible-playbook/nfs_file/nfs_server/exports dest=/etc # 上传nfs服务器配置文件
notify: restart nfs server # 判断上传到nfs服务器的配置文件有没有发生变化
- name: 02-create data dir
file: dest={{ data_dir }} state=directory owner=nfsnobody group=nfsnobody # 创建共享目录,修改属组和属主
- name: 03-boot server
# service: name=rpcbind state=started enabled=yes
# service: name=nfs state=started enabled=yes
service: name={{ item }} state=started enabled=yes # 启动服务,设置成开机自动挂载
with_items:
- rpcbind
- nfs
handlers:
- name: restart nfs server
service: name=nfs state=restarted # 如果本地上传给nfs服务器的配置文件发生变化,重启nfs服务
- hosts: nfs_client
vars:
- data_dir: /data
tasks:
- name: 01-mount
mount: src=172.16.1.31:{{ data_dir }} path=/mnt fstype=nfs state=mounted # 挂载使用nfs服务器的共享目录到/mnt
- name: 02-check mount info
shell: df -h | grep /data # 查看挂载信息
register: mount_info # 将挂载信息定义一个变量名
- name: 03-display mount info
debug: msg={{ mount_info.stdout_lines }} # 标准化输出挂载信息
- 在本地创建nfs的配置文件
echo "data 172.16.1.0/24(rw,sync)" > nfs_file/nfs_server/exports
- 进行剧本测试
ansible-playbook nfs_server.yaml
# ok: [172.16.1.9] => {
# "msg": [
# "172.16.1.31:/data 19G 2.3G 17G 12% /mnt"
# ]
# }
# ok: [172.16.1.41] => {
# "msg": [
# "172.16.1.31:/data 19G 2.3G 17G 12% /mnt"
# ]
# }
如何执行剧本:
第一个步骤:检查剧本语法格式
ansible-playbook --syntax-check rsync_server.yaml
第二个步骤:模拟执行剧本
ansible-playbook -C rsync_server.yaml
第三个步骤:直接执行剧本
ansible-playbook rsync_server.yaml
在剧本中进行剧本整合
- 方式一:
vim site01.yaml
- include: rsync_server.yaml # 不建议使用这种方式, - include: 该特性将在版本2.12中删除
- include: nfs_server.yaml # 不建议使用这种方式, - include: 该特性将在版本2.12中删除
ansible-playbook site01.yam 执行剧本
补充说明:
我们在执行剧本文件的时候,剧本运行到TASK [Gathering Facts](执行ansible,系统默认运行的模块)时,通常运行速度会比较慢,
这个时候,系统默认会收集主机信息,这个时候会访问到远程主机。
如果不搜集主机信息,我们在设置远程主机的时候,可能会出现卡死的现象。
设置不搜集主机信息,忽略[Gathering Facts]模块,在- hosts下面加上gather_facts: no即可。
- 方式二:
vim site01.yaml
- import_playbook: rsync_server.yaml # 推荐使用这一种!!!
- import_playbook: nfs_server.yaml # 推荐使用这一种!!!
ansible-playbook site01.yam 执行剧本
ansible程序roles
剧本编写完问题
- 目录结构不够规范
- 编写好的任务无法重复调用
- 服务端配置文件改动,客户端参数信息也自动变化
- 汇总剧本中没有显示主机角色信息
- 一个剧本内容信息过多,不容易进行阅读,如何让进行拆分
roles(角色)的作用 : 将剧本中的角色和任务进拆分,让剧本的编写更加规范 !
编写nfs服务端角色目录
- 规范目录结构(ansible定义好的目录规范)
cd /etc/ansible/roles/
mkdir {rsync,nfs_server} 创建相应角色目录
mkdir {rsync,nfs_server}/{vars,tasks,templates,handlers,files} 创建角色目录下面的子目录
tree 角色目录下的目录结构
.
├── nfs_server
│ ├── files 保存需要分发文件目录
│ ├── handlers 保存触发器配置文件信息
│ ├── tasks 保存要执行的动作信息文件
│ ├── templates 保存需要分发的模板文件 模板文件中可以设置变量信息
│ └── vars 保存变量信息文件
└── rsync
├── files
├── handlers
├── tasks
├── templates
└── vars
- 在roles目录中创建相关文件
- 编写文件流程
cd /etc/ansible/roles/nfs_server
1. 编写tasks目录中的main.yml文件
vim tasks/main.yml # main文件是固定文件名
- name: 01-copy conf
copy: src=exports dest=/etc # 发送的文件exports默认会从.../files/exports路径里面找
notify: restart nfs server
- name: 02-create data dir
file: dest={{ data_dir }} state=directory owner=nfsnobody group=nfsnobody
- name: 03-boot server
service: name={{ item }} state=started enabled=yes
with_items:
- rpcbind
- nfs
2. 编写vars目录中的main.yml文件
vim var/main.yml # main文件是固定文件名
data_dir: /data
3. 编写files目录中的文件
echo "/data 172.16.1.0/24(rw,sync)" > files/exports
4. 编写handlers目录中的main.yml文件
vim handlers/main.yml # main文件是固定文件名
- name: restart nfs server
service: name=nfs state=restarted
- 编写一个主剧本文件
vim /etc/ansible/roles/site.yml
- hosts: nfs_server # 跟/etc/ansible/hosts主机清单配置文件的名字保持一致性
roles:
- nfs_server # 角色目录
剧本加载流程图
编写rsync服务端角色目录
- 规范目录结构(ansible定义好的目录规范)
cd /etc/ansible/roles/
mkdir rsync_server 创建相应角色目录
mkdir rsync_server/{vars,tasks,templates,handlers,files} 创建角色目录下面的子目录
- 在roles目录中创建相关文件
- 编写文件流程
cd /etc/ansible/roles/rsync_server
1. 编写tasks目录中的main.yml文件
vim tasks/main.yml
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf file
template: src=rsyncd.conf dest=/etc # 模板文件中可以设置变量信息
notify: restart rsync server
- name: 03-useradd
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-bak
file: dest={{ backupdir }} state=directory owner=rsync group=rsync
- name: 05-passwd
copy: content='lala:123' dest=/etc/{{ passfile }} mode=600
- name: 06-start
service: name=rsyncd state=started enabled=yes
2. 编写vars目录中的main.yml文件
vim vars/main.yml
backupdir: /lala_bak
port_info: 873
passfile: rsync.password
3. 编写templates目录中的文件
vim templates/rsyncd.conf
uid = rsync
gid = rsync
port = {{ port_info }} # 模板文件中将端口号设置成变量名,我们在控制端编写端口号,被控制端也会跟着变
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = lala
secrets file = /etc/rsync.password
log file = /var/log/rsyncd.log
#################################################################################
[nana]
comment = "备份文件的目录"
path = /lala_bak
[web]
comment = "web目录"
path = /lala_bak01
4. 编写handlers目录中的main.yml文件
vim handlers/main.yml
- name: restart rsync server
service: name=rsyncd state=restarted
- 编写一个主剧本文件
- hosts: nfs_server # 跟/etc/ansible/hosts主机清单配置文件的名字保持一致性
roles:
- nfs_server # 角色目录
- hosts: rsync_server # 跟/etc/ansible/hosts主机清单配置文件的名字保持一致性
roles:
- rsync_server # 角色目录
template模块补充 : 用法跟file模块很像,都是用来做数据传输的,区别: template模块可以在传输的模板文件中可以设置变量信息!!!
- 基于ansible程序roles拆分的思想,我们可以把tasks/main.yml执行文件再次进行拆分
1. 编写tasks目录中的main.yml文件
vim tasks/main.yml
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf file
template: src=rsyncd.conf dest=/etc # 模板文件中可以设置变量信息
notify: restart rsync server
- name: 03-useradd
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-bak
file: dest={{ backupdir }} state=directory owner=rsync group=rsync
- name: 05-passwd
copy: content='lala:123' dest=/etc/{{ passfile }} mode=600
- name: 06-start
service: name=rsyncd state=started enabled=yes
- 拆分执行文件,并将拆分好的执行文件进行剧本整合
1. 拆分执行文件
vim install_rsync.yml
- name: 01-install rsync
yum: name=rsync state=installed
vim push_conf_file.yml
- name: 02-push conf file
template: src=rsyncd.conf dest=/etc
notify: restart rsync server
vim useradd.yml
- name: 03-useradd
user: name=rsync create_home=no shell=/sbin/nologin
vim backup_dir.yml
- name: 04-bak
file: dest={{ backupdir }} state=directory owner=rsync group=rsync
vim passwd.yml
- name: 05-passwd
copy: content='lala:123' dest=/etc/{{ passfile }} mode=600
vim start.yml
- name: 06-start
service: name=rsyncd state=started enabled=yes
2. 将拆分好的执行文件进行剧本整合
vim main.yml
- include: install_rsync.yml
- include: push_conf_file.yml
- include: useradd.yml
- include: backup_dir.yml
- include: passwd.yml
- include: start.yml
- 拆分好执行所有文件后最终的树形图
[root@m01 roles]# tree
.
├── nfs_server
│ ├── files
│ │ └── exports
│ ├── handlers
│ │ └── main.yml
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ └── vars
│ └── main.yml
├── rsync_server
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── tasks
│ │ ├── backup_dir.yml
│ │ ├── install_rsync.yml
│ │ ├── main.yml
│ │ ├── passwd.yml
│ │ ├── push_conf_file.yml
│ │ ├── start.yml
│ │ └── useradd.yml
│ ├── templates
│ │ └── rsyncd.conf
│ └── vars
│ └── main.yml
└── site.yml
总结
- 针对于一些复杂的架构,我们可以通过拆分的方式,减少了剧本的冗余性,增加了剧本的可复用性。