Ansible的重用(include和import)

环境

  • 管理节点: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: alltasks:- name: task1debug:msg: "hello"

创建文件 playbook2.yml 如下:

---
- hosts: alltasks:- name: task1debug: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: alltasks:- name: task1debug:msg: "hello"- hosts: alltasks:- name: task1debug: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: alltasks:- name: task1set_fact:var3: "playbook3.yml"- import_playbook: playbook3.yml

创建文件 playbook3.yml 如下:

---
- hosts: alltasks:- name: task1debug: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: alltasks:- name: task1set_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: alltasks:- 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: alltasks:- name: task1debug:msg: "I am task1"changed_when: truenotify: handler1handlers:- name: handler1include_tasks: task5.yml

创建 task5.yml 如下:

---
- name: task5_task1debug:msg: "I am task5_task1"- name: task5_task2debug: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.55RUNNING 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: alltasks:- name: task1debug:msg: "I am task1"changed_when: truenotify: task5_task2handlers:- name: handler1import_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.hqwc.cn/news/220865.html

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

相关文章

【go入门】表单

4.1 处理表单的输入 先来看一个表单递交的例子&#xff0c;我们有如下的表单内容&#xff0c;命名成文件login.gtpl(放入当前新建项目的目录里面) <html> <head> <title></title> </head> <body> <form action"/login" meth…

上海交通大学生存手册

强烈推荐所有大学生去阅读《上海交通大学生存手册》。虽然它可能有些冗长&#xff0c;但非常重要&#xff0c;因为它道出了大学教育的本质。 如果几年前我能够看到这本书&#xff0c;也许我的大学生活会有所不同。现在我将向正在上大学或者将要上大学的你推荐这本书。 无论你…

NX二次开发UF_CURVE_ask_spline_feature 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_spline_feature Defined in: uf_curve.h int UF_CURVE_ask_spline_feature(tag_t feature_id, tag_t * spline ) overview 概述 Inquire a general spline feature. …

Gee教程1.HTTP基础

标准库启动web服务 Go语言内置了 net/http库&#xff0c;封装了HTTP网络编程的基础的接口。这个Web 框架便是基于net/http的。我们先回顾下这个库的使用。 package mainimport ("fmt""log""net/http" )func main() {//可以写成匿名函数(lambda…

持续集成部署-k8s-配置与存储-存储类:动态创建NFS-PV案例

动态创建NFS-PV案例 1. 前置条件2. StorageClass 存储类的概念和使用3. RBAC 配置4. storageClass 配置5. 创建应用&#xff0c;测试 PVC 的自动配置6. 解决 PVC 为 Pending 状态问题7. 单独测试自动创建 PVC 1. 前置条件 这里使用 NFS 存储的方式&#xff0c;来演示动态创建 …

Java王者荣耀小游戏

Background类 package LX;import java.awt.*; //背景类 public class Background extends GameObject{public Background(GameFrame gameFrame) {super(gameFrame);}Image bg Toolkit.getDefaultToolkit().getImage("C:\\Users\\ASUS\\Desktop\\王者荣耀图片\\Map.jpg&…

【JavaEE初阶】Thread 类及常见方法、线程的状态

目录 1、Thread 类及常见方法 1.1 Thread 的常见构造方法 1.2 Thread 的几个常见属性 1.3 启动⼀个线程 - start() 1.4 中断⼀个线程 1.5 等待⼀个线程 - join() 1.6 获取当前线程引用 1.7 休眠当前线程 2、线程的状态 2.1 观察线程的所有状态 2.2 线程状态和状…

P17C++析构函数

目录 前言 01 什么是析构函数 1.1 举个栗子 02 为什么要写析构函数 前言 今天我们要讨论一下它的“孪生兄弟”&#xff0c;析构函数&#xff0c;它们在某些方面非常相似。 与构造函数相反&#xff0c;当对象结束其生命周期&#xff0c;如对象所在的函数已调用完毕时&…

Redis:持久化RDB和AOF

目录 概述RDB持久化流程指定备份文件的名称指定备份文件存放的目录触发RDB备份redis.conf 其他一些配置rdb的备份和恢复优缺点停止RDB AOF持久化流程AOF启动/修复/恢复AOF同步频率设置rewrite压缩原理触发机制重写流程no-appendfsync-on-rewrite 优缺点 如何选择 概述 Redis是…

An example of a function uniformly continuous on R but not Lipschitz continuous

See https://math.stackexchange.com/questions/69457/an-example-of-a-function-uniformly-continuous-on-mathbbr-but-not-lipschitz?noredirect1

jetpack的简单使用

Jetpack ViewModel&#xff1a; 什么是ViewModel&#xff1f; ViewModel 是 Android 架构组件的一部分&#xff0c;用于帮助开发者管理 UI 数据的持久性和生命周期感知。ViewModel 的主要目的是将 UI 数据与界面控制逻辑分离&#xff0c;以便更好地管理数据的生命周期&#…

单片机学习7——定时器/计数器编程

#include<reg52.h>unsigned char a, num; sbit LED1 P1^0;void main() {num0;EA1;ET01;//IT00;//设置TMOD的工作模式TMOD0x01;//给定时器装初值&#xff0c;50000,50ms中断20次&#xff0c;就得到1sTH0(65536-50000)/256;TL0(65536-50000)%256;TR01; // 定时器/计数器启…