Ansible的role

环境

  • 控制节点:Ubuntu 22.04
  • Ansible 2.10.8
  • 管理节点:CentOS 8

role

目录结构

role的文件结构中,包含了8个标准目录:

  • tasks
  • handlers
  • templates
  • files
  • vars
  • defaults
  • meta
  • library

例如,下面是 common 这个role的目录结构:

roles/common/               # this hierarchy represents a "role"tasks/            #main.yml      #  <-- tasks file can include smaller files if warrantedhandlers/         #main.yml      #  <-- handlers filetemplates/        #  <-- files for use with the template resourcentp.conf.j2   #  <------- templates end in .j2files/            #bar.txt       #  <-- files for use with the copy resourcefoo.sh        #  <-- script files for use with the script resourcevars/             #main.yml      #  <-- variables associated with this roledefaults/         #main.yml      #  <-- default lower priority variables for this rolemeta/             #main.yml      #  <-- role dependencieslibrary/          # roles can also include custom modules

Ansible默认会在每个目录下查找 main.yml (或者 main.yaml / main )文件。

例:创建目录结构如下:

➜  testRole1 tree
.
├── roles
│   ├── role1
│   │   └── tasks
│   │       └── main.yml
│   ├── role2
│   │   └── tasks
│   │       └── main.yml
│   └── role3
│       └── tasks
│           └── main.yml
└── test.yml

其中, test.yml 内容如下:

---
- hosts: allroles:- role1- role2

注:此处也可以写为:

---
- hosts: allroles:- role: role1- role: role2

两种方式甚至可以混用。

本例中,指定为只包含 role1role2 的内容。

roles/role1/tasks/main.yml 的内容如下(role2和role3类似):

---
- name: role1 task1debug:msg: "I am role1 task1"
- name: role1 task2debug:msg: "I am role1 task2"

运行结果如下:

➜  testRole1 ansible-playbook testRole_1.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [role1 : role1 task1] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role1 task1"
}TASK [role1 : role1 task2] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role1 task2"
}TASK [role2 : role2 task1] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role2 task1"
}TASK [role2 : role2 task2] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role2 task2"
}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

可见,ansible只运行了指定的role。本例中,运行了role1和role2的所有task。

Ansible有以下几种方式来查找role:

  • 在collections里
  • roles 目录下,即本例所示
  • 配置 roles_path ,其缺省的查找路径为 ~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles
  • 在playbook文件同级,即省略 roles 目录,对于本例,可变为:
➜  testRole2 tree
.
├── role1
│   └── tasks
│       └── main.yml
├── role2
│   └── tasks
│       └── main.yml
├── role3
│   └── tasks
│       └── main.yml
└── test.yml

虽然可以省略 roles 目录,但显然加上这一级目录会更清晰一些。

  • 直接在playbook中指定role路径,比如:
---
- hosts: allroles:- role: '/path/to/my/roles/common'

使用role

可通过以下几种方式使用role:

  • 在play级别使用 roles :经典用法,静态引入
  • 在task级别使用 include_role :动态引入
  • 在task级别使用 import_role :静态引入

在play级别使用role

比如:

---
- hosts: webserversroles:- common- webservers

可以给 roles 添加 tagsvars 等选项。

修改role1,role2,role3的 tasks/main.yml ,打印 {{ var1 }} 变量。role1修改如下(role2,role3类似):

---
- name: role1 task1debug:msg: "I am role1 task1 {{ var1 }}"
- name: role1 task2debug:msg: "I am role1 task2"

创建 test.yml 如下:

---
- hosts: allroles:- role1- role: role2vars:var1: "hello"tags: tag1

运行结果如下:

➜  testRole3 ansible-playbook test.yml            PLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [role1 : role1 task1] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role1 task1 hello"
}TASK [role1 : role1 task2] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role1 task2"
}TASK [role2 : role2 task1] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role2 task1 hello"
}TASK [role2 : role2 task2] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role2 task2"
}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

可见,在 role2 中定义的变量 var1 ,在 role1 中也可用(可通过 DEFAULT_PRIVATE_ROLE_VARS 来定制其行为)。

但是,请注意 role2 中添加的tag tag1 ,只针对role2中的每个task都有效:

➜  testRole3 ansible-playbook test.yml --tags tag1PLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [role2 : role2 task1] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role2 task1 hello"
}TASK [role2 : role2 task2] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role2 task2"
}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

在task级别include_role

修改role1,role2,role3的 tasks/main.yml ,去掉变量var1。修改 test.yml 如下:

---
- hosts: alltasks:- name: task1debug:msg: "I am task1"- name: task2include_role:name: role3- name: task3debug:msg: "I am task3"

运行结果如下:

➜  testRole4 ansible-playbook test.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "I am task1"
}TASK [task2] ***************************************************************************************TASK [role3 : role3 task1] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role3 task1"
}TASK [role3 : role3 task2] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role3 task2"
}TASK [task3] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "I am task3"
}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

include_role 可以添加 tagsvarswhen 等选项。

例如:

......- name: task2include_role:name: role3when: "ansible_facts['os_family'] == 'RedHataa'"
......

则只有满足 when 的条件时,才会生效。

这里格外需要注意 tagsinclude_role 的tag只针对 include_role 自身有效。

如果运行playbook时,指定了 --tags 选项,则:

  • 不满足tag条件的 include_role 都不会运行
  • 满足tag条件的 include_role 中,只有满足tag条件的task会运行

例如,创建 test.yml 如下:

---
- hosts: alltasks:- name: task1debug:msg: "I am task1"- name: task2include_role:name: role1tags: tag1- name: task3include_role:name: role3tags: tag2- name: task4debug:msg: "I am task4"

role1/task/main.yml 如下:

---
- name: role1 task1debug:msg: "I am role1 task1"
- name: role1 task2debug:msg: "I am role1 task2"

role3/task/main.yml 如下:

---
- name: role3 task1debug:msg: "I am role3 task1"tags: tag1
- name: role3 task2debug:msg: "I am role3 task2"tags: tag2

运行playbook时,如果不指定 --tags ,则所有task都会运行。

运行playbook时,如果指定 --tags tag1 ,则只有task2(即role1)满足tag条件,但是role1里的task都不满足tag条件,所以也都不会运行:

➜  testRole4 ansible-playbook test.yml --tags tag1PLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task2] ***************************************************************************************PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

运行playbook时,如果指定 --tags tag2 ,则只有task3(即role3)满足tag条件,而role3的task中,只有“role3 task2”同时满足tag条件,所以只有“role3 task2”会运行:

➜  testRole4 ansible-playbook test.yml --tags tag2PLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task3] ***************************************************************************************TASK [role3 : role3 task2] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role3 task2"
}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

在task级别import_role

其行为和 roles 选项是一样的。

这里格外需要注意 tagsimport_role 的tag针对role里的所有task都有效。

如果运行playbook时,指定了 --tags ,则:

  • 不满足tag条件的 import_role 中,满足tag条件的task会运行
  • 满足tag条件的 import_role 中,所有task都会运行

例如,修改上例中的 test.yml ,把 include_role 改为 import_role ,如下:

---
- hosts: alltasks:- name: task1debug:msg: "I am task1"- name: task2import_role:name: role1tags: tag1- name: task3import_role:name: role3tags: tag2- name: task4debug:msg: "I am task4"

role1和role3同上例。

运行playbook时,如果不指定 --tags ,则所有task都会运行。

运行playbook时,如果指定 --tags tag1 ,则task2(即role1)满足tag条件,则role1里的所有task都会运行。同时task3(即role3)虽然不满足tag条件,但role3里满足tag条件的task会运行:

➜  testRole5 ansible-playbook test.yml --tags tag1PLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [role1 : role1 task1] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role1 task1"
}TASK [role1 : role1 task2] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role1 task2"
}TASK [role3 : role3 task1] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role3 task1"
}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

同理,如果运行playbook时,指定 --tags tag2 ,则task2(即role2)不满足tag条件,且role2里的所有task也都不满足tag条件,所以都不会运行。同时,task3(即role3)满足tag条件,则role3里所有的task都会运行:

➜  testRole5 ansible-playbook test.yml --tags tag2PLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [role3 : role3 task1] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role3 task1"
}TASK [role3 : role3 task2] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role3 task2"
}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

include_role和import_role的tag

二者区别总结如下:

include_role 满足tag条件include_role 不满足tag条件
task满足tag条件YN
task不满足tag条件NN
import_role 满足tag条件import_role 不满足tag条件
task满足tag条件YY
task不满足tag条件YN

roles 的tag行为和import_role 一致(都是静态引入)。

动态引入和静态引入的区别

include_role是动态引入,import_role是静态引入。

动态引入, include_task 本身也是一个task,例如:

---
- hosts: alltasks:- name: task1include_role:name: role1
➜  testRole6 ansible-playbook test.yml            PLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************TASK [role1 : role1 task1] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role1 task1"
}TASK [role1 : role1 task2] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role1 task2"
}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

