Ansible的重用(include和import)

news2024/11/28 11:48:10

环境

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

重用

Ansible提供四种可重用的工件:

  • variable文件:只包含变量的文件
  • task文件:只包含task的文件
  • playbook:可包含play、变量、task,以及其它内容
  • role:包含一套task、变量、default、handler,甚至module或其它plugin(通过目录/文件树的结构来组织)

重用playbook

可以通过 import_playbook 把多个playbook集成到一个主playbook里。

创建文件 test1.ym 如下:

---
- import_playbook: playbook1.yml
- import_playbook: playbook2.yml

创建文件 playbook1.yml 如下:

---
- hosts: all
  tasks:
    - name: task1
      debug:
        msg: "hello"

创建文件 playbook2.yml 如下:

---
- hosts: all
  tasks:
    - name: task1
      debug:
        msg: "world"

运行结果如下:

PLAY [all] *****************************************************************************************

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

TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {
    "msg": "hello"
}

PLAY [all] *****************************************************************************************

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

TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {
    "msg": "world"
}

PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

import_playbook 是静态引入的,也就是说,相当于在主playbook里直接定义 playbook1playbook2 的内容:

---
- hosts: all
  tasks:
    - name: task1
      debug:
        msg: "hello"

- hosts: all
  tasks:
    - name: task1
      debug:
        msg: "world"

下面是一个使用变量的例子。创建文件 test2.yml 如下:

---
- import_playbook: "{{ var1 }}"
  vars:
    var1: "playbook1.yml"
- import_playbook: "{{ var2 }}"

运行时通过命令行的 -e 选项指定变量 var2 ,即: ansible-playbook test2.yml -e var2=playbook2.yml

运行结果如下:

PLAY [all] *****************************************************************************************

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

TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {
    "msg": "hello"
}

PLAY [all] *****************************************************************************************

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

TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {
    "msg": "world"
}

PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

可见,可通过两种方式指定变量:

  • vars
  • -e <var=value>

注意:这两种方式其实也是“静态”定义的变量,也就是在刚开始运行时,值就已经确定的变量。

无法使用动态变量。看下面的例子:

创建文件 test3.yml 如下:

---
- hosts: all
  tasks:
    - name: task1
      set_fact:
        var3: "playbook3.yml"

- import_playbook: playbook3.yml

创建文件 playbook3.yml 如下:

---
- hosts: all
  tasks:
    - name: task1
      debug:
        msg: "{{ var3 }}"

运行结果如下:

TASK [task1] ***************************************************************************************
ok: [192.168.1.55]

PLAY [all] *****************************************************************************************

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

TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {
    "msg": "playbook3.yml"
}

可见,通过 set_fact 定义的变量,可以传到 import_playbook 所引入的playbook里。

但是如果改为下面的写法:

---
- hosts: all
  tasks:
    - name: task1
      set_fact:
        var3: "playbook3.yml"

#- import_playbook: playbook3.yml
- import_playbook: "{{ var3 }}"

运行结果如下:

ERROR! 'var3' is undefined. 'var3' is undefined

这是因为, var3 是动态定义的变量, import_playbook 只能使用静态变量(在刚开始运行时就有值)。

使用role

当playbook较复杂时,使用role会好一些。role把default、handler、变量、task存放到不同目录下,以便于理解和维护。

详见关于role的文档。

重用role,task和变量

  • 动态重用( include_* ):
    • include_role
    • include_tasks
    • include_vars
  • 静态重用( import_* ):
    • import_role
    • import_tasks

include_*

一句话总结:在运行到此处时才动态引入。

import_*

一句话总结:在刚开始运行时就替换为引入的内容。

另:文档上说如果要多次import同一个文件,必须传入变量( You can pass variables to imports. You must pass variables if you want to run an imported file more than once in a playbook. ),但我试了一下,不传变量也没问题,是不是我理解有误?

---
- hosts: all
  tasks:
    - import_tasks: task1.yml
    - import_tasks: task1.yml

include和import的区别

在这里插入图片描述

在handler中重用task

在handler里也可以使用include或import。但要注意它们的区别:

  • include:notify的是handler本身(也就是include的文件),会触发其包含的所有task。
  • import:notify的是import的文件里的某些task。

include

创建 test5.yml 如下:

---
- hosts: all
  tasks:
    - name: task1
      debug:
        msg: "I am task1"
      changed_when: true
      notify: handler1

  handlers:
    - name: handler1
      include_tasks: task5.yml

创建 task5.yml 如下:

