Ansible 小手册系列 十(包含和角色)

一、包含 (include)

使用include模块来包含foo文件

tasks:
  - include: foo.yml

--- foo.yml
- name: test foo
  command: echo foo

  

include 还允许传递变量

- include: wordpress.yml wp_user=timmy
- include: wordpress.yml
  vars:
      wp_user: timmy
      ssh_keys:
        - keys/one.txt
        - keys/two.txt

  

动态包含

循环引用3次

- include: foo.yml param={{item}}
  with_items:
  - 1
  - 2
  - 3

  

还可以使用动态变量引入task文件

- include: "{{inventory_hostname}}.yml"

  

动态包含的一些限制

? 您不能使用notify触发来自动态包含的处理程序名称。

? 您不能使用--start-at-task在动态包含内的任务开始执行。

? 仅存在于动态包含内的标记不会显示在-list-tags输出中。

? 只存在于动态包含内的任务将不会显示在-list-tasks输出中。

为了解决上面限制,2.1版本后引入了static

- include: foo.yml
  static: <yes|no|true|false>

  

默认情况下,在Ansible 2.1及更高版本中,include包含符合以下条件时会自动被视为静态而不是动态:

  • include不使用任何循环
  • 包含的文件名不使用任何变量
  • 静态选项没有显式禁用(即static:no)
  • 强制静态包含(见下文)的ansible.cfg选项被禁用

ansible.cfg配置中有两个选项可用于静态包括:

  • task_includes_static - 将所有在tasks部分中包含的内容都设置为静态。
  • handler_includes_static - 强制所有包括在处理程序部分是静态的。

这些选项允许用户强制playbook的行为与他们在1.9.x和之前一样。

变量包含

include_vars 在task中动态加载yaml或json文件类型中的变量

- include_vars: myvars.yml

  根据操作系统类型加载变量文件,如果找不到,则为默认值。

- include_vars: "{{ item }}"
  with_first_found:
   - "{{ ansible_distribution }}.yml"
   - "{{ ansible_os_family }}.yml"
   - "default.yml"

  

角色 ROLE

角色是基于已知文件结构自动加载某些vars_files,任务和处理程序的方法。 按角色分组内容还允许轻松与其他用户共享角色。

文件结构如下

结构说明

  • site.yml 主要的playbook
  • webservers.yml webservers 得playbook
  • hosts.ini 主机清单
  • ibrary 如果有任何自定义模块,将其放在这里(可选)
  • filter_plugins 如果有任何自定义过滤器插件,将其放在这里(可选)
  • 如果group_var/all存在,其中列出的变量将被添加到所有的主机组中
  • 如果group_var/groupname1存在,其中列出的变量将被添加到groupname1主机组中-
  • 如果host_vars/hostname1存在,其中列出的变量将被添加到hostname1主机组中

这个 playbook 为一个角色 ‘x’ 指定了如下的行为

  • 如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 将被添加到 play 中
  • 如果 roles/x/handlers/main.yml 存在, 其中列出的 handlers 将被添加到 play 中
  • 如果 roles/x/vars/main.yml 存在, 其中列出的 variables 将被添加到 play 中
  • 如果 roles/ x/defaults /main.yml存在,其中列出的变量将被添加到play 中
  • 如果 roles/x/meta/main.yml 存在, 其中列出的 “角色依赖” 将被添加到 roles 列表中
  • 所有 copy tasks 可以引用 roles/x/files/ 中的文件,不需要指明文件的路径。
  • 所有 script tasks 可以引用 roles/x/files/ 中的脚本,不需要指明文件的路径。
  • 所有 template tasks 可以引用 roles/x/templates/ 中的文件,不需要指明文件的路径。
  • 所有 include tasks 可以引用 roles/x/tasks/ 中的文件,不需要指明文件的路径。

如果 roles 目录下有文件不存在,这些文件将被忽略。

这些目录的加载顺序

  1. meta/main.yml
  2. tasks/main.yml
  3. handlers/main.yml
  4. vars/main.yml
  5. defaults/main.yml

如果区分环境使用角色,可以使用下列文档结构

Paste_Image.png

  • production/inventory 主机清单

** 运行playbook**

ansible-playbook -i production site.yml

角色定义

在playbook中定义角色

---
- hosts: webservers
  roles:
     - x

定义角色参数

---
- hosts: webservers
  roles:
    - { role: x, dir: ‘/opt/a‘,  app_port: 5000 }

使用条件判断,当主机是Redhat时,才执行角色任务

---
- hosts: webservers
  roles:
    - { role: some_role, when: "ansible_os_family == ‘RedHat‘" }

定义角色标签

---
- hosts: webservers
  roles:
    - { role: x, tags: ["bar", "baz"] }

定义执行角色任务前后执行的动作

--- 

- hosts: webservers
  pre_tasks:
    - shell: echo ‘hello‘
  roles:
    - { role: some_role }
  tasks:
    - shell: echo ‘still busy‘
  post_tasks:
    - shell: echo ‘goodbye‘

pre_tasks里的task在roles执行前执行的任务

post_tasks里的task在roles执行完成后执行的任务

角色默认变量

定义角色默认变量,只需在角色目录中添加一个defaults/main.yml文件。角色默认变量优先级最低。

角色依赖



角色依赖性允许您在使用角色时自动提取其他角色。 角色依赖关系存储在角色目录中包含的meta/main.yml文件中。 此文件应包含要在指定角色之前插入的角色和参数的列表,例如角色/myapp/meta/main.yml中的以下内容:

角色依赖性允许您在使用角色时自动提取其他角色。 角色依赖关系存储在角色目录中包含的meta/main.yml文件中。 此文件应包含要在指定角色之前插入的角色和参数的列表,例如角色/myapp/meta/main.yml中的以下内容:

