利用角色简化playbook
我们知道ansible可以自定义模块,便于自己或他人调用,它也有一个特有的名称叫做角色。每个角色对应的服务可能不太一样,比如mysql,httpd,nginx,memcached。虽然每个角色(模块)的功能不一样,但是他们都以特定的目录结构进行组织。
一、ansible角色具有以下优点
1.角色可以把内容分组,容易重复使用
2.可以用角色定义系统的基本信息:web服务器、数据库服务器等
3.角色可以是大型项目更加方便容易管理
4.可以由多人并行开发
ansible角色会把不同功能的playbook分开,一个标准的角色含有以下子目录
defaults: 其中的main.yml包含角色变量的默认值 (在所有变量中优先级最低)
files: 包含角色任务引用的的静态文件
handlers: 主要定义处理程序
meta: 角色相关信息,如作者、许可证等
tasks: 定义任务
template: 任务引用的jinja2模板
test: 可以包含清单和test.yml的playbook,用于测试
vars: 定义角色变量
二、在角色中使用ansible的角色
1.如下所示
---
- hosts: servera.lab.example.com
roles:
- role1:
- role2: var2定义两个变量,任何defaults和vars中制定的变量都将被覆盖
var1: var1
var2: var2
2.控制执行程序
有时候需要在角色之前或之后执行一些任务
关键字:
之前执行任务:pre_tasks
之后执行任务: post_tasks
3.安装系统角色
[root@workstation ~]# yum install -y rhel-system-roles
4.安装角色的位置
[root@workstation ~]# ls -l /usr/share/ansible/roles
total 0
lrwxrwxrwx. 1 root root 23 Jan 14 2019 linux-system-roles.kdump -> rhel-system-roles.kdump
lrwxrwxrwx. 1 root root 25 Jan 14 2019 linux-system-roles.network -> rhel-system-roles.network
lrwxrwxrwx. 1 root root 25 Jan 14 2019 linux-system-roles.postfix -> rhel-system-roles.postfix
lrwxrwxrwx. 1 root root 25 Jan 14 2019 linux-system-roles.selinux -> rhel-system-roles.selinux
lrwxrwxrwx. 1 root root 26 Jan 14 2019 linux-system-roles.timesync -> rhel-system-roles.timesync
drwxr-xr-x. 9 root root 173 Apr 14 13:59 rhel-system-roles.kdump
drwxr-xr-x. 8 root root 196 Apr 14 13:59 rhel-system-roles.network
drwxr-xr-x. 6 root root 114 Apr 14 13:59 rhel-system-roles.postfix
drwxr-xr-x. 7 root root 139 Apr 14 13:59 rhel-system-roles.selinux
drwxr-xr-x. 10 root root 188 Apr 14 13:59 rhel-system-roles.timesync
查看其中网略角色
[root@workstation ~]# ls -l /usr/share/ansible/roles/rhel-system-roles.network/
total 116
drwxr-xr-x. 2 root root 22 Apr 14 13:59 defaults
drwxr-xr-x. 2 root root 36 Apr 14 13:59 library
-rw-r--r--. 1 root root 1510 Oct 16 2018 LICENSE
drwxr-xr-x. 2 root root 22 Apr 14 13:59 meta
drwxr-xr-x. 3 root root 25 Apr 14 13:59 module_utils
-rw-r--r--. 1 root root 16812 Oct 16 2018 pylintrc
-rw-r--r--. 1 root root 58144 Jan 14 2019 README.html
-rw-r--r--. 1 root root 22491 Oct 16 2018 README.md
drwxr-xr-x. 2 root root 22 Apr 14 13:59 tasks
drwxr-xr-x. 5 root root 4096 Apr 14 13:59 tests
-rw-r--r--. 1 root root 2886 Oct 16 2018 tox.ini
五.时间同步角色练习
查看系统当中那些角色可以使用
[root@workstation ~]# ansible-galaxy list
# /usr/share/ansible/roles
- linux-system-roles.kdump, (unknown version)
- linux-system-roles.network, (unknown version)
- linux-system-roles.postfix, (unknown version)
- linux-system-roles.selinux, (unknown version)
- linux-system-roles.timesync, (unknown version)
- rhel-system-roles.kdump, (unknown version)
- rhel-system-roles.network, (unknown version)
- rhel-system-roles.postfix, (unknown version)
- rhel-system-roles.selinux, (unknown version)
- rhel-system-roles.timesync, (unknown version)
# /etc/ansible/roles
[WARNING]: - the configured path /root/.ansible/roles does not exist.
6.查看帮助
[root@workstation roles]# cat /usr/share/doc/rhel-system-roles/timesync/README.md
...................
``yaml
- hosts: targets
vars:
timesync_ptp_domains:
- number: 0
interfaces: [ eth0 ]
roles:
- rhel-system-roles.timesync
- .....................
7.时区设置的例子
[root@workstation roles]# ansible-doc timezone | grep -A 4 "EXAMPLES"
EXAMPLES:
- name: Set timezone to Asia/Tokyo
timezone:
name: Asia/Tokyo
8.清单和配置文件
[root@workstation roles]# ls
ansible.cfg group_vars inventory
[root@workstation roles]# cat ansible.cfg 配置文件
[defaults]
inventory = ./inventory
[root@workstation roles]# vim inventory
[root@workstation roles]# cat inventory 清单
[group1]
servera.lab.example.com
[group2]
serverb.lab.example.com
[groups:children]
group1
group2
9.创建针对主机的变量目录和新建时间yml
创建:groups目录下的group1和group2
root@workstation group_vars]# ls
group1 group2
[root@workstation group_vars]# cat group1/timezone.yml
host_timezone: Asia/Shanghai 上海
[root@workstation group_vars]# cat group2/timezone.yml
host_timezone: Europe/London 伦敦
10.创建主playbook并运行
[root@workstation group_vars]# ansible-playbook configure_time.yml
---
- name: Time Sync 时间同步
hosts: groups 指定受管主机嵌套组
roles: 指定角色
- rhel-system-roles.timesync 时间角色
post_tasks: 角色之后运行的任务
- name: Set Timezone 设置时区
timezone: 时区
name: "{{ host_timezone }}" 指定时区变量
notify: restart crond 指定触发运行的任务程序crond
handlers: 触发运行的程序
- name: restart crond 重启服务
service: 指定服务
name: crond 服务名称
state: restarted 重新启动
知识点补充:crond服务
crond服务是一种守护进程,用来定期执行程序,安装完成系统之后,默认便会启动此任务调度命令。crond命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作,可以通过crontab 命令添加或者编辑需要定时执行的任务。
11.受管主机查看结果
[root@serverb ~]# timedatectl
Local time: Tue 2020-04-14 07:50:28 BST
Universal time: Tue 2020-04-14 06:50:28 UTC
RTC time: Tue 2020-04-14 14:50:27
Time zone: Europe/London (BST, +0100)
System clock synchronized: no
NTP service: active
RTC in local TZ: no
[root@servera ~]# timedatectl
Local time: Tue 2020-04-14 14:51:38 CST
Universal time: Tue 2020-04-14 06:51:38 UTC
RTC time: Tue 2020-04-14 14:51:37
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: no
NTP service: active
RTC in local TZ: no
三.手动创建角色
角色创建流程:
分三个步骤
1.创建角色目录结构
2.定义角色内容
3.在playbook中使用角色
[root@workstation roles]# ansible-galaxy init my_role 初始化
- my_role was created successfully
[root@workstation roles]# tree my_role/
my_role/ 具体角色项目名称,比如nginx/tomcat/php(资自由设置)
├── defaults 用于设置当前角色的默认变量,此目录包含一个main.yml
│ └── main.yml 此文件类似代码中的主函数,进行统一管理
├── files 用来存放copy模块或script模块调用的文件
├── handlers 定义此角色中触发条件是执行的动作,此目录也包含一个main.yml文件
│ └── main.yml
├── meta 用于定义此角色的特殊设定关系极其依赖关系,此目录也包含一盒main.yml文件
│ └── main.yml
├── README.md 说明文件
├── tasks 定义当前角色的任务列表,此目录包含一个main.yml文件
│ └── main.yml
├── templates 用来存放jinja2模板。template模块会自动在此目录中寻找jiaja2模板文件
├── tests 存放测试role本身功能的playbook和主机定义文件在开发测试阶段常用,此目录包含以下两个文件
│ ├── inventory
│ └── test.yml
└── vars 定义角色用到的变量,此目录包含一个main.yml文件
└── main.yml
8 directories, 8 files
练习
1.创建并初始化
[root@workstation ~]# mkdir roles_create 创建目录
[root@workstation ~]# cd roles_create/
[root@workstation roles_create]# mkdir roles
[root@workstation roles_create]# cd roles
[root@workstation roles]# ansible-galaxy init myvhost 初始化
- myvhost was created successfully
[root@workstation roles]# ls 目录自动生成
myvhost
[root@workstation roles]# cd myvhost/
[root@workstation myvhost]# ls 文件自动生成
defaults files handlers meta README.md tasks templates tests vars
2.配置tasks(任务)的play
任务:安装启动服务和配置虚拟主机
[root@workstation myvhost]# cd tasks/
[root@workstation tasks]# vim main.yml
---
# tasks file for myvhost
- name: Install httpd 安装Apache
yum:
name: httpd
state: latset
- name: start and enabled httpd 启动和开机启动
service: 服务
name: httpd
state: started
enabled: true
- name: Install vhost file
template:
src: vhost.conf.j2
dest: /etc/httpd/conf.d/vhost.conf
owner: root
group: root
mode: 0644
notify:
- restart httpd
3.编写notify触发的处理程序
[root@workstation myvhost]# cd handlers/
[root@workstation handlers]# vim main.yml
[root@workstation handlers]# cat main.yml
---
# handlers file for myvhost
- name: restart httpd
service:
name: httpd
state: restarted
4.编写html文件
[root@workstation myvhost]# mv files /root/roles_create/
[root@workstation myvhost]# ls
defaults handlers meta README.md tasks templates tests vars
[root@workstation roles_create]# ls
files
[root@workstation files]# mkdir html
[root@workstation files]# ls
html
[root@workstation files]# cd html/
[root@workstation html]# vim index.yml
www.westos.org
5.配置模板
[root@workstation myvhost]# cd templates/
[root@workstation templates]# vim vhost.conf.j2
[root@workstation templates]# cat vhost.conf.j2
*:80>
DocumentRoot /www
ServerName www.westos.org
</VirtualHost>
*:80>
DocumentRoot /bbs
ServerName bbs.westos.org
</VirtualHost>
6.编写roles的playbook
[root@workstation roles_create]# vim inventory 受管主机
[webservers]
servera.lab.example.com
serverb.lab.example.com
[root@workstation roles_create]# vim ansible.cfg 配置文件
[defaults]
inventory = ./inventory
[root@workstation roles_create]# vim user_vhost_role.yml roles的主playbook
---
- name: use myvhost 使用角色的playbook
hosts: webservers 指定主机组
pre_tasks: 角色之前执行的任务
- name: pre_tasks messages
debug:
msg: "Ensure web server configuration" 确保网站服务器设定正确
roles: 指定角色
- myvhost
post_tasks: 角色之后执行的任务
- name: Configure html 设置默发布页面
copy: 文件上传模块
src: files/html/ 上传文件路径
dest: /var/www/vhost/{{ ansible_hostname }} 上传到指定存放位置
- name: post_tasks messages
debug:
msg: "web server is configured" 网络服务器已配置
[root@workstation roles_create]# ansible-playbook user_vhost_role.yml 运行play
1.[root@servera ~]# ls /etc/httpd/conf.d/ 受管主机上已经存在vhost.conf文件
autoindex.conf example.conf README ssl.conf userdir.conf vhost.conf welcome.conf
2.[root@serverb www]# cd vhost/
[root@serverb vhost]# ls
serverb
[root@serverb vhost]# cd serverb/
[root@serverb serverb]# ls
index.hml
[root@serverb serverb]# cat index.hml
www.westos.org