---
- name: task5_task1
  debug:
    msg: "I am task5_task1"

- name: task5_task2
  debug:
    msg: "I am task5_task2"

运行结果如下:

TASK [task1] ***************************************************************************************
changed: [192.168.1.55] => {
    "msg": "I am task1"
}

RUNNING HANDLER [handler1] *************************************************************************
included: /root/temp/temp1127/task5.yml for 192.168.1.55

RUNNING HANDLER [task5_task1] **********************************************************************
ok: [192.168.1.55] => {
    "msg": "I am task5_task1"
}

RUNNING HANDLER [task5_task2] **********************************************************************
ok: [192.168.1.55] => {
    "msg": "I am task5_task2"
}

可见,notify的是 handler1 ,其代表 task5.yml ,其中所有task都会运行。

import

创建文件 test6.yml 如下:

---
- hosts: all
  tasks:
    - name: task1
      debug:
        msg: "I am task1"
      changed_when: true
      notify: task5_task2

  handlers:
    - name: handler1
      import_tasks: task5.yml

task5.yml 内容不变。

运行结果如下:

TASK [task1] ***************************************************************************************
changed: [192.168.1.55] => {
    "msg": "I am task1"
}

RUNNING HANDLER [task5_task2] **********************************************************************
ok: [192.168.1.55] => {
    "msg": "I am task5_task2"
}

可见,notify的是 task5_task2 ,它是 task5.yml 里的一个task,只有它会运行

参考

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

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

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

相关文章

HTTP状态码:如何修复 404 Not Found错误?

互联网上各种类型的网站非常多&#xff0c;无论用户还是网站运营者不可避免的会遇到404 Not Found错误&#xff0c;如果遇到404错误&#xff0c;我们应该如何解决呢&#xff1f; 对于用户 检查拼写错误 如果您是遇到错误的用户&#xff0c;请仔细检查 URL 是否有任何拼写错误…

深入探索Linux文件系统:属性、路径与隐藏之谜

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Linux系统理论 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言&#x1f324;️文件的组成☁️文件属性☁️文件内容☁️注意事项 &#x1f324;️路…

JavaFX开发调用AWT创建系统托盘MenuItem菜单中文乱码

打开系统托盘MenuItem只能显示英文字符和中文显示方框 解决办法&#xff1a; 打开Edit Configurations… 选择Mofidy options 勾选Add VM options 在VM optios中填入以下代码 -Dfile.encodingGBK

【Docker】安装Redis 通俗易懂 亲测没有任何问题 只需三步

目录 1.配置redis.conf文件 2.下载镜像 3.运行容器 4.测试 1.配置redis.conf文件 以配置文件启动redis redis配置下载&#xff1a;Index of /releases/ 镜像最好和配置文件版本对应 避免一些不必要的错误 修改文件中以下配置项&#xff1a; 1.将bind 127.0.0.1 -::1注…

YOLOv8改进 | SAConv可切换空洞卷积(附修改后的C2f+Bottleneck)

论文地址&#xff1a;官方论文地址 代码地址&#xff1a;官方代码地址 一、本文介绍 本文给大家带来的改进机制是可切换的空洞卷积&#xff08;Switchable Atrous Convolution, SAC&#xff09;是一种创新的卷积网络机制&#xff0c;专为增强物体检测和分割任务中的特征提取而…

Flutter | TextField长按时选项菜单复制、粘贴显示为英文问题解决

Flutter | TextField长按时选项菜单复制、粘贴显示为英文问题解决 问题描述&#xff1a; 长按TextField后&#xff0c;显示剪切、复制等选项为英文&#xff0c;如下图所示&#xff0c;这是因为问未设置语言本地化&#xff0c;我们需要进行设置。 首先在pubspec.yaml加入以下依赖…

Dempster-Shafer(D-S)证据理论的基本定义和详细分析,优点,缺点,应用!!(系列1)

文章目录 前言一、D-S证据理论的应用&#xff1a;二、D-S证据理论的优点&#xff1a;三、D-S证据理论的缺陷&#xff1a;四、D-S组合规则&#xff1a;总结 前言 Dempster-Shafer&#xff08;D-S&#xff09;证据理论是一种不精确推理理论&#xff0c;也称为Dempster/Shafer证据…

BC76 [NOIP2008]ISBN号码

#include<stdio.h> int main() {char arr[13]; //存放13位的ISBNint i, j;scanf("%s",arr);int s 0;for(i0, j1; i<11; i){if(arr[i] ! -){s (arr[i]-0)*j; //将字符换成int累加&#xff1a;0162……29158j; //执行if的时候加&#xff0c;不执行不加…

