剧本的扩展功能配置
主机名称和IP地址规划
服务 | 主机名 | eth0网卡IP | eth1网卡IP | 软件 |
---|---|---|---|---|
防火墙服务器 | firewalld | 10.0.0.81 | 172.16.1.81 | firewalld |
负载均衡服务器 | lb01 | 10.0.0.5 | 172.16.1.5 | nginx,keepalived |
负载均衡服务器 | lb02 | 10.0.0.6 | 172.16.1.6 | nginx,keepalived |
web服务器 | web01 | 10.0.0.7 | 172.16.1.7 | nginx |
web服务器 | web02 | 10.0.0.8 | 172.16.1.8 | nginx |
web服务器 | web03 | 10.0.0.9 | 172.16.1.9 | nginx |
存储服务器 | nfs01 | 10.0.0.31 | 172.16.1.31 | nfs |
备份服务器 | backup | 10.0.0.41 | 172.16.1.41 | rsync |
数据库服务器 | db01 | 10.0.0.51 | 172.16.1.51 | mysql,mariaDB |
批量管理服务器 | m01 | 10.0.0.61 | 172.16.1.61 | ansible |
跳板机服务器 | jumpserver | 10.0.0.71 | 172.16.1.71 | jumpserver |
监控服务器 | zabbix | 10.0.0.72 | 172.16.1.72 | zabbix |
缓存服务器 | 暂无 | 暂无 | 暂无 | 暂无 |
在剧本中设置循环信息
- 单变量循环
- hosts: 172.16.1.31
tasks:
- name: touch
copy: content='1997sty' dest={{item}}
with_items:
- /tmp/1997sty1
- /tmp/1997sty2
- 数组形式(测试的时候不能直接填写路径,所以这里用yum命令举例)
- hosts: 172.16.1.31
tasks:
- name: install
yum:
name: ['rsync', 'tree', 'wget']
state: installed
- 多变量循环
- hosts: 172.16.1.31
tasks:
- name: touch
copy: content={{item.text}} dest={{item.dir}}
with_items:
- {text: '1997sty1',dir: '/tmp/1997sty1'}
- {text: '1997sty2',dir: '/tmp/1997sty2'}
剧本执行出现错误排查思路/步骤
- 找到剧本中出现问题关键点
- 将剧本中的操作转换成模块进行操作
- 将模块的功能操作转换成linux命令
- 本地管理主机上执行命令测试
- 远程被管理主机上执行命令测试
在剧本中设置忽略错误
ignore_errors: yes
- hosts: 172.16.1.31
tasks:
- name: install
# echo 123 -> cho 123 演示忽略错误
command: cho 123
ignore_errors: yes
- 也可以写在上面
- hosts: 172.16.1.31
ignore_errors: yes
tasks:
- name: install
# echo 123 -> cho 123 演示忽略错误
command: cho 123
忽略错误并继续执行剧本
[root@m01 ~]# ansible-playbook run.ymal
PLAY [172.16.1.31] **************************************************************
TASK [Gathering Facts] **********************************************************
ok: [172.16.1.31]
TASK [install] ******************************************************************
fatal: [172.16.1.31]: FAILED! => {"changed": false, "cmd": "cho 123", "msg": "[Errno 2] 没有那个文件或目录", "rc": 2}
...ignoring
PLAY RECAP **********************************************************************
172.16.1.31 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
在剧本中设置标签功能
- hosts: 172.16.1.31
tasks:
- name: http
yum: name=httpd state=installed
tags: t1
- name: install wget
yum: name=wget state=installed
tags: t2
- 使用命令执行指定标签的内容
#执行标签t1
ansible-playbook run.ymal --tags=t1
#跳过执行标签t1
ansible-playbook run.ymal --skip-tags=t1
在剧本中设置触发功能
- hosts: 172.16.1.31
tasks:
- name: http
yum: name=httpd state=installed
notify: restart httpd server
#如果发生改变就会触发notify执行handlers中name为restart httpd server的内容
handlers:
- name: restart httpd server
service: name=httpd state=restarted
第一次执行如果安装httpd就睡执行handlers的内容,第二次就不会执行
[root@m01 ~]# ansible-playbook run.ymal
PLAY [172.16.1.31] **************************************************************
TASK [Gathering Facts] **********************************************************
ok: [172.16.1.31]
TASK [http] *********************************************************************
changed: [172.16.1.31]
RUNNING HANDLER [restart httpd server] ******************************************
changed: [172.16.1.31]
PLAY RECAP **********************************************************************
172.16.1.31 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@m01 ~]# ansible-playbook run.ymal
PLAY [172.16.1.31] **************************************************************
TASK [Gathering Facts] **********************************************************
ok: [172.16.1.31]
TASK [http] *********************************************************************
ok: [172.16.1.31]
PLAY RECAP **********************************************************************
172.16.1.31 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
将多个剧本进行整合
方法一
include_tasks
- hosts: all
tasks:
- include_tasks: f1.yml
- include_tasks: f2.yml
方法二
include
- include:f1.yml
- include:f2.yml
方法三
import_playbook
- import_playbook: base.yml
- import_playbook: rsync.yml
- import_playbook: nfs.yml
NFS服务部署剧本
创建目录
[root@m01 ansible-playbook]# tree
.
└── nfs-file
├── nfs-client
└── nfs-server
/etc/ansible/hosts
追加以下参数
[nfs:children]
nfs_server
nfs_client
[nfs_server]
172.16.1.31
[nfs_client]
172.16.1.7
172.16.1.8
172.16.1.9
剧本内容
- hosts: nfs
tasks:
- name: install nfs
yum: state=installed name=nfs-utils
- name: install rpcbind
yum: state=installed name=rpcbind
- hosts: nfs_server
tasks:
- name: push exports
copy: src=/etc/ansible/ansible-playbook/nfs-file/nfs-server/exports dest=/etc
notify: restart nfs server
- name: mkdir /data nfsnobody.nfsnobody
file: path=/data state=directory owner=nfsnobody group=nfsnobody
- name: rpcbind
service: name=rpcbind state=started enabled=yes
- name: nfs
service: name=nfs state=started enabled=yes
handlers:
- name: restart nfs server
service: name=nfs state=restarted
- hosts: nfs_client
tasks:
- name: mount /data
mount: src=172.16.1.31:/data path=/mnt fstype=nfs state=mounted
- name: check
shell: df -h| grep /data
register: mount_info
- name: print
debug: msg={{ mount_info.stdout_lines }}
ansible程序roles
剧本编写问题
- 目录结构不够规范
- 编写好的任务如何重复调用
- 服务端配置文件改动,客户端参数信息也自动变化
- 汇总剧本中没有显示主机角色信息
- 一个剧本内容信息过多,不容易进行阅读,如何进行拆分
规范剧本目录
cd /etc/ansible/roles
mkdir {rsync,nfs}
mkdir {nfs,rsync}/{vars,tasks,templates,handlers,files}
#目录结构
[root@m01 roles]# tree
.
├── nfs
│ ├── files #保存需要分发文件目录
│ ├── handlers #保存触发器配置文件信息
│ ├── tasks #保存要执行的动作信息文件
│ ├── templates #保存需要分发模板文件 模板文件中可以设置变量信息
│ └── vars #保存变量信息文件
└── rsync
├── files
├── handlers
├── tasks
├── templates
└── vars
创建相关文件
- 所在位置
/etc/ansible/roles
./nfs/files/exports
/data 172.16.1.0/24(rw,sync)
./nfs/handlers/main.yml
- name: restart nfs server
service: name=nfs state=restarted
./nfs/tasks/main.yml
- name: install nfs
yum: state=installed name=nfs-utils
- name: install rpcbind
yum: state=installed name=rpcbind
- name: push exports
copy: src=exports dest=/etc
notify: restart nfs server
- name: mkdir {{ data }} nfsnobody.nfsnobody
file: path={{ data }} state=directory owner=nfsnobody group=nfsnobody
- name: rpcbind
service: name=rpcbind state=started enabled=yes
- name: nfs
service: name=nfs state=started enabled=yes
./nfs/vars/main.yml
data: /data
./site.yml
- hosts: nfs_server
roles:
- nfs
- 运行剧本,会自动完成服务端的部署
ansible-playbook site.yml
- 运行结果
[root@m01 roles]# ansible-playbook site.yml
PLAY [nfs_server] ***********************************************************************
TASK [Gathering Facts] ******************************************************************
ok: [172.16.1.31]
TASK [nfs : install nfs] ****************************************************************
ok: [172.16.1.31]
TASK [nfs : install rpcbind] ************************************************************
ok: [172.16.1.31]
TASK [nfs : push exports] ***************************************************************
changed: [172.16.1.31]
TASK [nfs : mkdir /data nfsnobody.nfsnobody] ********************************************
ok: [172.16.1.31]
TASK [nfs : rpcbind] ********************************************************************
ok: [172.16.1.31]
TASK [nfs : nfs] ************************************************************************
ok: [172.16.1.31]
RUNNING HANDLER [nfs : restart nfs server] **********************************************
changed: [172.16.1.31]
PLAY RECAP ******************************************************************************
172.16.1.31 : ok=8 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
使用templates目录分发模版文件
- 可以选择将
./nfs/files/exports
移动到./nfs/templates/exports
中 - 修改
./nfs/templates/exports
,修改./nfs/tasks/main.yml
- 在推送
./nfs/templates/exports
时,会自动加载data
变量
./nfs/templates/exports
#修改之前
/data 172.16.1.0/24(rw,sync)
#修改之后 修改为变量,./nfs/tasks/main.yml中的推送方式改为template
{{ data }} 172.16.1.0/24(rw,sync)
./nfs/tasks/main.yml
#修改之前
- name: install nfs
yum: state=installed name=nfs-utils
- name: install rpcbind
yum: state=installed name=rpcbind
- name: push exports
copy: src=exports dest=/etc
notify: restart nfs server
- name: mkdir {{ data }} nfsnobody.nfsnobody
file: path={{ data }} state=directory owner=nfsnobody group=nfsnobody
- name: rpcbind
service: name=rpcbind state=started enabled=yes
- name: nfs
service: name=nfs state=started enabled=yes
#修改之后 template会推送templates目录下的文件并加载其中的变量
- name: install nfs
yum: state=installed name=nfs-utils
- name: install rpcbind
yum: state=installed name=rpcbind
- name: push exports
template: src=exports dest=/etc
notify: restart nfs server
- name: mkdir {{ data }} nfsnobody.nfsnobody
file: path={{ data }} state=directory owner=nfsnobody group=nfsnobody
- name: rpcbind
service: name=rpcbind state=started enabled=yes
- name: nfs
service: name=nfs state=started enabled=yes
- 运行剧本,会自动完成服务端的部署
ansible-playbook site.yml
- 运行结果
[root@m01 roles]# ansible-playbook site.yml
PLAY [nfs_server] ***********************************************************************
TASK [Gathering Facts] ******************************************************************
ok: [172.16.1.31]
TASK [nfs : install nfs] ****************************************************************
ok: [172.16.1.31]
TASK [nfs : install rpcbind] ************************************************************
ok: [172.16.1.31]
TASK [nfs : push exports] ***************************************************************
changed: [172.16.1.31]
TASK [nfs : mkdir /data nfsnobody.nfsnobody] ********************************************
ok: [172.16.1.31]
TASK [nfs : rpcbind] ********************************************************************
ok: [172.16.1.31]
TASK [nfs : nfs] ************************************************************************
ok: [172.16.1.31]
RUNNING HANDLER [nfs : restart nfs server] **********************************************
changed: [172.16.1.31]
PLAY RECAP ******************************************************************************
172.16.1.31 : ok=8 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- 设定的
data
变量为/data,所以运行剧本后172.16.1.31的
/etc/exports`内容如下
[root@nfs01 /]# cat /etc/exports
/data 172.16.1.0/24(rw,sync)
最后一次更新于2020-01-10 21:29
0 条评论