ansible自动化软件工具(04)

剧本执行出现错误排查思路/步骤

  1. 找到剧本中出现问题的关键点
  2. 将剧本中的操作转换成模块进行操作
  3. 将模块的功能操作转换成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服务剧本

编写剧本的三个主要流程

  1. 创建剧本目录
mkdir nfs_file
mkdir nfs_file/{nfs_server,nfs_client}
tree nfs_file/
# nfs_file/
# ├── nfs_client
# └── nfs_server
  1. 编写剧本信息
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
  1. 进行剧本测试
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

剧本编写完问题

  1. 目录结构不够规范
  2. 编写好的任务无法重复调用
  3. 服务端配置文件改动,客户端参数信息也自动变化
  4. 汇总剧本中没有显示主机角色信息
  5. 一个剧本内容信息过多,不容易进行阅读,如何让进行拆分
roles(角色)的作用 : 将剧本中的角色和任务进拆分,让剧本的编写更加规范 !

编写nfs服务端角色目录

  1. 规范目录结构(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
  1. 在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
  1. 编写一个主剧本文件
vim /etc/ansible/roles/site.yml
- hosts: nfs_server					# 跟/etc/ansible/hosts主机清单配置文件的名字保持一致性
  roles:
    - nfs_server					# 角色目录

剧本加载流程图

在这里插入图片描述

编写rsync服务端角色目录

  1. 规范目录结构(ansible定义好的目录规范)
cd /etc/ansible/roles/
mkdir rsync_server						创建相应角色目录
mkdir rsync_server/{vars,tasks,templates,handlers,files}			创建角色目录下面的子目录
  1. 在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
  1. 编写一个主剧本文件
- 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

总结

  • 针对于一些复杂的架构,我们可以通过拆分的方式,减少了剧本的冗余性,增加了剧本的可复用性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值