《Ansible Playbook扩展:roles角色依赖和角色共享》

一、角色依赖

角色依赖关系允许您在使用角色时自动拉入其他角色。

角色依赖是先决条件,而不是真正的依赖。角色没有父/子关系。Ansible加载所有列出的角色,首先运行依赖项下列出的角色,然后运行列出它们的角色。play对象是所有角色的父对象,包括由依赖项列表调用的角色。

角色依赖项存储在meta/main.yml中,此文件应包含要在指定角色之前插入的角色和参数列表。 这个文件期望有一个顶级的数据hash, 使用dependencies键。

# roles/myapp/meta/main.yml
---
dependencies:
  - role: common
    vars:
      some_parameter: 3
  - role: apache
    vars:
      apache_port: 80
  - role: postgres
    vars:
      dbname: blarg
      other_parameter: 12

上述例子中,ansible会首先处理common角色(以及它可能表达的任何依赖),然后继续apache角色,再继续执行postgres角色,最后开始角色自己的任务。

一般情况下,依赖角色任务仅执行一次,且在第一个定义的角色中执行,那么,如何使两个不同的角色执行相同的依赖角色呢?

# 将依赖角色的meta/main.yml文件设置如下参数
allow_duplicates: true

如上例所示,我们将allow_duplicates属性设置为true,表示可以重复调用同一个角色。


1.1、在一个角色中多次依赖一个角色

Ansible只在一个play中执行每个角色一次,即使你多次定义它,除非角色上定义的参数对于每个定义是不同的。例如,Ansible在一个游戏中只运行一次角色foo,就像这样:

---
- hosts: webservers
  roles:
    - foo
    - bar
    - foo

有两个方法可以强制Ansible多次运行一个角色。

方法一、传递不同的参数

如果在每个角色定义中传递不同的参数,ansible会运行运行该角色不止一次。提供不同的变量值与传递不同的角色参数是不同的。对于这种行为,必须使用roles关键字,因为import_role和include_role不接受角色参数。

---
- hosts: webservers
  roles:
    - { role: foo, message: "first" }
    - { role: foo, message: "second" }

或者

---
- hosts: webservers
  roles:
    - role: foo
      message: "first"
    - role: foo
      message: "second"

方法二、使用allow_duplicates: true

在依赖的角色中meta/main.yml文件添加allow_duplicates: true即可。

# playbook.yml
---
- hosts: webservers
  roles:
    - foo
    - foo

# roles/foo/meta/main.yml
---
allow_duplicates: true

1.2、在多个不同角色中依赖一个角色

角色containerd依赖角色,如下所示:

# vim containerd/meta/main.ym
---
dependencies:
  - role: container-engine/containerd-common
  - role: container-engine/runc
  - role: container-engine/crictl
  - role: container-engine/nerdctl

角色docker依赖角色,如下所示:

# vim docker/meta/main.ym
---
dependencies:
  - role: container-engine/containerd-common
  - role: container-engine/docker-storage
    when: docker_container_storage_setup and ansible_os_family == "RedHat"

角色containerd和角色docker都依赖containerd-common角色,所以需要将containerd-common角色中的meta/main.yml文件设置如下内容:

# vim containerd-common/meta/main.yml
---
allow_duplicates: true

标签可以应用到依赖角色中发现的所有任务上,和前面包含任务文件中传入标签类似,标签可以是列表,也可以是单个项目。在条件中不能防止依赖角色的处理,但是给依赖应用条件可以跳过依赖角色层级中的所有任务,这是任务包含中使用条件的镜像功能。

---
dependencies:
  - role: container-engine/cri-o
    when:
      - container_manager == 'crio'
    tags:
      - container-engine
      - crio

  - role: container-engine/containerd
    when:
      - container_manager == 'containerd'
    tags:
      - container-engine
      - containerd

二、角色依赖

Ansible的Galaxy工具,类似程序员使用的 GitHub。运维人员可以将自己编写的Role通过Galaxy这个平台进行分享。同样,我们也可以通过Galaxy这个平台去获取一些我们想要的 Role。

2.1、获取帮助信息

《Ansible Playbook扩展:roles角色依赖和角色共享》_第1张图片


2.2、常用操作指令

# 安装角色
ansible-galaxy install -p installpath username.rolename

# 列出安装角色
ansible-galaxy list -p installpath

# 查看安装角色信息
ansible-galaxy info -p installpath username.rolename

# 删除角色
ansible-galaxy remove -p installpath username.rolename

# 创建角色
ansible-galaxy init role-name

总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:《Linux运维篇:Linux系统运维指南》

你可能感兴趣的:(《Linux运维实战总结》,ansible,python,pandas)