重用Playbook

news2025/2/25 22:03:21

文章目录

  • 重用Playbook
    • include语句
    • 如何写role
      • 默认变量和普通变量的区别
      • tasks/main.yaml 如何使用变量、静态文件和模板
        • 使用x/*/main.yaml中的变量
        • 使用x/*/other_but_main.yaml中的资源
      • role的依赖

重用Playbook

Ansible支持的两种重用机制是Roles和Includes。

  • Roles是一种可重用的任务和变量的集合,是一种类似于编程语言中的包的概念

  • Includes则是一种将一个Playbook分解成多个文件的方法,可以将一些常用的任务和变量放在单独的文件中,然后在需要的Playbook中引用这些文件。

include语句

在Ansible中,可以使用include关键字将一个或多个文件引入到一个Playbook中,从而实现代码重用的目的。通过将常用的、通用的任务写在一个文件中,可以避免在每个Playbook中重复编写这些任务的代码,大大减少了工作量。此外,使用include语句还可以提高代码的可读性和可理解性,因为将通用的代码抽象出来,使得Playbook的代码更加简洁清晰,易于维护和更新。同时,使用include语句还有助于降低代码的耦合性,因为将常用的任务抽象出来,可以使得不同的Playbook之间的依赖关系更加清晰明了,从而避免代码耦合度过高的问题。

以下是一个使用include语句的简单案例:

假设我们有一个ansible项目,其中使用了两个Playbook:web.yaml和db.yaml,它们分别用于部署Web服务器和数据库服务器。现在我们想要在这两个Playbook中引入一个共同的任务文件:common.yaml,以避免在两个Playbook中重复编写相同的任务代码。

首先,在项目的根目录下创建一个名为tasks的文件夹,用于存放共同的任务文件common.yml。然后在该文件夹下创建一个名为common.yml的文件,内容如下:

  - name: install packages
    remote_user: root
    yum:
     name: git,vim,curl,wget,unzip,zip,net-tools
     state: present

这个任务用于安装一些常用的软件包,这些软件包在Web服务器和数据库服务器中都需要安装。

接下来,我们可以在web.yaml和db.yaml中使用include语句来引入该文件,代码如下:

web.yaml文件:

- name: Deploy web server
  hosts: test1
  tasks:
  - include: tasks/common.yaml
  - name: install and configure Apache
    yum:
     name: httpd
     state: present
  - service:
     name: httpd
     enabled: true
     state: started

db.yaml文件:

- name: Deploy database server
  hosts: test2
  tasks:
  - include: tasks/common.yaml
  - name: install and configure Mysql
    yum:
     name: mariadb-server
     state: present
  - service:
     name: mariadb
     enabled: true
     state: started

在上面的代码中,我们使用了include语句来引入tasks/common.yml文件中的任务,这样就避免了在web.yaml和db.yaml中重复编写安装常用软件包的任务代码。

如何写role

role有比include更强大灵活的代码重用和分享机制。include类似于编程语言中的include,是重用单个文件的,重用的功能有限。

而role类似于编程语言中的 “Package”,可以重用一组文件,形成完整的功能。例如,安装和配置Apache,既需要任务实现安装包和复制模板,也需要httpd.conf 和 index.html 的模板文件,以及handler文件实现的重启功能。这些文件都可以放在一个role里面,以供不同的Playbook文件重用

定义role完整的目录结构

在Ansible中,通过遵循特定的目录结构,就可以实现对role定义。

那么如何创建角色目录呢?

ansible-galaxy init myrole
# 上述命令会在当前目录下创建一个名为myrole的目录,其默认包含了标准的角色目录结构。

一个标准的角色目录结构如下:

image-20230610155911393

如果ansible.yaml 中要调用 role

---
- hosts: test1
  remote_user: root
  roles:
   - myrole