include_role 改为 import_role ,再次运行,如下:

➜  testRole6 ansible-playbook test.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [role1 : role1 task1] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role1 task1"
}TASK [role1 : role1 task2] *************************************************************************
ok: [192.168.1.55] => {"msg": "I am role1 task2"
}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

可见,前者的输出结果中,有一行 TASK [task1] ,而后者没有这一行输出。

这是因为,静态引入,是在预编译期,已经把task1所代表的role1的task静态的引入进来了,在运行期也就没有task1了。而动态引入,在运行期保留了task1,运行到此处时,才把role1引入进来。

这也能解释tag的行为为何会有不同,因为对于静态引入,运行期已经没有task1了,所以tag在预编译期已经被应用到role1实际的task上去了。而对于动态引入,tag确实是应用于task1上的。

参考

  • https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_reuse_roles.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/133849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音小店从0到1起店流程,实操经验分享!

我是电商珠珠 很多人在开店之后&#xff0c;并不知道怎么做。往往会有人跑来问我说&#xff0c;开店之后怎么做啊&#xff0c;流程方面我还不是很熟悉啊等等。 这份起店流程备好了&#xff0c;将来对你有用。 第一步&#xff0c;店铺基础设置 在店铺开好之后&#xff0c;不…

Python图像处理之OpenCV模块

Python图像处理 1、OpenCV模块简介2、OpenCV模块图像常用操作3、PIL与OpenCV图像格式转换4、图像识别应用案例4.1、人脸识别4.2、车牌识别4.3、文本识别1、OpenCV模块简介 OpenCV(Open Source Computer Vision Library)是一个基于BSD许可(开源)发行的跨平台计算机视觉库,主…

Pytest系列(16)- 分布式测试插件之pytest-xdist的详细使用

前言 平常我们功能测试用例非常多时&#xff0c;比如有1千条用例&#xff0c;假设每个用例执行需要1分钟&#xff0c;如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时&#xff0c;会需要协调多个测试资源来把任务分成两部分&#xff0c;于是执行时间缩短一半&#…

AVL树性质和实现

AVL树 AVL是两名俄罗斯数学家的名字&#xff0c;以此纪念 与二叉搜索树的区别 AVL树在二叉搜索树的基础上增加了新的限制&#xff1a;需要时刻保证每个树中每个结点的左右子树高度之差的绝对值不超过1 因此&#xff0c;当向树中插入新结点后&#xff0c;即可降低树的高度&…

Leetcode2909. 元素和最小的山形三元组 II

Every day a Leetcode 题目来源&#xff1a;2909. 元素和最小的山形三元组 II 解法1&#xff1a;枚举 前后缀分解 定义 preMin[i] 为前缀最小值&#xff0c;初始化 preMin[0] nums[0]&#xff0c;递推公式&#xff1a;preMin[i] min(preMin[i - 1], nums[i])。 定义 suf…

InSAR 滤波算法

目录 1.InSAR 滤波原理 2.InSAR 滤波算法 2.1 均值滤波 2.2 Goldstein 滤波 2.3 改进的Goldstein 滤波 2.4 精致 Lee 滤波 2.5 小波滤波2.6 NL-InSAR 滤波 2.7 InSAR-BM3D 滤波 3.参考文献 本文由CSDN点云侠原创&#xff0c;爬虫网站请自重。 InSAR 滤波是InSAR 技术处理中的一…

rviz添加qt插件

一、增加rviz plugin插件 资料&#xff1a;http://admin.guyuehome.com/42336 https://blog.51cto.com/u_13625033/6126970 这部分代码只是将上面两个链接中的代码整合在了一起&#xff0c;整合在一起后可以更好的理解其中的关系 1、创建软件包 catkin_create_pkg rviz_tel…

【MySQL】查询语句

文章目录 选择语句 / 子句比较运算符AND&#xff0c;OR&#xff0c;NOT运算符IN运算符BETWEEN运算符LIKE运算符REGEXP运算符 选择语句 / 子句 USE&#xff1a;选择使用的databaseSELECT&#xff1a;选择查询的列FROM&#xff1a;选择查询的表WHERE&#xff1a;条件查询ORDER B…

IntelliJ IDEA 如何修改默认Maven仓库地址