P14 C++局部静态变量static延长生命周期

目录 01 前言 02 变量的作用域与生命周期 2.1 什么是作用域&#xff1a; 2.2 什么是变量的生命周期&#xff1a; 03 局部静态 3.1非静态变量例子 3.2静态变量例子 04 全局变量 05 后话 01 前言 在前几期里&#xff0c;我们了解了static关键字在特定上下文中的含义。 …

大厂工作的跨域架构师,最好掌握这4个原则

今天学习的主要内容如下&#xff1a; 什么是跨域架构师&#xff0c;在职责上跟单域架构师有什么区别&#xff1f;跨域架构师的勇气重要&#xff0c;还是技术重要&#xff1f;如何面对多领域之间的冲突&#xff0c;又如何解决冲突&#xff1f;我是一名跨域架构师&#xff0c;可以…

JavaScript 表达式

JavaScript 表达式 目录 JavaScript 表达式 一、赋值表达式 二、算术表达式 三、布尔表达式 四、字符串表达式 表达式是一个语句的集合&#xff0c;计算结果是个单一值。 在JavaScript中&#xff0c;常见的表达式有4种&#xff1a; &#xff08;1&#xff09;赋值表达式…

Xshell连接VMware虚拟机中的CentOS

Xshell连接VMware虚拟机中的CentOShttps://www.cnblogs.com/niuben/p/13157291.html 步骤&#xff1a; 1. 检查Linux虚拟机的网络连接模式&#xff0c;确保它是NAT模式。&#xff08;由于只在本机进行连接&#xff0c;所以没有选择桥接模式。当然&#xff0c;桥接模式的配置会…

中东客户亲临广东育菁装备参观桌面型数控机床生产

近日&#xff0c;中东地区的一位重要客户在广东育菁装备有限公司的热情接待下&#xff0c;深入了解了该公司生产的桌面型数控机床。这次会面不仅加强了双方在业务领域的交流&#xff0c;也为中国与中东地区的经济合作描绘出更美好的前景。 在育菁装备公司各部门主要负责人及工作…

[Java]线程详解

Java线程 一、线程介绍 程序 是为完成特定任务、用某种语言编写的一组指令的集合&#xff08;简单来说就是写的代码&#xff09;。 进程 进程是指运行中的程序&#xff0c;比如我们使用的QQ&#xff0c;就启动了一个进程&#xff0c;操作系统会对该进程分配内存空间。当我…

使用不平衡数据集练习机器学习

一、介绍 在当今世界&#xff0c;机器学习和人工智能几乎被广泛应用于每个领域&#xff0c;以提高绩效和结果。但如果没有数据&#xff0c;它们还有用吗&#xff1f;答案是否定的。机器学习算法严重依赖我们提供给它们的数据。我们提供给算法的数据质量在很大程度上决定了机器学…

LangChain 11实现思维树Implementing the Tree of Thoughts in LangChain’s Chain

思维之树&#xff08; Tree of Thoughts ToT&#xff09;是一个算法&#xff0c;它结合了普林斯顿大学和谷歌DeepMind在本文中提出的大型语言模型&#xff08;LLMs&#xff09;和启发式搜索。看起来这个算法正在被实现到谷歌正在开发的多模式生成AI Gemini中。 现在&#xff0…

vue2-009——mixin混入

一、基础使用案例 1.1、定义混合 1.2、引入混合 1.2.1、局部混入 1.2.2、全局引入 二、注意点 1、组件和混合有同名变量时&#xff0c;以组件的变量为主 2、组件和混合有同名生命周期钩子时&#xff0c;两者都会生效

c盘清理——常用方法和工具整理

背景 最近c盘满了&#xff0c;只剩下1-2G&#xff0c;周末有空清理一下。对这块不太熟悉&#xff0c;下面只是把今天网上看到的比较好用的工具整理一下。 使用工具 磁盘大小查看工具——TreeSize&#xff08;收费&#xff09; 之前都是右键一个个看每个文件的大小&#xff0…

Flutter桌面应用开发之毛玻璃效果

目录 效果实现方案依赖库支持平台实现步骤注意事项话题扩展 毛玻璃效果&#xff1a;毛玻璃效果是一种模糊化的视觉效果&#xff0c;常用于图像处理和界面设计中。它可以通过在图像或界面元素上应用高斯模糊来实现。使用毛玻璃效果可以增加图像或界面元素的柔和感&#xff0c;同…