Ansible 并不要求role包含上述所有的目录及文件,可以根据role的功能,加入对应的目录和文件即可。下面是每个目录和文件的功能:

  • tasks目录:存放角色的任务文件,其中main.yaml是必须的,其他任务文件可按需添加。
  • templates目录:存放角色使用的Jinja2模板文件。
  • files目录:存放角色使用的普通文件。
  • vars目录:存放角色使用的变量文件,其中main.yaml是必须的,其他变量文件可按需添加。
  • defaults目录:存放角色的默认变量,其中main.yaml是必须的,其他默认变量文件可按需添加。
  • meta目录:存放角色的元数据文件,包括角色名称、作者、依赖等信息。
  • handlers目录:存放角色的处理程序,其中main.yaml是必须的,其他处理程序可按需添加。
  • README.md:角色的说明文件,包括角色的用途、使用方法等信息。
  • tests目录,包含了以下文件:
    • inventory:角色的测试用例的主机清单文件,定义了测试用例中需要使用的主机和主机组等信息。
    • test.yaml:角色的测试用例文件,定义了测试用例中需要执行的任务和测试方法等信息。

此外,下面的文件不需要绝对或者是相对路径,和放在同一目录下的文件一样,直接使用即可

copy 或 scipt 使用 roles/x/files/下的文件

template使用roles/x/templates下的文件

include使用roles/x/tasks下的文件

而在写role的时候,一般要包含role入口文件 roles/x/tasks/main.yaml,其他的文件和目录,可以根据自己需求选择是否加入

带参数的role

下面定义了一个带参数的role,名字myrole,其目录结构如下

main.yaml
  roles
    myrole
      tasks
        main.yaml

在roles/myrole/tasks/main.yaml中,使用{{ }}定义的变量就可以了

---

- name: use param
  debug: 
   msg="{{ param }}"

使用带有参数的role

在main.yaml中可以用如下的方法使用myrole了

---

- hosts: test1
  remote_user: root
  roles:
   - role: myrole
     param: 'Test ansible'
   - role: myrole
     param: 'Test ansible2'

role指定默认的参数

指定默认的参数后,如果在调用时传参数,那么就使用传入的参数值,如果在调用的时候没有传参数,那么就使用默认的参数值

指定默认的参数很简单,一上面的参数为例

main.yaml
  roles
    myrole
      tasks
        main.yaml
      defaults
        main.yaml

在roles/myrole/defaults/main.yaml 中

---

- hosts: test1
  remote_user: root
  roles:
   - role: myrole
   - role: myrole
     param: "I am the value from external"

默认变量和普通变量的区别

在前面的定义中,你会感到好奇,为什么文件夹default和vars下面的变量都会加到Play中,它们由上面区别吗?

default/main.yaml 中的是默认变量。优先级在所有的变量中是最低的,用于放置一些需要被覆盖的变量

vars/main.yaml 中的变量是role变量,优先级比较高,放置一些不想被覆盖的变量,所以变量在命名的时候一般都加入role的名字作为前缀,放置不小心被Playbook中定义的变量覆盖

tasks/main.yaml 如何使用变量、静态文件和模板

任务是Playbook和role的核心,role是一种组织Playbook的方式,包含任务、模板、变量和文件等资源。在role中,任务文件tasks/main.yaml是入口文件,其中可以使用变量、静态文件和模板等资源。学会如何使用这些资源是编写role的关键。

role中的资源可以分为两类

  • 一类是自动加载的,通常放在x/*/main.yaml中
  • 另一类是需要显式调用的,通常放在x/*/other_but_main.yaml中。

使用x/*/main.yaml中的变量

使用x/*/main.yaml中的变量和handler

