Go-ansible

文章目录

  • 安装
    • Adhoc
    • Playbook
    • Execute
      • DefaultExecute
      • 自定义执行器
    • Options
      • ansible adhoc and ansible-playbook common options
    • Stdout Callback
    • Results
      • Transformers
      • Default
      • JSON
        • Manage JSON output
  • 示例

Go ansible是一个用于从Golang应用程序运行ansible剧本或ansible命令的包。它支持每个命令的大部分选项。

安装

要安装最新的稳定版本,请运行以下命令:

go get github.com/apenella/go-ansible@v1.1.0

Adhoc

github.com/apenella/go-ansible/pkg/adhoc包使您能够运行 ansible adhoc命令。您可以使用这些特殊类型来运行ansible命令:

  • AnsibleAdhocCmd 是主要的对象类型,它定义了ansible adhoc命令以及如何执行该命令。运行任何ansible ad hoc命令都必须使用 AnsibleAdhocCmd 定义。AnsibleAdhocCmd 有一个参数,用于定义要使用的 Executor,即启动执行的工作程序。如果未指定Executor,则使用空的 DefaultExecutor

  • AnsibleAdhocOptions 类型的参数在ansible的手册页的Options部分进行了描述,并定义了ansible执行行为的方式以及在哪里可以找到执行配置。

您还可以向 AnsiblePlaybookCmd 提供权限提升选项或连接选项,在github.com/apenella/go-ansible/pkg/options 中定义。

Playbook

github.com/apenella/go-ansible/pkg/playbook 包允许您运行ansible playbook命令。您可以使用 playbook 类来运行 ansible playbook:

  • AnsiblePlaybookCmd 是主要的对象类型,它定义了ansible playbook命令以及如何执行它。运行任何ansible playbook命令都必须使用 AnsiblePlaybookCmd 定义。AnsiblePlaybookCmd 有一个参数,用于定义要使用的 Executor,即启动执行的工作者。如果未指定 Executor,则使用空的 DefaultExecutor

  • AnsiblePlaybookOptions 类型在ansible playbook的手册页的 Options 部分中描述了这些参数,并定义了ansible playbook执行行为的方式以及在哪里可以找到执行配置。

您还可以向 AnsiblePlaybookCmd 提供在 github.com/apenella/go-ansible/pkg/options中定义的升级特权选项或连接选项。

Execute

执行器是负责运行命令并返回在stdout和stderr上接收到的结果的组件。Go-ansible 在 execute 包下有一个默认的 executor 实现。该执行器名为 DefaultExecute

任何执行程序都必须遵守executor接口。

// 具有 Execute(context.Context,[]string,stdoutcallback.StdoutCallbackResultsFunc,...ExecuteOptions) 错误方法的类型满足Executor接口
type Executor interface {Execute(ctx context.Context, command []string, resultsFunc stdoutcallback.StdoutCallbackResultsFunc, options ...ExecuteOptions) error
}

DefaultExecute

DefaultExecutor 是在可执行库中定义的执行器。在最基本的设置中,它只将命令标准输出写入系统 stdout,stderr 也是如此,但它很容易扩展管理命令stdout和stderr。为了扩展和更新其行为,它附带了一组 ExecuteOptions 函数,这些函数可以传递给执行器。

// /ExecuteOptions是一个设置执行器选项的函数
type ExecuteOptions func(Executor)

扩展如何将结果返回给用户的另一种方法是使用 transformer,也可以通过WithTransformers(…results.TransformerFunc)ExecuteOptions 将其添加到 DefaultExecutor

自定义执行器

只要 DefaultExecutor 不适合您的需要,您就可以编写自己的 执行器 实现,并将其设置在 AnsiblePlaybookCmd 对象上。AnsiblePlaybookCmd 需要一个实现 Executor 接口的对象。

下面是一个可以由 ExecuteOptions 函数配置的自定义执行器示例。

type MyExecutor struct {Prefix string
}// Options method is used as a helper to apply a bunch of options to executor
func (e *MyExecutor) Options(options ...execute.ExecuteOptions) {// apply all options to the executorfor _, opt := range options {opt(e)}
}// WithPrefix method is used to set the executor prefix attribute
func WithPrefix(prefix string) execute.ExecuteOptions {return func(e execute.Executor) {e.(*MyExecutor).Prefix = prefix}
}func (e *MyExecutor) Execute(ctx context.Context, command []string, resultsFunc stdoutcallback.StdoutCallbackResultsFunc, options ...execute.ExecuteOptions) error {// It is possible to apply extra options when Execute is calledfor _, opt := range options {opt(e)}// that's a dummy workfmt.Println(fmt.Sprintf("[%s] %s\n", e.Prefix, "I am MyExecutor and I am doing nothing"))return nil
}

