一、包含 (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
 

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

  1. Ansible 小手册系列 十四(条件判断和循环)

    条件判断 When 语句 在when 后面使用Jinja2 表达式,结果为True则执行任务. tasks: - name: "shut down Debian flavored syste ...

  2. Ansible 小手册系列 十九(常见指令表)

    Play 指令 说明 accelerate 开启加速模式 accelerate_ipv6 是否开启ipv6 accelerate_port 加速模式的端口 always_run   any_error ...

  3. Ansible 小手册系列 十八(Lookup 插件)

    file:获取文件内容 --- - hosts: all vars: contents: "{{ lookup('file', '/etc/foo.txt') }}" tasks: ...

  4. Ansible 小手册系列 十二(Facts)

    Facts 是用来采集目标系统信息的,具体是用setup模块来采集得. 使用setup模块来获取目标系统信息 ansible hostname -m setup 仅显示与ansible相关的内存信息 ...

  5. Ansible 小手册系列 十六(Playbook Debug)

    debug模块在执行期间打印语句,并且可用于调试变量或表达式,而不必停止playbook. 打印自定义的信息 - debug: msg="System {{ inventory_hostna ...

  6. Ansible 小手册系列 十五(Blocks 分组)

    当我们想在满足一个条件下,执行多个任务时,就需要分组了.而不再每个任务都要用when. tasks: - block: - command: echo 1 - shell: echo 2 - raw: ...

  7. Ansible 小手册系列 九(Playbook)

    playbook是由一个或多个"play"组成的列表.play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色.从根本上来讲所谓task无非 ...

  8. Ansible 小手册系列 二十(经常遇到的问题)

    (1). 怎么为任务设置环境变量? - name: set environment shell: echo $PATH $SOME >> /tmp/a.txt environment: P ...

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

    变量名约束 变量名称应为字母,数字和下划线. 变量应始终以字母开头. 变量名不应与python属性和方法名冲突. 变量使用 通过命令行传递变量(extra vars) ansible-playbook ...

随机推荐

  1. Linux优雅退出问题

    问题:Springboot框架开发的项目中会内嵌tomcat容器,在杀死进程的时候tomcat为被正常杀死,导致端口未被释放,第二次启动的时候报端口冲突. 先讲一个基本概念:如何在shell中终止一个 ...

  2. quic协议实践

    QUIC实践 环境Ubuntu14.x86_64 gcc4.8 python2.7 编译QUIC服务器和客户端 下载 git clone https://github.com/google/proto ...

  3. Win10应用《纸书科学计算器》更新啦!

    <纸书科学计算器>在2016年8月拿了计算机设计大赛国家一等奖,现在仍记得我在答辩时还给评委们普及了一波UWP平台的知识.受此鼓励,这款应用也不会停下更新的脚步^_^.最近从1.9小幅升级 ...

  4. Web服务器实现文件传输程序设计

    总体概括来说就是设计一个Web服务器的流程,将执行流程分为简单的步骤,每个步骤作为一个模块来实现. 1.整体设计 服务器程序发送文件给客户端或者从客户端接收文件,每次通信只能做一次文件传输,传输完毕后 ...

  5. docker issue-Cannot connect to the Docker daemon. Is 'docker -d' running on this host?

    Here is my docker version when i run docker version : Client: Version: 1.8.1 API version: 1.20 Go ve ...

  6. windows下Qt5.4.2 for android开发环境配置

    安装包链接: http://yunpan.cn/cFs5tikVA83hK 访问密码 d029   本人所有的软件都安装在D:/Qt   1. 安装 Qt 5.4.2      不在讲述 2, 安装p ...

  7. 激活webstorm(作为一个伪前端,偶尔用用)

    推荐博客:https://blog.csdn.net/voke_/article/details/76418116 我试的方法一.

  8. mysql5.6创建索引导致锁表阻塞查询

    结论:添加索引时,若果有对该表的慢查询,会导致索引添加延时等待   添加索引语句:alter table tb_name add index idx_xx(col_name);   执行添加索引的SQ ...

  9. Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析

    关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸机开发 —— IIC总线 ,下面回顾下 IIC 基础概念 一.IIC 基础概念 IIC(Inter-Integrated Ci ...

  10. delegate委托

    https://www.cnblogs.com/leicao/p/5251090.html 委托是一种存储函数引用的类型,在事件和事件的处理时有重要的用途 通俗的说,委托是一个可以引用方法的类型,当创 ...