像使用同一个Playbook中的资源一样使用x/*/main.yaml中的变量和handler

使用x/{files,template}/下的文件

像使用同一个目录下的文件一样来使用放在这里的变量。需要模块和使用的文件类型要匹配

copy 、script对应files目录下的文件

template对应templates下的文件

比如,role x 的目录如下

[root@localhost ansible]# tree myrole/
myrole/
├── files
│   └── index.html
├── tasks
│   └── main.yml
├── templates
│   └── httpd.conf.j2
└── vars
    └── main.yml

files下面的文件为

<!DOCTYPE html>
<html>
<head>
<title>hello world</title>
</head>
<body>
 hi I am csq
</body>
</html>

vars下面的文件为

---
# http.conf vars
http_port: 9999

tasks下的文件为

---
- name: Deploy server web
  yum: 
   name: httpd
   state: present
- name: copy index.html
  copy: 
   src: index.html
   dest: /var/www/html/index.html
- name: copy http.conf
  template:
   src: httpd.conf.j2
   dest: /etc/httpd/conf/httpd.conf
- name: service restart
  service:
   name: httpd
   enabled: true
   state: restarted
- name: Release Port
  firewalld:
   port: 9999/tcp
   permanent: true
   state: enabled

执行这个role

---

- hosts: test1
  remote_user: root
  roles:
   - myrole

使用x/*/other_but_main.yaml中的资源

如果 role x 下面的内容比较复杂,需要对任务或者 vars 进一步2分类,可以使用除 main.yaml 以外的文件外。应如何使用其他文件中的任务或者 vars 呢?Ansible 提供了两个关键字:include 和 include_vars ,分别来引入 role 中非 main.yaml 其他文件包含的任务和vars

例如,在下面的role

myrole/
├── tasks
│   └── main.yml
│   └── http_install.yaml
│   └── http_configure.yaml
│   └── mysql_install.yaml
│   └── mysql_configure.yaml
├── templates
│   └── httpd.conf.j2
│   └── mysql.conf.j2
└── vars
    └── httpd.yaml
    └── mysql.yaml