在使用idea过程中&#xff0c;每次新建项目或者打开项目时&#xff0c;maven仓库地址都会变为默认地址。如何修改默认地址&#xff0c;让其保持不变&#xff0c;如下这种方式可以简单快捷的设置。 1.打开idea&#xff0c;取消项目自动加载 2.点击 Customize,然后再点击 All se…

DeepLearning - 余弦退火热重启学习率 CosineAnnealingWarmRestartsLR

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/134249925 CosineAnnealingWarmRestartsLR&#xff0c;即 余弦退火热重启学习率&#xff0c;周期性修改学习率的下降和上升&#xff0c;间隔幅度逐…

K7系列FPGA进行FLASH读写1——CCLK控制(STARTUPE2原语)

最近的工作涉及对 FPGA 进行远程更新&#xff0c;也就是通过远程通信接口将 .bin 文件送到 FPGA&#xff0c;然后写入 FLASH&#xff0c;这样当 FPGA 重新上电后就可以执行更新后的程序了。因此第一步工作就是进行 FLASH 的读写控制。 然而如果尝试配置 FLASH 管脚时&#xff0…

Android Datastore 动态创建与源码解析

涉及到的知识点 1、协程原理---->很好的博客介绍&#xff0c;一个小故事讲明白进程、线程、Kotlin 协程到底啥关系&#xff1f; 2、Channel知识点---->Android—kotlin-Channel超详细讲解 3、Coroutines : CompletableDeferred and structured concurrency 封装的DataS…

数学建模比赛中常用的建模提示词(数模prompt)

以下为数学建模比赛中常用的建模提示词&#xff0c;希望对你有所帮助&#xff01; 帮我总结一下数学建模有哪些预测类算法&#xff1f; 灰色预测模型级比检验是什么意思? 描述一下BP神经网络算法的建模步骤 对于分类变量与分类变量相关性分析用什么算法 前10年的数据分别是1&a…

javascript自定义事件的观察者模式写法和用法以及继承

<html><head><meta http-equiv"Context-Type:text/html;charsetutf-8"/><title>自定义事件之观察者模式</title><script type"text/javascript" src"common.js"></script></head><body>&…

avue中 curd的列表配置

说明&#xff1a; avue-crud组件中添加查询条件或者新增的时候&#xff0c;条件为下拉框且接口在curd组件中配置 1. html代码 <template><basic-container><avue-crud:data"dataList":option"option"search-change"searchChange&quo…

代码随想录 Day38 完全背包问题 LeetCode T70 爬楼梯 T322 零钱兑换 T279 完全平方数

前言 在今天的题目开始之前,让我们来回顾一下之前的知识,动规五部曲 1.确定dp数组含义 2.确定dp数组的递推公式 3.初始化dp数组 4.确定遍历顺序 5.打印dp数组来排错 tips: 1.当求取物品有限的时候用0-1背包,求取物品无限的时候用完全背包 结果是排列还是组合也有说法,当结果是组…

【PostgreSql基础语法 】1、增删改查、where、limit、like模糊查询

Shell命令框和Navicat联合使用 一、数据库层面&#xff08;shell命令行&#xff09;二、表格层面&#xff08;Navicat&#xff09;三、增删改查1. 增insert into2. 查询select3. UPDATE 改4. DELETE 删除 四、 关键字1. AND2.OR3. NOT NULL 和 NULL4. LIKE 模糊查询4.1 like查找…

linux boot阶段内存分配(x86)

x86中没有boot memory allocator&#xff0c;是用 memblock 来分配的。 memblock有memory 与reserved两种类型&#xff0c;它们的内存是静态内存&#xff0c;不需要用memblock本身去维护&#xff0c;它们被标记为__initdata_memblock&#xff0c;会在boot结束后&#xff08;fre…

渗透实战靶机2wp

0x00 简介 1、测试环境 目标IP&#xff1a;10.xxxx 测试IP&#xff1a;192.168.139.128 测试环境&#xff1a;win10、kali等 测试时间&#xff1a;2021.7.22-2021.7.22 测试人员&#xff1a;ruanruan 2、测试过程 本次实战主要通过对收集到的端口、目录等信息进行持续整…

润和软件HopeStage与奇安信网神终端安全管理系统、可信浏览器完成产品兼容性互认证

近日&#xff0c;江苏润和软件股份有限公司&#xff08;以下简称“润和软件”&#xff09;HopeStage 操作系统与奇安信网神信息技术&#xff08;北京&#xff09;股份有限公司&#xff08;以下简称“奇安信”&#xff09;终端安全管理系统、可信浏览器完成产品兼容性测试。 测试…