---
dependencies:
  - { role: common, some_parameter: 3 }
  - { role: apache, apache_port: 80 }
  - { role: postgres, dbname: blarg, other_parameter: 12 }
  - { role: ‘/path/to/common/roles/foo‘, x: 1 }

这里表示myapp这个role依赖于meta里面的role,也就是说如果执行myapp的role之前先执行myapp中meta的role

** 角色依赖执行顺序**

角色依赖性始终在包含角色的角色之前执行,并且是递归的。

如上面内容,按照common,apache,postgres,‘/path/to/common/roles/foo顺序依次执行,再执行此角色

** 角色依赖嵌套**

默认情况下,在添加依赖其他角色的时候,如果其他角色内也有依赖关系,是不执行其他角色内的依赖关系的。

可以通过allow_duplicates: yes设置来实现执行其他角色内的依赖关系。

实际测试,2.12.2版本的ansible,无论加不加这个设置,就只会执行第一次依赖角色,后续的则不执行。

简单role举例

https://www.jianshu.com/p/8b17779febf3

role官网:

https://galaxy.ansible.com/list#/roles?page=1&page_size=10

原文地址:https://www.cnblogs.com/wanstack/p/8650434.html

时间: 2024-08-30 07:18:49

Ansible 小手册系列 十(包含和角色)的相关文章

Ansible 小手册系列 九(Playbook)

playbook是由一个或多个"play"组成的列表.play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色.从根本上来讲所谓task无非是调用ansible的一个module.将多个play组织在一个playbook中即可以让它们联同起来按事先编排的机制同唱一台大戏. 其主要有以下四部分构成: Target section: 定义将要执行 playbook 的远程主机组 Variable section: 定义 playbook 运行时需要使

Ansible 小手册系列 十一(变量)

变量名约束 变量名称应为字母,数字和下划线. 变量应始终以字母开头. 变量名不应与python属性和方法名冲突. 变量使用 通过命令行传递变量(extra vars) ansible-playbook release.yml -e "user=starbuck" 在 inventory 中定义变量(inventory vars) host3 http_port=80 # 定义主机变量 [webservers:vars] # 定义组的变量 ntp_server= ntp.example.

Ansible 小手册系列 四(详解配置文件)

[[email protected] ansible]# ansible --version ansible 2.2.0.0 config file = /etc/ansible/ansible.cfg configured module search path = Default w/o overrides 配置文件存在不同的位置,但只有一个可用.在下列列表中,ansible从上往下依次检查,检查到哪个可用就用哪个. ANSIBLE_CFG 环境变量,可以定义配置文件的位置 ansible.c

Ansible 小手册系列 六(Patterns 匹配模式)

Patterns 是定义Ansible要管理的主机.但是在playbook中它指的是对应主机应用特定的配置或IT流程. 命令格式 命令行 ansible <host-pattern> [options] playbook 中 - hosts: <host-pattern> 使用示例 ansible \* -m service -a "name=httpd state=restarted" Patterns 使用 匹配所有的主机 all * # 命令行中使用 \进

Ansible 小手册系列 二(安装)

通过yum(CentOS, RHEL)安装 rpm -ivh  http://mirrors.ustc.edu.cn/epel/epel-release-latest-6.noarch.rpm wget --no-check-certificate -O  /etc/yum.repos.d/epel.repo  https://lug.ustc.edu.cn/wiki/_export/code/mirrors/help/epel?codeblock=0 yum install ansible 注

Cocos2dx 小技巧(十二) 一种可行的系列动画播放方式

定义: 将一个类(Adaptee)的接口转换成客户(Client)希望的另外一个接口(Target). 目标接口(Target):客户所期待的接口.目标可以是具体的或抽象的类,也可以是接口. 需要适配的类(Adaptee):需要适配的类或适配者类. 适配器(Adapter):使得一个东西适合另一个东西的东西.百度中定义为:接口转换器.通过包装一个需要适配的对象,把源接口转换成目标接口. 为什么要适配:需要的东西已做好,但是不能用,短时间又不能改造,想办法适配它. 作用: 使得原本由于接口不兼容而

Exchange Server2013 系列十:证书的配置

杜飞 经过前面的配置,基本上可以进行简单的邮件通讯了,但是当用户通过OWA连接邮箱时会报下面的提示: 其他一些服务,如 Outlook Anywhere 和 Exchange ActiveSync,也要求在 Exchange 2013 服务器上配置证书.下面咱们就看一下证书的配置: 首先,我们需要安装内部CA.在此,我就在DC01上安装CA. 选择 AD证书服务,如下图所示: 然后,连续下一步之后,选中下图所示的证书颁发机构和证书颁发机构WEB注册. 稍等片刻之后,等证书颁发机构安装成功.接下来

HDU 小明系列故事——师兄帮帮忙 快速幂

小明系列故事--师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 4850    Accepted Submission(s): 1275 Problem Description 小明自从告别了ACM/ICPC之后,就开始潜心研究数学问题了,一则可以为接下来的考研做准备,再者可以借此机会帮助一些同学,尤其是漂亮的师妹.这不,班

Exchange Server 2013系列二:服务器角色

杜飞 在上一篇文章中,我们提到现在硬件性能的增加以及成本的下降,硬件已经不再成为软件应用的约束因素,特别是CPU,其 计算能力的成本显著降低.Exchange 2013 的主要设计目标是简化缩放.提高硬件利用率和实现故障隔离.Exchange 2013一开始将服务器角色的数目减少到了两个:客户端访问服务器角色和邮箱服务器角色,当然,升级到SP1之后也包含边缘服务器角色或者是边界网络中安装 Exchange 2007 或 Exchange 2010 边缘传输服务器角色.如下图所示: 客户端访问服务