那么,在 x/*/main.yaml中,通过 include_var来引入httpd的变量后,即可通过include来加载文件install.yaml和configure.yaml中的任务

---
- name: add the os specific varibles
  include_vars: httpd.yaml
- name: install packages
  yum:
   name: {{packages}}
   state: present
- include: http_install.yaml
- include: http_configure.yaml

role的依赖

安装一个Nginx 需要配置 yum仓库,如果不想在配置Nginx 的Playbook重新实现配置 yum 仓库的功能,那么就可以通过role的依赖来解决。role依赖关系的定义文件是x/meta/main.yaml。如果在 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 ,并且只运行一次

playbook.yaml
roles
├── common
│   └── tasks
│       └── main.yaml
├── db
│   ├── meta
│   │   └── main.yaml
│   └── tasks
│       └── main.yaml
└── web
    ├── meta
    │   └── main.yaml
    └── tasks
        └── main.yaml

在{web,db}/meta/main.yaml中添加

dependencies:
- { role: common }

common 下面的main.yaml 内容为

- name: xiugai quanxian
  command: chattr -a csq.txt

web 下面的main.yaml 内容为

- name: shuru xinxi
  shell: echo "I am web,hi csq" >> csq.txt
- name: jia quanxian
  command: chattr +a csq.txt

db 下面的main.yaml 内容为

- name: shuru xinxi
  shell: echo "I am db,hi csq" >> csq.txt
- name: jia quanxian
  command: chattr +a csq.txt

playbook.yaml 内容为

---

- hosts: test1
  remote_user: root
  roles:
   - common
   - db
   - web

执行结果

[root@localhost ansible]# ansible-playbook main.yaml 

PLAY [test1] ***********************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************
ok: [192.168.200.30]

TASK [common : xiugai quanxian] ****************************************************************************************************************************
changed: [192.168.200.30]

TASK [db : shuru xinxi] ************************************************************************************************************************************
changed: [192.168.200.30]

TASK [db : jia quanxian] ***********************************************************************************************************************************
changed: [192.168.200.30]

TASK [web : shuru xinxi] ***********************************************************************************************************************************
changed: [192.168.200.30]

TASK [web : jia quanxian] **********************************************************************************************************************************
changed: [192.168.200.30]

PLAY RECAP *************************************************************************************************************************************************
192.168.200.30             : ok=6    changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

然后查看一下 远程主机内容是否改变,以及隐藏权限是否还在

[root@localhost ansible]# ansible test1 -m shell -a "cat csq.txt &&  lsattr  csq.txt"
192.168.200.30 | CHANGED | rc=0 >>
I am web,hi csq
I am web,hi csq
-----a---------- csq.txt

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

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

相关文章

【RuoYi-Cloud-Plus】学习笔记 06 - Sentinel(一)关于 StatisticSlot 以及 LeapArray

文章目录 前言参考目录学习笔记1、Sentinel 简介2、Sentinel 架构图3、Sentinel 源码学习3.1、包结构3.2、 LeapArray &#xff08;滑动窗口算法的实现&#xff09;3.3、StatisticSlot3.3.1、StatisticSlot#entry3.3.2、StatisticSlot#exit3.4、StatisticNode、StatisticSlot、…

Linux——基础网络设置

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。 个人主页&#xff1a;小李会科技的…

几个事件的问题

1.PC端的click是点击事件&#xff0c;移动端的lick会存在300ms延迟 移动端的click是单击事件&#xff0c;单击事件:第一次点击后&#xff0c;监测300ms, 看是否有第二次点击操作&#xff0c;如果有就是单击&#xff0c;如果有就是双击。 如何解决&#xff1a; 单手指事件模型…

Linux 操作系统原理 — tc 流量控制技术解析

目录 文章目录 目录Traffic ControlTraffic Control 的基本实现原理流量处理的三个层面流量处理的关键流程流量队列的类型FIFO 队列PFIFO_FAST 队列SFQ 队列令牌桶队列 Kernel Traffic Control 的工作原理Qdisc&#xff08;队列描述&#xff09;Class&#xff08;分类&#xff…

电子元器件解析之电容(二)——电容分类与应用场景

书接上文&#xff1a;电子元器件解析之电容(一)——定义与性能参数&#xff1a;https://blog.csdn.net/weixin_42837669/article/details/131142286 摘要 本文总结了各种不同介质电容的特性&#xff0c;包括陶瓷电容、电解电容、薄膜电容等&#xff1b;同时对一些特殊场合的电容…

Transformer Block运算量

参考&#xff1a;Swin Transformer论文精读【论文精读】_哔哩哔哩_bilibili 在看朱毅老师讲解Swin Transformer论文时&#xff0c;里面有一个Transformer Block的计算复杂度的推导计算&#xff0c;感觉清晰明了&#xff0c;这里做一下记录&#xff0c;先说一下结果&#xff0c;…

Android:Handler

参考来源 参考来源 参考来源 参考来源 Handler机制&#xff08;面试版&#xff09; Binder/Socket用于进程间通信&#xff0c;而Handler消息机制用于同进程的线程间通信 handler机制是android系统运行的基础&#xff0c;它采用生产者&#xff0c;消费者模式进行设计。其中生产…

基于SSM的青少年编程学习系统设计与实现

摘 要&#xff1a;在智能技术飞速发展的今天&#xff0c;各国都努力争取在人工智能时代的发展中占据优势&#xff0c;青 少年编程教育就显得格外重要。不过&#xff0c;相比一些青少年编程教育发展更先进的国家&#xff0c;我国青少 年编程教育仍处在初级阶段&#xff0c;很多青…

服务器(裸机)如何安装Centos 7系统

1. 下载系统镜像&#xff08;可以选择自己对应的版本&#xff09; http://mirrors.aliyun.com/centos/7/isos/x86_64/2. 制作linux系统U盘 下载UltraISO制作工具并安装 再准备一个空U盘&#xff08;注意&#xff1a;这个操作会将U盘内数据全部删除操作之前请将U盘内文件备份&…

Swift学习笔记(一)基础语法

文章目录 前言开发工具变量与常量变量和常量的定义和使用变量和常量的命名规范注释初识基本数据类型浮点型数据布尔型数据两种特殊的基本数据类型元组可选值类型 为类型取别名模拟面试 字符、字符串与集合类型字符串类型字符串的组合字符类型转义字符 字符串类型中的常用方法集…

Redis的大key

什么是 redis 的大 key redis 的大 key 不是指存储在 redis 中的某个 key 的大小超过一定的阈值&#xff0c;而是该 key 所对应的 value 过大对于 string 类型来说&#xff0c;一般情况下超过 10KB 则认为是大 key&#xff1b;对于set、zset、hash 等类型来说&#xff0c;一般…

K8s in Action 阅读笔记——【13】Securing cluster nodes and the network

K8s in Action 阅读笔记——【13】Securing cluster nodes and the network 13.1 Using the host node’s namespaces in a pod Pod中的容器通常在不同的Linux名称空间下运行&#xff0c;这使得它们的进程与其他容器或节点默认名称空间下运行的进程隔离开来。 例如&#xff…

初学Nginx要掌握哪些概念

文章目录 为什么要使用Nginx&#xff1f;什么是Nginx&#xff1f;Nginx的作用&#xff1f;反向代理负载均衡动静分离 为什么要使用Nginx&#xff1f; 小公司项目刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发的情况下&#xff0c;一个…

Android 逆向安全行业前景如何?

前言 Android 逆向是指对已经发布的 Android 应用进行分析和研究&#xff0c;通过逆向工程&#xff0c;将 Android 应用中的底层实现原理、业务逻辑、源代码以及恶意行为等等信息进行破解和掌握。逆向工程可以让研究者深入了解 Android 应用的实现细节&#xff0c;从而识别和修…

算法刷题-数组-螺旋矩阵

59.螺旋矩阵 力扣题目链接 给定一个正整数 n&#xff0c;生成一个包含 1 到 n^2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 思路 这道题目可以说在面试中出现频率较高的题目&#x…

3.DIY可视化-拖拽设计1天搞定主流小程序-前后分离框架运行

3.DIY可视化-拖拽设计1天搞定主流小程序-前后分离框架运行 前言 话不多说,直接实操。一、导入 diygw-ui-admin项目到vscode 克隆项目 : git clone https://gitee.com/diygw/diygw-ui-admin.git进入项目 桌面 cmd 运行: cd diygw-ui-admin推荐使用yarn 也可参照后面直接使用npm…

react合成事件+底层原理+发展历程

React中的合成事件 合成事件是围绕浏览器原生事件&#xff0c;充当跨浏览器包装器的对象;它们将不同浏览器的行为合并为一个API&#xff0c;这样做是为了确保事件在不同浏览器中显示一致的属性!保证兼容性 合成事件的基本操作 基础语法&#xff1a;在JSX元素上&#xff0c;直…

2023蓝桥杯大学A组C++决赛游记+个人题解

Day0 发烧了一晚上没睡着&#xff0c;感觉鼻子被打火机烧烤一样难受&#xff0c;心情烦躁 早上6点起来吃了个早饭&#xff0c;思考能力完全丧失了&#xff0c;开始看此花亭奇谭 看了六集&#xff0c;准备复习数据结构考试&#xff0c;然后秒睡 一睁眼就是下午2点了 挂了个…

交通 | GAMS快速入门及其在运输问题求解的应用

推文作者​&#xff1a;AmieeXue 第一部分 GAMS编程求解运输问题 GAMS&#xff0c;全称The General Algebraic Modeling System&#xff0c;是一款通用的高级数学建模工具&#xff0c;它支持线性规划、非线性规划、混合整数规划问题、二次约束规划&#xff08;QCP&#xff09;…

《面试1v1》List

我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 《面试1v1》 连载中… 面试官&#xff1a; 小伙子,听说你对Java集合挺在行的? 候选人&#xff1a; 谢谢夸奖,我对Java集合还在学习中,只能算入门水平。特别是List这…