[Ansible]-03 剧本编写角色信息.
第一章 Ansible 角色介绍
1.1 为什么需要使用角色
传统剧本编写完成后存在以下问题:
1)目录结构不够规范,例如,配置文件随便放,不标准
2) 编写好的任务不方便进行重复调用,影响效率
3)如果服务端配置文件改动,客户端参数信息也自动变化,不容易实现
4)汇总剧本中没有显示主机角色信息
5)一个剧本内容信息过多,阅读性差
为了解决以上问题,可以使用剧本角色功能
1.2.角色解决了什么问题
1.把剧本 拆分 拆分 拆分
2.解耦,结构更清晰,调试更方便
1.3.编写角色的最佳实践
1.初级阶段,不要直接写角色,先写好剧本,然后再拆分
2.一开始不要想一步到位,不用拆的很细,尤其是变量
1.4.角色调用流程图
第二章 角色目录规划
2.0.官方说明
https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html
2.1 规范目录结构
注意!这里的目录结构必须按照官方定义的要求来做!不是自己随便乱起!
[root@m01:~]# cd /etc/ansible/roles/
[root@m01:/etc/ansible/roles]# mkdir {rsync,nfs,web,sersync}/{tasks,handlers,files,templates,vars} #创建相应角色目录并创建角色目录下面的子目录
[root@m01:/etc/ansible/roles]# tree
.
└── rsync
├── files
├── handlers
├── tasks
├── templates
└── vars
roles #必须叫roles
tasks #存放playbook的目录,其中main.yml是主入口文件,在main.yml中导入其他yml文件,要采用import_tasks关键字,include要弃用了
handlers #存放handlers文件(存放tasks中的notify指定的内容)
files #ansible中unarchive、copy等模块会自动来这里找文件,从而我们不必写绝对路径,只需写文件名
templates#存放模板文件。template模块会将模板文件中的变量替换为实际值,然后覆盖到客户机指定路径上
vars #存放变量信息文件
第三章 实战演练-编写rsync角色
3.0 编写思路
1.先写好剧本
2.创建角色目录
3.拷贝需要发送的文件到指定目录
4.拆分剧本
3.1 编写主机清单
[root@m01 ~]# cat /etc/ansible/hosts
[rsync_server]
192.168.81.165
[rsync_client]
192.168.81.162
192.168.81.163
3.2 编写初始剧本
# vim /etc/ansible/ansible-playbook/rsync_install.yml
- hosts: rsync_server
vars:
backupdir: /backup
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf&pass
copy: src=/etc/ansible/server_file/rsync/{{ item.src }} dest={{ item.dest }} mode={{ item.mode }}
loop:
- { src: 'rsyncd.conf', dest: '/etc/', mode: '644' }
- { src: 'rsync.password', dest: '/etc/', mode: '600' }
notify: restart rsyncd
ignore_errors: yes
- name: 03-create user
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-create backup dir
file: path={{ backupdir }} state=directory owner=rsync group=rsync
when: (ansible_hostname == "backup")
- name: 05-start rsync server
systemd: name=rsyncd state=started enabled=yes
handlers:
- name: restart rsyncd
systemd: name=rsyncd state=restarted
- hosts: rsync_client
vars:
passfile: rsync.password
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-create password file
copy: content=123456 dest=/etc/{{ passfile }} mode=600
- name: 03-create test nfs file
file: dest=/tmp/test_nfs.txt state=touch
when: (ansible_hostname == "nfs01")
- name: 04-create test web file
file: dest=/tmp/test_web.txt state=touch
when: (ansible_hostname == "web01")
- name: 05-check test_nfs
shell: rsync -avz /tmp/test.txt rsync_backup@192.168.81.165::backup --password-file=/etc/{{ passfile }}
3.3 创建角色目录
[root@m01 ~]# cd /etc/ansible/roles/
[root@m01 /etc/ansible/roles]# mkdir -p {rsync_server,rsync_client}/{tasks,handlers,files,templates,vars}
[root@m01:/etc/ansible/roles]# tree
.
├── rsync_client
│ ├── files
│ ├── handlers
│ ├── tasks
│ ├── templates
│ └── vars
└── rsync_server
├── files
├── handlers
├── tasks
├── templates
└── vars
3.4 rsync服务端角色配置:
#第一步:编写tasks目录中的main.yml文件
[root@m01 ~]# vim /etc/ansible/roles/rsync_server/tasks/main.yml
[root@m01 ~]# cat /etc/ansible/roles/rsync_server/tasks/main.yml
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf_file & pass_file
copy: src={{ item.src }} dest={{ item.dest }} mode={{ item.mode }}
loop:
- { src: 'rsyncd.conf', dest: '/etc/', mode: '644' }
- { src: 'rsync.password', dest: '/etc/', mode: '600' }
notify: restart rsyncd
- name: 03-create user
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-create backup dir
file: path={{ backupdir }} state=directory owner=rsync group=rsync
when: (ansible_hostname == "backup")
- name: 05-start rsync server
systemd: naem=rsyncd state=started enabled=yes
#第二步:编写vars目录中的main.yml文件
[root@m01 ~]# vim /etc/ansible/roles/rsync_server/vars/main.yml
backupdir: /backup
#第三步:把配置文件复制到file目录
cp src=/etc/ansible/server_file/rsync/* /etc/ansible/roles/rsync_server/files/
rsyncd.conf
rsync.password
#第四步:编写handlers目录中的main.yml文件
[root@m01 ~]# vim /etc/ansible/roles/rsync_server/handlers/main.yml
- name: restart rsyncd
systemd:
name: rsyncd
state: restarted
#第五步:精简tasks任务文件
[root@m01 ~]# cat /etc/ansible/roles/rsync_server/tasks/main.yml
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf_file & pass_file
copy: src={{ item.src }} dest={{ item.dest }} mode={{ item.mode }}
loop:
- { src: 'rsyncd.conf', dest: '/etc/', mode: '644' }
- { src: 'rsync.password', dest: '/etc/', mode: '600' }
notify: restart rsync server
- name: 03-create user
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-create backup dir
file: path={{ backupdir }} state=directory owner=rsync group=rsync
when: (ansible_hostname == "backup")
- name: 05-start rsync server
systemd: naem=rsyncd state=started enabled=yes
3.5 rsync客户端角色配置:
#第一步:编写tasks目录中的main.yml文件
[root@m01 ~]# vim /etc/ansible/roles/rsync_client/tasks/main.yml
.......略........
#第二步:编写vars目录中的main.yml文件
[root@m01 ~]# vim /etc/ansible/roles/rsync_client/vars/main.yml
passfile: rsync.password
#第三步:把配置文件复制到file目录
cp src=/etc/ansible/server_file/rsync_client/* /etc/ansible/roles/rsync_client/files/
rsyncd.conf
rsync.password
#第四步:编写handlers目录中的main.yml文件
无
#第五步: 精简tasks任务文件
[root@m01 ~]# cat /etc/ansible/roles/rsync_client/tasks/main.yml
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-create password file
copy: content=123456 dest=/etc/{{ passfile }} mode=600
- name: 03-create test nfs file
file: dest=/tmp/test_nfs.txt state=touch
when: (ansible_hostname == "nfs01")
- name: 04-create test web file
file: dest=/tmp/test_web.txt state=touch
when: (ansible_hostname == "web01")
- name: 05-check test_nfs
shell: rsync -avz /tmp/test_nfs.txt rsync_backup@192.168.81.165::backup --password=file=/etc/{{ passfile }}
when: (ansible_hostname == "nfs01")
- name: 06-check test_web
shell: rsync -avz /tmp/test_web.txt rsync_backup@192.168.81.165::backup --password=file=/etc/{{ passfile }}
when: (ansible_hostname == "web01")
3.6 编写一个主剧本文件
[root@m01 ~]# vim /etc/ansible/site.yml #site为自定义名称,用来读取角色目录
- hosts: rsync_server
roles:
- rsync_server #定义加载指定角色目录信息
- hosts: rsync_client
roles:
- rsync_client
3.7 调试运行
cd /etc/ansible/
ansible-playbook -C site.yaml
ansible-playbook site.yaml
3.8 优化-模板的使用
1)优化背景:当安装完rsync后,rsync默认配置的端口是873,当我们经常修改被管理的rsync服务端的端口时,就需要修改rsyncd.conf配置文件,假如我们现在需要一次性在10台主机上安装rsync,端口改为874,难道我们要修改10台主机上的配置文件吗?显然,应该有更加方便的方法能够解决这个问题,没错,这个方法就是使用"模板"。
2)如果想要解决上述问题,我们可以先创建一个"模板"文件,ansible会根据"模板"文件,为每一台主机生成对应的配置文件,大致步骤如下:
1、找一个现成的rsyncd.d配置文件,作为"模板"文件,你可以从之前安装过rsync的主机中拷贝一份,也可以从rsync的rpm包中提取一份。
2、修改模板文件,将port设置部分使用变量进行替换。
3、使用ansible调用"template"模块,对"模板文件"进行渲染,根据模板生成每个主机对应的配置文件,并将最终生成的配置文件拷贝到目标主机中。
实现如下:
#第一步:将file中的文件移动到/templates目录下
[root@m01 ~]# mv /etc/ansible/roles/rsync_server/files/ /etc/ansible/roles/rsync_server/templates/
rsyncd.conf
rsync.password
#第二步:设置配置文件中的端口变量
[root@m01 ~]# vim /etc/ansible/roles/rsync_server/templates/rsyncd.conf
port = {{ Port_info }}
#第三步:编写vars目录中的main.yml文件
[root@m01 ~]# vim /etc/ansible/roles/rsync_server/vars/main.yml
backupdir: /backup
Port_info: 874
#第四步:将copy模块改为template模块
vim /etc/ansible/roles/rsync_server/tasks/main.yml
- name: 02-push conf_file & pass_file
template: src={{ item.src }} dest={{ item.dest }} mode={{ item.mode }}
loop:
-{ src: 'rsyncd.conf', dest: '/etc/', mode: '644' }
-{ src: 'rsync.password', dest: '/etc/', mode: '600' }
notify: restart rsync server
3.8 优化-tasks任务的再次拆分
需求背景:其实我们还可以将tasks任务再进行拆分,如果其它的服务也要使用相同的模块,可以直接进行调用或者直接将拆分后的文件拷贝至相应角色目录子目录下
例:
vim main.yml
- include_tasks: install_rsync.yml
- include_tasks: push_file.yml
- include_tasks: creat_user.yml
- include_tasks: creat_bakupdir.yml
- include_tasks: boot_server.yml
vim install_rsync.yml
- name: 01-install rsync
yum: name=rsync state=installed
vim push_file.yml
- name: 02-push conf_file & pass_file
copy: src={{ item.src }} dest={{ item.dest }} mode={{ item.mode }}
loop:
-{ src: 'rsyncd.conf', dest: '/etc/', mode: '644' }
-{ src: 'rsync.password', dest: '/etc/', mode: '600' }
notify: restart rsync server
vim creat_user.yml
- name: 03-create user
user: name=rsync create_home=no shell=/sbin/nologin
vim creat_bakupdir.yml
- name: 04-create backup dir
file: path={{ backupdir }} state=directory owner=rsync group=rsync
when: (ansible_hostname == "backup")
vim boot_server.yml
- name: 05-start rsync server
systemd: naem=rsyncd state=started enabled=yes
第四章 实战演练-编写nfs角色
4.0 编写思路
1.先拷贝配置文件到template目录下并重命名为j2
2.编写handlers
3.编写tasks
4.1 编写NFS服务剧本
4.11 创建目录结构
#创建nfs,nfs-server和nfs-client客户端角色目录
cd /etc/ansible/roles/
mkdir -p {nfs,nfs-server,nfs-client}/{tasks,handlers,files,templates,vars}
4.12 编写nfs公共部分
[root@m01 ~]# vim /etc/ansible/roles/nfs/tasks/main.yml
- name: 01-install rpcbind & nfs
yum:
name: [ 'rpcbind', 'nfs-utils' ]
state: installed
4.12 编写nfs-server部分
#第一步: 编写tasks目录中的main.yml文件
#方式一:不对具体任务进行拆分
vim /etc/ansible/roles/nfs-server/tasks/main.yml
- name: 01-copy conf file
template: src=exports.j2 dest=/etc/exports #会自动到角色目录下寻找exports.j2的文件
notify: nfs_restart
- name: 02-create data dir
file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody
# path: ['data01','data02','data03']
# state: directory
# owner: nfsnobody
# group: nfsnobody
- name: 03-boot server
service: name={{ item }} state=started enabled=yes
loop: #利用循环功能启动rpcbind,nfs
- rpcbind
- nfs
#方式二:对具体任务进行拆分(拆分成多个小任务----->更标准)
cd /etc/ansible/roles/nfs-server/tasks/
vim main.yml //将所有的任务汇总到这里。每个任务中有判断功能。
- include_tasks: copy_info.yml
- include_tasks: create_dir.yml
- include_tasks: boot_server.yml
vim copy_info.yml
- name: 01-copy conf file
copy: src=exports.j2 dest=/etc/exports
notify: restart nfs server
vim create_dir.yml
- name: 02-create data dir
file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody
vim boot_server.yml
- name: 03-boot server
service: name={{ item }} state=started enabled=yes
loop:
- rpcbind
- nfs
#第二步:编写vars目录中的main.yml文件
[root@m01 vars]# vim main.yml
Data_dir: /data
#第三步:编写jinja模版文件
[root@m01 templates]# vim /etc/ansible/roles/nfs_server/templates/exports.j2
/data 192.168.81.1(rw,sync)
#第四步:编写handlers目录中的main.yml文件
vim main.yml
- name: restart nfs server
service: name=nfs state=restarted
4.13 编写nfs-client部分
#第一步:编写tasks目录中的main.yml文件
- name: 01-mount
mount: src=192.168.81.165:{{ Data_dir }} path=/mnt fstype=nfs state=mounted
- name: 02-check mount info
shell: df -h|grep /data
register: mount_info #对上面的df -h进行注册,再通过下面的debug显示出命令执行的结果
- name: display mount_info
debug: msg={{ mount_info.stdout_lines }}
#第二步:编写vars目录中的main.yml文件
[root@m01 vars]# vim main.yml
Data_dir: /data
4.14 编写调用文件
#:编写一个主剧本文件
[root@m01 roles]# vim site.yml
- hosts: nfs
roles:
- nfs
- hosts: nfs_server
roles:
- nfs-server
- hosts: nfs_client
roles:
- nfs-client