美文网首页
第5章 role和Ansible Galaxy

第5章 role和Ansible Galaxy

作者: super_pcm | 来源:发表于2021-06-14 22:06 被阅读0次

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 ,具体的介绍略过。

相关文章

网友评论

      本文标题:第5章 role和Ansible Galaxy

      本文链接:https://www.haomeiwen.com/subject/tnxaeltx.html