最后,在下一个片段中,使用自定义执行器执行ansible剧本

// define an instance for the new executor and set the options
exe := &MyExecutor{}exe.Options(WithPrefix("Go ansible example"),
)playbook := &ansibler.AnsiblePlaybookCmd{Playbook:          "site.yml",ConnectionOptions: ansiblePlaybookConnectionOptions,Options:           ansiblePlaybookOptions,Exec:              exe,
}playbook.Run(context.TODO())

Options

定义命令执行选项的类型可以在 github.com/apenella/go-ansible/pkg/options 中找到。

ansible adhoc and ansible-playbook common options

  • AnsibleConnectionOptions 对象的参数在ansible剧本的手册页中的 Connections Options 部分进行了描述,并定义了如何连接到主机。
  • AnsiblePrivilegeEscalationOptions 对象的参数在ansible剧本的手册页中的 Escalation Options 部分进行了描述,并定义了如何使用 become user。

Stdout Callback

可以在go ansible上定义和指定stdout回调方法。您可以在AnsiblePlaybookCmd对象上设置StdoutCallback属性。根据使用的方法,结果由一个或另一个函数管理。管理ansible剧本输出的函数在github.com/apenella/go-ansible/pkg/stdoutallback/results包中定义,并且必须在下一个签名之后定义:

// StdoutCallbackResultsFunc defines a function which manages ansible's stdout callbacks. The function expects a context, a reader that receives the data to be wrote and a writer that defines where to write the data coming from reader, Finally a list of transformers could be passed to update the output coming from the executor.
type StdoutCallbackResultsFunc func(context.Context, io.Reader, io.Writer, ...results.TransformerFunc) error

Results

下面描述了管理 ansible playbook 输出的方法:

Transformers

transformer是一个函数,其目的是丰富或更新来自执行器的输出,并由类型TransformerFunc 定义。

// TransformerFunc is used to enrich or update messages before to be printed out
type TransformerFunc func(string) string

来自执行器的输出被逐行处理,并在该步骤中应用所有 transformers。results包提供了一组可供使用的转换器,但也可以由您自己定义并通过executor传递。

  • Prepend:为输出行设置前缀字符串
  • Append:为输出行设置后缀字符串
  • LogFormat:在输出行中包含日期时间前缀
  • IgnoreMessage:根据作为输入参数接收的模式忽略输出行

Default

默认情况下,任何stdout回调结果都由 DefaultStdoutCallbackResults 结果方法管理。该results方法在分隔符字符串之前 ── 当定义了任何转换器时,在stdout上的每一行,并在调用worker函数之前准备好所有转换器,worker函数负责将输出写入io.Writer。

JSON

当stdout回调方法被定义为json格式时,输出由 JSONSToutCallbackResults 结果方法管理。该results方法准备工作输出函数使用 IgnoreMessage 转换器来忽略那些非json行。将忽略任何其他转换器,但 JSONSToutCallbackResults

JSONSTOUTCallbackResults 函数中,定义了 skipPatterns 数组,其中放置了要忽略的行的匹配表达式。

