第5章 role和Ansible Galaxy

5.1 role 和 Ansible Galaxy 的简要介绍

5.1.1 role

role 是高级版本的include语句,include用来分享单个Playbook文件,而role可以分享一个文件夹,文件夹里面包含task、handlers、file、template和variable。
文件夹里面包含了实现一个完整的功能所有文件,例如,安装和配置web服务器Nginx。

5.1.2 Ansible Galaxy

Ansible Galaxy 是Ansible提供的分享role的网站。

5.2 role的放置位置

5.2.1 当前目录的roles文件夹下

无论Ansible对roles path 是如何设置的,放在当前子目录roles文件夹下的role都会被找到。

5.2.2 环境变量 ANSIBLE_ROLES_PATH 定义的文件夹

如果定义了 ANSIBLE_ROLES_PATH ,那么Ansible也会搜索该文件夹下放置的role。

5.2.3 Ansible 配置文件中roles_path定义的文件夹

定义配置变量 roles_path 的格式如下,如果有多个目录,则使用冒号(:)分割。

roles_path = /etc/ansible/roles:/opt/roles

如果定义了环境变量 ANSIBLE_ROLES_PATH ,那么配置文件中定义的roles路径是不会起效的。

5.2.4 默认文件夹 /etc/ansible/roles

这个优先级最低的。

5.3 在Playbook 中如何调用role

5.3.1 调用最简单的role

假设我们当前目录下有roles目录,里面有个叫做 simple 的role,那么在roles的同级目录下。我们可以创建一个playbook文件来调用这个role,假设该文件叫做 site.yml,内容如下

---
- hosts: localhost
  roles:
    - simple

5.3.2 通过pre_tasks 和 post_tasks 调整role和任务的顺序

如果想让一些任务在role之前和和之后执行,可以通过Ansible 提供了两个关键字 pre_tasks 和 post_tasks 来实现。如下:

- hosts: localhost
  pre_tasks:
  - name: pre task
    debug: msg="hello in pre task"

  roles:
    - simple

  post_tasks:
  - name: post task
    debug: msg="hello in post task"

5.3.3 调用带有参数的role

调用带有参数的role有两种方法:一是把role写成 JSON Object 的格式,直接传入参数;二是通过vars关键字使用YAML字典格式传入关键字。

---
- hosts: localhost
  roles:
    - { role: my_role_with_vars, ex_param: "Hello from ex_param for the 1st time" }
    - role: my_role_with_vars
      vars:
        ex_param: "Hello from ex_param for the 2nd time"

5.3.4 与when一起使用role

role当然也可以和when一起使用,即当满足一定条件时再执行role。与role的传参语法类似,调用方式有两种。

---
- hosts: localhost
  roles:
    - { role: simple, when: "ansible_os_family == 'Dibian'" }
    - role: simple
      when: "ansible_os_family == 'Dibian'"

5.4 如何写role

5.4.1 role 的完整定义

在 "3.3.6 重用 Playbook" 章节上已经有详细的介绍了,主要是一个role都包含了什么子目录。

5.4.2 默认变量和普通变量的区别

defalults/main.yml 中的变量时默认变量,优先级是变量中最低的,用于放置一些需要被覆盖的变量。

vars/main.yml 中的变量是role变量,优先级比较高,放置一些不想被覆盖的变量。所以变量在命名的时候一般都加入role的名字用作前缀,放置不小心被Playbook中定义的变量覆盖。

5.4.3 tasks/main.yml 如何使用变量、静态文件和模版

任务是Playbook及role的核心逻辑。所以,要想知道role 做了什么,首先要看role的任务文件 tasks/main.yml,该文件也可以看作一个role的入口文件。学会如何在该文件中使用变量、静态文件和模版等资源是需要写role的关键。

role中的资源可以分为两类:一类是放在 x/*/main.yml 中会自动被加载的资料;还有一类是放在文件 x/*/other_but_main.yml 中,需要显式调用的资源。

  1. 使用 x/*/main.yml 中的变量和handler
  • 变量和handler: 就像使用同一个Playbook中的资源一样
  • x/{files,templates}/下的文件: 就像在同一目录下一样。
  1. 使用 x/*/other_but_main.yml 中的资源
    如果 role x 下面的内容比较复杂,需要对任务或者vars进一步分类,可以使用除main.yml 以外的文件。Ansible 提供了两个关键字:include 和 include_vars,来分别引入role中非main.yml 其他文件包含的任务和变量。

示例如下,有个对服务器进行初始化的role的目录结构如下:

.
|-- tasks
|   |-- configure.yml
|   |-- install.yml
|   `-- main.yml
|-- templates
|   `-- ntp.conf.j2
`-- vars
    |-- Debian.yml
    |-- main.yml
    `-- RedHat.yml

那么在 x/*/main.yml 中,怎么来加载这些任务或者变量呢?

---
- name: 加载变量文件
  include_vars: RedHat.yml

# 加载运行其他的任务
- include: install.yml
- include: configure.yml

5.5 role 的依赖

安装一个Nginx需要配置yum/apt仓库,如果不想再配置Nginx的Playbook重新实现该功能,那么可以通过 role 的依赖来解决。 role 依赖关系的定义文件是 x/meta/main.yml。如果在 role x 定义依赖 role y,那么在Playbook中调用 role x 之前会先调用 role y。当多个role依赖同一个role时,Ansible会自动进行过滤,避免重复调用相同参数的role。

下面的示例中,role db 和 Web 都依赖 role common。如果在Playbook中调用 db和Web,那么Ansible会保证在运行 role db 和Web前,先运行 role common,并且只运行一次。

文件目录如下:

`-- roles
    |-- common
    |   `-- tasks
    |       `-- main.yml
    |-- db
    |   |-- meta
    |   |   `-- main.yml
    |   `-- tasks
    |       `-- main.yml
    `-- Web
        |-- meta
        |   `-- main.yml
        `-- tasks
            `-- main.yml

那么在 {db,Web}/meta/main.yml 中的内容应该是:

---
dependencies:
- { role: common }

最后在调用的Playbook中,我们不需要调用的 common role。

---
roles:
  - db
  - web

5.6 Ansible Galaxy 网站介绍

地址为: https://galaxy.ansible.com ,具体的介绍略过。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容