标准角色结构
[root@wzy roles]#tree example/
example/
├── 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
角色目录
目录 | 说明 |
defaults | 此目录中main.yml文件包含角色变量默认值,使用角色时可以覆盖。优先级较低,在playbook中应更改和自定义 |
files | 此目录包含角色任务引用的静态文件 |
handlers | 此目录中的main.yml文件包含角色的处理程序定义 |
meta | 此目录中的main.yml文件包含与角色相关的信息,如作者、平台等 |
tasks | 此目录中的main.yml文件包含角色的任务定义 |
templates | 此目录包含由角色任务引用的Jinja2模板 |
tests | 此目录可包含清单和test.yml。测试角色 |
vars | 此目录中的main.yml文件定义角色的变量值。这些变量通常用于角色内部。优先级较高,在playbook中使用不应更改 |
示例
#在playbook中调用roleone角色和roletwo角色
---
- name:
hosts: all
roles:
- roleone
- roletwo
# 如果设置roletwo的两个角色变量var1和var2的值,则使用roletwo时,任何defaults和vars变量都会被覆盖
---
- name:
hosts: all
roles:
- roleone
- roletwo
var1: one
var2: two
pre_task和post_task
pre_task:列在此部分的所有任务将在执行任何角色前执行,如果这些任务中有任何一个通知了处理程序,则处理程序也在角色和普通任务执行前执行
post_task:列在此部分的所有任务将在play的普通任务和普通任务通知的任何处理程序运行之后运行。
示例
[root@wzy ansible]#vim prepost.yml
---
- name:
hosts: AA
pre_tasks:
- name:
shell:
cmd: echo This is pre_tasks
register: result1
notify: my handler
- name:
debug:
msg: "{{ result1.stdout }}"
roles:
- roleone
#同一个tasks里面调用多次handlers,仅会触发一次handlers。一个tasks对应一个handlers且仅会调用自己的handlers
tasks:
- name:
shell:
cmd: echo This is tasks1
register: result2
notify: my handler
- name:
debug:
msg: "{{ result2.stdout }}"
- name:
shell:
cmd: echo This is tasks2
register: result3
notify: my handler
- name:
debug:
msg: "{{ result3.stdout }}"
post_tasks:
- name:
shell:
cmd: echo This is post_tasks
register: result4
notify: my handler
- name:
debug:
msg: "{{ result4.stdout }}"
notify: my handler
#位置一
handlers:
- name: my handler
debug:
msg: echo This is my handler
#因为不是同一个tasks,此tasks无法调用上方的handlers,所以下方执行结果会报错not found
- name:
hosts: BB
tasks:
- name:
shell:
cmd: echo This is tasks3
register: result5
notify: my handler
- name:
debug:
msg: "{{ result5.stdout }}"
#位置二。如果把位置一的handlers注释掉,此处启用。则上个tasks在pre_tasks处就会报错not found
# handlers:
# - name: my handler
# debug:
# msg: echo This is my handler
[root@wzy ansible]#ansible-playbook prepost.yml
PLAY [AA] ************************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************
ok: [192.168.29.142]
TASK [shell] *********************************************************************************************************************************************************
changed: [192.168.29.142]
TASK [debug] *********************************************************************************************************************************************************
ok: [192.168.29.142] => {
"msg": "This is pre_tasks"
}
RUNNING HANDLER [my handler] *****************************************************************************************************************************************
ok: [192.168.29.142] => {
"msg": "echo This is my handler"
}
TASK [roleone : debug] ***********************************************************************************************************************************************
ok: [192.168.29.142] => {
"msg": "This is roleone content"
}
TASK [shell] *********************************************************************************************************************************************************
changed: [192.168.29.142]
TASK [debug] *********************************************************************************************************************************************************
ok: [192.168.29.142] => {
"msg": "This is tasks1"
}
TASK [shell] *********************************************************************************************************************************************************
changed: [192.168.29.142]
TASK [debug] *********************************************************************************************************************************************************
ok: [192.168.29.142] => {
"msg": "This is tasks2"
}
RUNNING HANDLER [my handler] *****************************************************************************************************************************************
ok: [192.168.29.142] => {
"msg": "echo This is my handler"
}
TASK [shell] *********************************************************************************************************************************************************
changed: [192.168.29.142]
TASK [debug] *********************************************************************************************************************************************************
ok: [192.168.29.142] => {
"msg": "This is post_tasks"
}
RUNNING HANDLER [my handler] *****************************************************************************************************************************************
ok: [192.168.29.142] => {
"msg": "echo This is my handler"
}
PLAY [BB] ************************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************
ok: [192.168.29.143]
TASK [shell] *********************************************************************************************************************************************************
ERROR! The requested handler 'my handler' was not found in either the main handlers list nor in the listening handlers list
在普通任务中调用角色
include_role:可以动态包含角色(ansible2.3新增)
import_role:可静态导入角色(ansible2.4新增)
示例
[root@wzy ansible]#vim prepost.yml
---
- name:
hosts: AA
tasks:
- name:
debug:
msg: "This is tasks 1"
- name:
include_role: roleone
系统角色
安装系统角色
yum -y install rhel-system-roles.noarch
安装后系统角色位于/usr/share/ansible/roles目录
每个角色的文档目录均包含一个README.md文件。即帮助文档
RHEL系统角色
名称 | 状态 | 角色描述 |
rhel-system-roles.kdump | 全面支持 | 配置kdump崩溃恢复服务 |
rhel-system-roles.network | 全面支持 | 配置网络接口 |
rhel-system-roles.selinux | 全面支持 | 配置和管理SElinux自定义,包括SElinux模式、文件和端口上下文、布尔值设置,SElinux用户 |
rhel-system-roles.timesync | 全面支持 | 使用网络时间协议或精确时间协议配置时间同步 |
rhel-system-roles.postfix | 技术预览 | 使用postfix服务将每个主机配置为邮件传输代理 |
rhel-system-roles.firewall | 开发中 | 配置主机防火墙 |
rhel-system-roles.tuned | 开发中 | 配置tuned服务,系统调优 |
使用系统角色
使用时间同步角色
安装 RHEL 系统角色软件包,并创建符合以下条件的 playbook timesync.yml :
在所有受管节点上运行
使用 timesync 角色
配置该角色,以使用当前有效的 NTP 提供商
配置该角色,以使用时间服务器 classroom.example.com
配置该角色,以启用 iburst 参数
#安装角色
sudo yum -y install rhel-system-roles.noarch
#复制安装的角色到 ~/ansible/roles/
cp -r /usr/share/ansible/roles/rhel-system-roles.timesync/ /home/student/ansible/roles/timesync
#编写playbook,可参考README.md
vim timesync.yml
---
- name: set time sync
hosts: all
vars:
timesync_ntp_servers:
- hostname: ntp.aliyun.com
iburst: yes
roles:
- timesync
#执行剧本
ansible-playbook timesync.yml
自定义角色
创建和使用角色三个步骤:
一、创建角色目录结构。
[root@wzy ansible]#cd roles/
[root@wzy roles]#ansible-galaxy init examrole
- Role examrole was created successfully
[root@wzy roles]#tree examrole/
examrole/
├── 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
二、定义角色内容
[root@wzy roles]#vim examrole/tasks/main.yml
---
# tasks file for examrole
- name:
debug:
msg: "This is examrole"
三、在playbook中使用角色
[root@wzy role]#cd /root/ansible/
[root@wzy ansible]#vim examrole.yml
---
- name:
hosts: AA
roles:
- examrole
[root@wzy ansible]#ansible-playbook examrole.yml
PLAY [AA] *******************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************
ok: [192.168.29.142]
TASK [examrole : debug] *****************************************************************************************************************************************************************
ok: [192.168.29.142] => {
"msg": "This is examrole"
}
PLAY RECAP ******************************************************************************************************************************************************************************
192.168.29.142 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
通过变量更改角色行为
如果通过以下方式定义了相同的变量,则角色的defaults目录中定义的变量的值将被覆盖。
一、在清单文件中定义,作为主机变量或组变量
二、在playbook项目的group_vars或host_vars目录下的yml文件中定义
三、作为变量嵌套在play的vars关键字中定义
四、在play的roles关键字中包含该角色时作为变量定义
使用ansible-galaxy部署角色
ansible-galaxy公共资源库:https://galaxy.ansible.com
从命令行搜索角色
ansible-galaxy search 'timesync'
从命令行查看角色信息
ansible-galaxy info 'linux-system-roles.timesync'
安装角色
ansible-galaxy install rolename -p 安装位置
根据文件安装角色
可在roles/requirements.yml文件中指定所需角色。
ansible-galaxy install -r rolename -p 安装位置
示例
#要求文件
vim roles/requirements.yml
---
- name: balancer
src: http://content.example.com/haproxy.tar.gz
- name: phpinfo
src: http://content.example.com/phpinfo.tar.gz
#执行playbook
ansible-galaxy install -r /home/student/ansible/roles/requirements.yml -p /home/student/ansible/roles/
列出本地找到的角色
ansible-galaxy list
删除本地角色
ansible-galaxy remove nginx-acme-ssh