skipPatterns := []string{// This pattern skips timer's callback whitelist output"^[\\s\\t]*Playbook run took [0-9]+ days, [0-9]+ hours, [0-9]+ minutes, [0-9]+ seconds$",}
Manage JSON output

JSONSToutCallbackResults 方法将json输出写入 io.Writer 参数。Results 包提供了一个 JSONParser,它返回一个 AnsiblePlaybokJSONResults,并在上面保存未打包的json。您可以根据需要操作 AnsibleplaybokJSonResults 对象来实现和格式化json输出。

示例

下面你可以找到一个如何使用go ansible的分步示例,但在 examples文件夹中有更多的示例。
当需要使用go ansible库从Golang应用程序运行ansible剧本时,您必须定义 AnsiblePlaybookCmd,AnsiblePlaybookOptions, AnsiblePlaybookConnectionOptions 如下所示。
AnsiblePlaybookConnectionOptions,其中定义了如何连接到主机。
可选值: local smart ssh

ansiblePlaybookConnectionOptions := &options.AnsiblePlaybookConnectionOptions{Connection: "local",
}

AnsiblePlaybookOptions 定义了哪些主机参与 playbook 的执行。

ansiblePlaybookOptions := &playbook.AnsiblePlaybookOptions{Inventory: "127.0.0.1,",
}

AnsiblePlaybookPrivilegeEscalationOptions 在哪里定义了是否使用 become 以及如何做到这一点。

privilegeEscalationOptions := &options.AnsiblePlaybookPrivilegeEscalationOptions{Become:        true,BecomeMethod:  "sudo",
}

AnsiblePlaybookCmd,其中定义了命令执行。

cmd := &playbook.AnsiblePlaybookCmd{Playbook:          "site.yml",ConnectionOptions: ansiblePlaybookConnectionOptions,Options:           ansiblePlaybookOptions,PrivilegeEscalationOptions: privilegeEscalationOptions,
}

一旦定义了 AnsiblePlaybookCmd,就可以使用run方法运行它。虽然没有定义,但使用了具有默认参数的Executor DefaultExecute

err := cmd.Run(context.TODO())
if err != nil {panic(err)
}

执行的结果如下所示。

 ──── PLAY [all] *********************************************************************──── TASK [Gathering Facts] *********************************************************── ok: [127.0.0.1]──── TASK [simple-ansibleplaybook] **************************************************── ok: [127.0.0.1] => {──     "msg": "Your are running 'simple-ansibleplaybook' example"── }──── PLAY RECAP *********************************************************************── 127.0.0.1                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0──── Playbook run took 0 days, 0 hours, 0 minutes, 0 seconds

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

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

相关文章

VsCode 只有一个标签页 编辑区只能打开一个文件

产生如图所示的问题: 可能是不小心取消了勾选 勾选,Show Tabs

前端 : 用HTML ,CSS ,JS 做一个点名器

1.HTML&#xff1a; <body><div id "content"><div id"top"><div id "name">XAiot2302班点名器</div></div><div id "center"><div id "word">你准备好了吗?</di…

【Docker 内核详解】cgroups 资源限制(二):组织结构与基本规则、子系统简介

cgroups 资源限制&#xff08;二&#xff09;&#xff1a;组织结构与基本规则、子系统简介 1.组织结构与基本规则2.子系统简介 1.组织结构与基本规则 在之前的博客已经介绍过&#xff0c;传统的 Unix 任务管理&#xff0c;实际上是先启动 init 任务作为根节点&#xff0c;再由…

Specializing Smaller Language Models towards Multi-Step Reasoning论文精读

0 Abstract 普遍认为&#xff0c;LLM涌现出来的few-shot learning能力是超大参数模型独有的&#xff08;>100B&#xff09;【emergent abilities】&#xff1b;作者认为&#xff0c;小模型&#xff08;<10B&#xff09;可以将这些能力从大模型&#xff08;>100B&…

uniapp中APP端使用echarts用formatter设置y轴保留2位小数点不生效

uniapp使用echarts&#xff0c;在内置浏览器中&#xff0c;设置保留2位小数能正常显示&#xff08;代码如下&#xff09;&#xff0c;但是在APP端这个设置不起作用。 yAxis: {type: value,axisLabel: {formatter: function (val) {return val.toFixed(2); //y轴始终保留小数点…

测试计划驱动开发模式 TPDD:一种比 TDD 更友好的开发模式

相信大部分开发团队都在使用TDD&#xff0c;并且还有很多开发团队都 对外声明 在使用 TDD 开发模式。 之所以说是“对外声明”&#xff0c;是因为很多开发团队虽然号称使用的是 TDD 开发模式&#xff0c;实际开发过程中却无法满足 TDD 的要求。 实际上&#xff0c;测试驱动的…

Pytorch 猫狗识别案例

猫狗识别数据集https://download.csdn.net/download/Victor_Li_/88483483?spm1001.2014.3001.5501 训练集图片路径 测试集图片路径 训练代码如下 import torch import torchvision import matplotlib.pyplot as plt import torchvision.models as models import torch.nn as…

csapp datalab

知识点总结 1. 逻辑运算符关系 and&#xff08;与&#xff09;、or&#xff08;或&#xff09;和xor&#xff08;异或&#xff09;是逻辑运算符&#xff0c;用于对布尔值进行操作。它们可以在不同的逻辑表达式之间进行转换。下面是and、or和xor之间的转换规则&#xff1a; a…

SpringCloud 微服务全栈体系(九)

第九章 Docker 三、Dockerfile 自定义镜像 常见的镜像在 DockerHub 就能找到&#xff0c;但是我们自己写的项目就必须自己构建镜像了。 而要自定义镜像&#xff0c;就必须先了解镜像的结构才行。 1. 镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而…

OpenCV官方教程中文版 —— 分水岭算法图像分割

OpenCV官方教程中文版 —— 分水岭算法图像分割 前言一、原理二、示例三、完整代码 前言 本节我们将要学习 • 使用分水岭算法基于掩模的图像分割 • 函数&#xff1a;cv2.watershed() 一、原理 任何一副灰度图像都可以被看成拓扑平面&#xff0c;灰度值高的区域可以被看成…

深入探索 C++ 多态 ② - 继承关系

前言 上一章 简述了虚函数的调用链路&#xff0c;本章主要探索 C 各种继承关系的类对象的多态特性。 深入探索 C 多态 ① - 虚函数调用链路深入探索 C 多态 ② - 继承关系深入探索 C 多态 ③ - 虚析构 1. 概述 封装&#xff0c;继承&#xff0c;多态是 C 的三大特性&#xf…

Netty复习:(1)Http server: hello world

一、加依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.72.Final</version></dependency>二、创建自定义的handler package cn.edu.tju.handler;import io.netty.buffer.ByteB…

驱动day10作业

基于platform驱动模型完成LED驱动的编写 驱动程序 #include <linux/init.h> #include <linux/module.h> #include<linux/platform_device.h> #include<linux/mod_devicetable.h> #include<linux/of.h> #include<linux/of_gpio.h> #inclu…

基于深度学习的安全帽识别检测系统(python OpenCV yolov5)

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、研究的内容与方法二、基于深度学习的安全帽识别算法2.1 深度学习2.2 算法流程2.3 目标检测算法2.3.1 Faster R-CNN2.3.2 SSD2.3.3 YOLO v3 三 实验与结果分析3.1 实验数据集3.1.1 实验数据集的构建3.1.2 数据…

iOS的应用生命周期以及应用界面

在iOS的原生开发中&#xff0c;我们需要特别关注两个东西&#xff1a;AppDelegate和ViewController。我们主要的编码工作就是在AppDelegate和ViewControlle这两个类中进行的。它们的类图如下图所示&#xff1a; AppDelegate是应用程序委托对象&#xff0c;它继承了UIResponder类…

均值、方差、标准差

1 中间值和均值 表现&#xff02;中间值&#xff02;的统计名词&#xff1a; a.均值:   mean&#xff0c;数列的算术平均值&#xff0c;反应了数列的集中趋势,等于有效数值的合除以有效数值的个数&#xff0e;b.中位值:  median&#xff0c;等于排序后中间位置的值&#x…

c++多线程

目录 一、进程与线程 二、多线程的实现 2.1 C中创建多线程的方法 2.2 join() 、 detach() 和 joinable() 2.2.1 join() 2.2.2 detach() 2.2.3 joinable() 2.3 this_thread 三、同步机制&#xff08;同步原语&#xff09; 3.1 同步与互斥 3.2 互斥锁&#xff08;mu…

Redis快速上手篇八(redission完善分布式锁)

Redisson Redisson是一个在Redis的基础上实现的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的分布式的Java常用对象&#xff0c;还提供了许多分布式服务&#xff0c;其中就包含了各种分布式锁的实现。简单说就是redis在分布式系统上工…

汽车网络安全--ECU的安全更新

目前,汽车ECU的软件更新可以总结分成三大类: 工厂刷写模式:工厂大批量刷写或者升级,一般在出厂用; 工程模式:4S店、工厂等专业人员进行的ECU固件更新,通常是动力、转向、车控等; 车主模式:车主根据云端推送信息,通过IVI进行应用软件更新;目前也有趋势通过这种方式刷…

在安装和配置DVWA渗透测试环境遇到的报错问题

安装环境 前面的安装我参考的这个博主&#xff1a;渗透测试漏洞平台DVWA环境安装搭建及初级SQL注入-CSDN博客 修改bug 1.首先十分感谢提供帮助的博主&#xff0c;搭建DVWA Web渗透测试靶场_dvwa 白屏-CSDN博客&#xff0c;解决了我大多数问题&#xff0c;报错如下&#xff1…