ansible的Roles
什么是Roles
roles类似于开发框架
,能极大的提高代码复用
。
role的目录结构
# 查看role的目录结构
[student@workstation]$ tree role_A
role_A
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 8 files
role目录结构详解
创建Roles
使用ansible-galaxy
创建roles
创建一个名称为test的role
# 创建名称为test的role
[student@workstation roles]$ ansible-galaxy init test
- test was created successfully
# 查看test的role结构
[student@workstation roles]$ tree test
test
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 8 files
修改Role
在Playbook中调用Role
要在ansible.cfg中配置roles_path
# roles_path配置
roles_path=./roles:/usr/share/ansible/roles:/etc/ansible/roles
向role中传递变量
- hosts: remotenode
roles:
- role: role1
- role: role2
var1: var1 #role2的var1变量
var2: var2 #role2的var2变量
控制tasks执行顺序
pre_tasks > role_task > play_task > post_task
- 对于playbook中的每个play,task执行是按照task顺序的,在task执行完毕之后,handlers将会被执行。
- 当role被添加进play的时候,role的task是被添加到所有的playbook的task之前的,如果第二个role添加了,它的task被添加在第一个role之后。
- role的handlers一样是在role的play之下。每个play定义了一个handlers列表,role的handlers被添加到handlers列表的最前端,之后的handlers是在play下定义的handlers。
- 在某些场景下,在roles之前执行某些play的task是必须的,为了支持这种场景,你可以使用
pre_tasks
,在pre_tasks
定义的task可以在role之前被执行。如果在pre_tasks
中定义的task通知了handler,那么这些hander也会比在role中的handlers提前运行。 - play也支持post_tasks,post_tasks在正常定义的play中的tasks之后执行。
rhel-system-roles介绍
系统roles
就是红帽官方
写的roles
- rhel-system-roles.kdump(稳定)
- rhel-system-roles.network(稳定)
- rhel-system-roles.selinux(稳定)
- rhel-system-roles.timesync(稳定)
- rhel-system-roles.postfix(测试版)
- rhel-system-roles.firewall(开发阶段)
- rhel-system-roles.tuned(开发阶段)
安装rhel-system-roles
# 安装rhel-system-roles
yum install rhel-system-roles -y
查看rhel-system-roles目录结构
# 查看rhel-system-roles目录结构
[student@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 Nov 5 00:15 rhel-system-roles.kdump
drwxr-xr-x. 8 root root 196 Nov 5 00:15 rhel-system-roles.network
drwxr-xr-x. 6 root root 114 Nov 5 00:15 rhel-system-roles.postfix
drwxr-xr-x. 7 root root 139 Nov 5 00:15 rhel-system-roles.selinux
drwxr-xr-x. 10 root root 188 Nov 5 00:15 rhel-system-roles.timesync
查看项目结构
# 查看项目结构
[student@workstation rhel-system-roles.kdump]$ tree
.
├── COPYING
├── defaults
│ └── main.yml
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.html
├── README.md
├── semaphore
├── tasks
│ ├── main.yml
│ └── ssh.yml
├── templates
│ ├── kdump.conf.j2
│ └── kdump.j2
├── tests
│ ├── roles
│ │ └── kdump -> ../..
│ ├── tests_default.yml
│ └── tests_ssh.yml
└── vars
└── main.yml
ansible-galaxy命令行用法
ansible-galaxy搜索role
# 搜索config_mysql的role
ansible-galaxy search config_mysql
ansible-galaxy安装role
# ansible-galaxy安装role
ansible-galaxy install alikins.mysql
使用requirements.yml文件安装role
创建requirements.yml
文件
# 从 Ansible Galaxy 安装role
- src: dfarrell07.opendaylight
# 从 GitHub 安装role
- name: opendaylight
src: https://github.com/dfarrell07/ansible-opendaylight
# 从特定 git 分支安装role
- name: opendaylight
src: https://github.com/dfarrell07/ansible-opendaylight
version: origin/master
# 在 GitHub 的特定标签处安装role
- name: opendaylight
src: https://github.com/dfarrell07/ansible-opendaylight
version: 1.0.0
# 在 GitHub 的特定提交处安装role
- name: opendaylight
src: https://github.com/dfarrell07/ansible-opendaylight
version: <commit hash>
使用ansible-galaxy install -r
安装role
# 使用ansible-galaxy安装role
ansible-galaxy install -r requirements.yml
ansible-galaxy安装role集合
# 安装role集合 -p 是安装到哪个目录
ansible-galaxy collection install nginxinc.nginx_core -p .
ansible-galaxy查看role详情
# ansible-galaxy查看role详情
[jp root ~]# ansible-galaxy info alikins.mysql
Role: alikins.mysql
description: MySQL server for RHEL/CentOS and
下载roles
ansible-galaxy管理下载的role
# 查看下载的role
## 要在ansible.cfg指定role_path的路径
[jp root ~]# ansible-galaxy list
- alikins.mysql, 0.99.2
# 删除下载的role
[jp root ~]# ansible-galaxy remove alikins.mysql
- successfully removed alikins.mysql
## 再查看role列表,已经没有alikins.mysql了
[jp root ~]# ansible-galaxy list
# /root/.ansible/roles
# /usr/share/ansible/roles
# /etc/ansible/roles
项目示例
练习题:第五题
解题方法:
练习题:第七题
解题方法:
---
- name: 调用负载均衡role
hosts: balancers
roles:
- balancer
# 注意还要调用一次apache这个role才会执行成功
- name: 调用phpinfo role
hosts: webservers
roles:
- phpinfo
- apache