ansible playbook之roles

playbook之roles

https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html

https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_includes.html

https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse.html#playbooks-reuse

ansible-galaxy

Role是一个完整的任务体系,拥有Role之后就可以去使用它,或者也可以分发给别人使用。

roles仓库:https://galaxy.ansible.com/

就像github和dockerhub一样的仓库

在一些逻辑上,可以参考别人的思路

#搜索
[root@ansible ~]# ansible-galaxy search 'nginx'

#info查看信息
[root@ansible ~]# ansible-galaxy info aacnp.nginx

#下载到指定目录
[root@ansible ~]# ansible-galaxy install aacnp.nginx -p /tmp

#列出roles
[root@ansible ~]# ansible-galaxy list -p ~/ansible/roles/

import和include

https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse.html#re-using-files-and-roles

根据官方文档的说法,一个是动态加载,一个是静态加载

import_task(静态加载):当playbook开始执行时就预先加载好变量

include_task(动态加载):当playbook运行时遇到变量在加载

一些区别比较:Imports: static re-use

roles

oles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles 。

role的默认路径在配置文件ansible.cfg中修改

#roles_path = /etc/ansible/roles

roles目录结构

roles是管理ansible文件的一种规范(目录结构)

roles会按照标准的规范,自动到特定的目录和文件中读取数据

目录结构,所以roles目录中的各个文件之间的调用,不需要写路径

roles目录结构

defualts/main.yml:定义变量的缺省值,优先级较低

files目录:存储静态文件的目录

handlers/main.yml:定义handlers

meta/main.yml:写作者、版本等描述信息

README.md:整个角色(role)的描述信息

tasks/main.yml:定义任务的地方

templates目录:存放动态数据文件的地方(模板文件)

vars/main.yml:定义变量,优先级高

创建Role

语法:见官方文档

使用ansible-galaxy来创建roles

[root@ansible ~]# mkdir -p ~/ansible/roles
[root@ansible ~]# ansible-galaxy init ~/ansible/roles/first_role
- Role /root/ansible/roles/first_role was created successfully
[root@ansible ~]#
[root@ansible ~]# tree ~/ansible/roles/first_role/
/root/ansible/roles/first_role/
├── 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变量

在之前的目录结构中,有两个地方可以定义变量

  • defatlts/main.yml:定义变量的缺省值,优先级较低
  • vars/main.yml:定义变量,优先级高

这两个文件之间的区别在于,defaults/main.yml中定义的变量优先级低于vars/main.yml中定义的变量。

defaults/main.yml中的变量优先级是最低的,其他地方的变量优先级仍比它高

示例:

PORT: 80
USERNAME: apache

定义role的tasks

Role的任务定义在roles/xxx/tasks/main.yml文件中,main.yml是该Role任务的入口,在执行Role的时候会自动执行main.yml中的任务。

一是直接定义在tasks/main.yml中(流程多的时候不建议使用)

二是定义在tasks目录下的其他文件中,然后include_tasks或import_tasks引入它

示例:

#task目录下创建install.yml
[root@ansible tasks]# cat install.yml
---
- name: install http
  yum: name=httpd state=installed

#main文件中引用
[root@ansible tasks]# cat main.yml
---
- import_tasks: install.yml

role的入口文件

role下面的各种目录定义好之后,还需要在role目录相同目录层次的地方提供一个被playbook执行的入口文件。在这个入口文件中引入一个或多个roles目录下的Role。

这个文件名字叫什么都行,例如site.yml、main.yml、enter.yml等,但一定要和role目录在同一目录层次

所以role有点像saltstack中top.sls的味道

例子:

#first_role是role目录
roles/
├── enter.yml
└── first_role

#或者放入上一层
├── enter.yml
└── roles
    └── first_role


[root@ansible ansible]# cat enter.yml
---
- name: test
  hosts: apache
  gather_facts: false
  roles:
    - first_role

#运行
[root@ansible ansible]# ansible-playbook enter.yml

PLAY [test] ********************************************************************************************************************************************************

TASK [first_role : install http] ***********************************************************************************************************************************
changed: [apache]

PLAY RECAP *********************************************************************************************************************************************************
apache                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

定义role的handler

handler和task类似,它定义在roles/.../handlers/main.yml中,当Role的task触发了对应的handler,会自动来此文件中寻找。

仍然要说的是,可以将handler定义在其它文件中,然后在roles/.../handlers/main.yml使用include_tasks或import_tasks指令来引入.

posted @ 2021-11-20 14:18  EverEternity  阅读(357)  评论(0编辑  收藏  举报