如何创建 Ansible Playbooks 来自动化 Ubuntu 系统配置

介绍


Ansible 是一个简单的配置管理系统,可用于自动化和组织大型计算机网络的系统配置任务。虽然其他一些配置管理系统需要在服务器和客户端系统上安装许多不同的软件包,但使用 Ansible 只需要安装一个服务器组件并且具有对客户端机器的 SSH 访问权限。

在之前的指南中,我们讨论了如何安装 Ansible 软件并学习基本命令。在本指南中,我们将讨论 Ansible playbook,这是 Ansible 创建自动化脚本来配置客户端计算机的方式。

我们假设您已经配置了一个 Ansible 服务器和一些客户端,就像我们在上一个教程中留下的那样。在我们的指南中,服务器是一台 Ubuntu 12.04 机器,我们将要配置的客户端也是 Ubuntu 12.04 机器,以便解释更容易。

什么是 Ansible Playbooks?


Ansible playbook 是以脚本方式向远程计算机发送命令的一种方式。与单独使用 Ansible 命令从命令行远程配置计算机不同,您可以通过向一个或多个系统传递脚本来配置整个复杂的环境。

Ansible playbook 是用 YAML 数据序列化格式编写的。如果您不知道什么是数据序列化格式,可以将其视为一种将程序化数据结构(列表、数组、字典等)转换为可以轻松存储到磁盘的格式的方法。然后可以在以后使用该文件来重新创建结构。JSON 是另一种流行的数据序列化格式,但 YAML 更容易阅读。

每个 playbook 包含一个或多个 plays,它们将主机映射到特定功能。Ansible 通过称为 tasks 的内容来实现这一点,这些内容基本上是模块调用。

探索一个基本的 Playbook


让我们看一个基本的 playbook:

---
- hosts: dropletstasks:- name: Installs nginx web serverapt: pkg=nginx state=installed update_cache=truenotify:- start nginxhandlers:- name: start nginxservice: name=nginx state=started

让我们分解一下这些部分,以便我们了解这些文件是如何构建的以及每个部分的含义。

文件以以下内容开始:

---

这是 YAML 要求的,以将文件解释为一个正确的文档。YAML 允许一个文件中存在多个“文档”,每个文档由 --- 分隔,但 Ansible 只希望每个文件只有一个,因此这应该只出现在文件顶部。

YAML 对空格非常敏感,并使用它来将不同的信息组合在一起。您应该只使用空格而不是制表符,并且必须对文件使用一致的空格以便正确读取。具有相同缩进级别的项目被视为同级元素。

- 开头的项目被视为列表项。具有 key: value 格式的项目被视为哈希或字典。这基本上就是基本的 YAML。

YAML 文档基本上定义了一个包含元素的分层树结构,其中包含的元素位于左侧。

在第二行,我们有以下内容:

---
- hosts: droplets

这是 YAML 中的列表项,就像我们上面学到的那样,但由于它位于最左侧级别,它也是 Ansible 的“play”。Play 基本上是在一组特定主机上执行的任务组,以使它们能够执行您想要分配给它们的功能。每个 play 必须指定一个主机或一组主机,就像我们在这里做的那样。

接下来,我们有一组任务:

---
- hosts: dropletstasks:- name: Installs nginx web serverapt: pkg=nginx state=installed update_cache=truenotify:- start nginx

在顶层,我们有“tasks:”,与“hosts:”处于相同级别。这包含一个列表(因为它以“-”开头),其中包含键值对。

第一个键“name”更像是描述而不是名称。您可以随意命名它。

接下来的键是“apt”。这是对 Ansible 模块的引用,就像当我们使用 ansible 命令并键入类似以下内容时:

ansible -m apt -a 'whatever' all

此模块允许我们指定一个软件包以及它应该处于的状态,在我们的情况下是“installed”。update-cache=true 部分告诉我们的远程机器在安装软件之前更新其软件包缓存(apt-get update)。

“notify” 项包含一个包含一个项目的列表,称为“start nginx”。这不是内部 Ansible 命令,而是对处理程序的引用,当从任务内部调用时,它可以执行某些功能。我们将在下面定义“start nginx”处理程序。

---
- hosts: dropletstasks:- name: Installs nginx web serverapt: pkg=nginx state=installed update_cache=truenotify:- start nginxhandlers:- name: start nginxservice: name=nginx state=started

“handlers” 部分与“hosts”和“tasks”处于相同级别。处理程序就像任务一样,但只有在任务告诉它们客户端系统发生了更改时才会运行。

例如,我们在这里有一个处理程序,在安装软件包后启动 Nginx 服务。只有当“Installs nginx web server”任务导致系统发生更改时,即软件包必须安装且尚未存在时,才会调用处理程序。

我们可以将此 playbook 保存到一个名为“nginx.yml”的文件中。

只是为了一些背景,如果您要在 JSON 中编写相同的文件,它可能看起来像这样:

[{"hosts": "droplets","tasks": [{"name": "Installs nginx web server","apt": "pkg=nginx state=installed update_cache=true","notify": ["start nginx"]}],"handlers": [{"name": "start nginx","service": "name=nginx state=started"}]}
]

正如您所看到的,YAML 更加紧凑,大多数人会说更易读。

运行 Ansible Playbook


一旦你建立了一个 playbook,你可以使用以下格式轻松调用它:

ansible-playbook <span class="highlight">playbook.yml</span>

例如,如果我们想在所有 droplets 上安装并启动 Nginx,我们可以执行以下命令:

ansible-playbook nginx.yml

由于 playbook 本身指定了它应该运行的主机(即我们在上一篇教程中创建的 “droplets” 组),我们不必指定要运行的主机。

然而,如果我们想要将主机列表过滤为仅适用于其中一个主机,我们可以添加一个标志来指定文件中主机的子集:

ansible-playbook -l <span class="highlight">host_subset</span> <span class="highlight">playbook.yml</span>

因此,如果我们只想在 “host3” 上安装并运行 Nginx,我们可以输入以下命令:

ansible-playbook -l host3 nginx.yml

向 Playbook 添加功能


现在我们的 playbook 如下所示:

---
- hosts: dropletstasks:- name: Installs nginx web serverapt: pkg=nginx state=installed update_cache=truenotify:- start nginxhandlers:- name: start nginxservice: name=nginx state=started

它很简单,而且它可以工作,但它只是安装了一个软件并启动了它。这本身并没有太多好处。

我们可以通过向 playbook 添加任务来扩展功能。

添加默认索引文件


我们可以通过添加以下行来告诉它将文件从 Ansible 服务器传输到主机上:

---
- hosts: dropletstasks:- name: Installs nginx web serverapt: pkg=nginx state=installed update_cache=truenotify:- start nginx<span class="highlight">    - name: Upload default index.html for host</span>
<span class="highlight">      copy: src=static_files/index.html dest=/usr/share/nginx/www/ mode=0644</span>handlers:- name: start nginxservice: name=nginx state=started

然后我们可以在当前目录下创建一个名为 static_files 的目录,并在其中放置一个 index.html 文件。

mkdir static_files
nano static_files/index.html

在这个文件中,让我们创建一个基本的 HTML 结构:

<html><head><title>This is a sample page</title></head><body><h1>Here is a heading!</h1><p>Here is a regular paragraph.  Wow!</p></body>
</html>

保存并关闭文件。

现在,当我们重新运行 playbook 时,Ansible 将检查每个任务。它会看到 Nginx 已经安装在主机上,所以它会保持不变。它会看到新的任务部分,并用我们服务器上的文件替换默认的 index.html 文件。

注册结果


当你手动安装和配置服务时,几乎总是需要知道你的操作是否成功。我们可以通过使用 “register” 将这个功能嵌入到我们的 playbook 中。

对于每个任务,我们可以选择在一个变量中注册它的结果(失败或成功),以便以后可以检查。

在使用这个功能时,我们还必须告诉 Ansible 忽略该任务的错误,因为通常情况下,如果出现任何问题,它会中止该主机的 playbook 执行。

因此,如果我们想要检查任务是否失败,以决定后续步骤,我们可以使用注册功能。

例如,我们可以告诉我们的 playbook 如果存在 index.php 文件,则上传它。如果该任务失败,我们可以尝试上传一个 index.html 文件。我们将在另一个任务中检查失败的条件,因为我们只想在 PHP 文件失败时上传 HTML 文件:

---
- hosts: dropletstasks:- name: Installs nginx web serverapt: pkg=nginx state=installed update_cache=truenotify:- start nginx<span class="highlight">- name: Upload default index.php for host</span><span class="highlight">copy: src=static_files/index.php dest=/usr/share/nginx/www/ mode=0644</span><span class="highlight">register: php</span><span class="highlight">ignore_errors: True</span><span class="highlight">- name: Remove index.html for host</span><span class="highlight">command: rm /usr/share/nginx/www/index.html</span><span class="highlight">when: php|success</span>- name: Upload default index.html for hostcopy: src=static_files/index.html dest=/usr/share/nginx/www/ mode=0644<span class="highlight">when: php|failed</span>handlers:- name: start nginxservice: name=nginx state=started

注意:我们目前尚未配置我们的主机来处理 PHP 文件,因此即使你上传了 PHP 文件,它也不会被正确处理。

这个新版本尝试将一个 PHP 索引文件上传到主机上。它将操作的成功注册到一个名为 “php” 的变量中。

如果这个操作成功,接下来会运行删除 index.html 文件的任务。

如果操作失败,将上传 index.html 文件。

结论


现在,你应该已经掌握了如何使用 Ansible 自动化复杂任务的方法。这是一个基本示例,演示了如何开始构建你的配置库。

结合我们在第一个教程中学到的主机和组定义,并利用可用的变量填写信息,我们可以开始组装相互交互的复杂计算机系统。在未来的文章中,我们将讨论如何将变量实施到我们的 playbook 中,并创建角色来帮助管理复杂任务。

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

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

相关文章

数据结构与算法学习笔记四---双向链表的表示和实现(C语言)

1.前言 这篇文章主要介绍双向链表的表示和实现。 2.双向链表 单链表中只有一个指示直接后继的指针域&#xff0c;由此&#xff0c;从某个结点出发只能顺指针向后寻查其他结点。若要寻查结点的直接前驱&#xff0c;则必须从表头指针出发。换句话说&#xff0c;在单链表中&#…

​​​【收录 Hello 算法】第 6 章 哈希表

目录 第 6 章 哈希表 本章内容 第 6 章 哈希表 Abstract 在计算机世界中&#xff0c;哈希表如同一位聪慧的图书管理员。 他知道如何计算索书号&#xff0c;从而可以快速找到目标图书。 本章内容 6.1 哈希表6.2 哈希冲突6.3 哈希算法6.4 小结

日志:打印技巧

一、概览 Unity日志打印技巧 常规日志打印彩色日志日志存储与上传日志开关日志双击溯源 二、常规日志打印 1、打印Hello World 调用堆栈可以很好的帮助我们定位问题&#xff0c;特别是报错的Error日志 Debug.Log("Hello World");Debug.Log("This is a log m…

【java】代理

什么是代理 假设有一个核心方法叫转账&#xff0c;为了安全性考虑&#xff0c;不能让用户直接访问接口。此时涉及到了代理&#xff0c;这使得用户只能访问代理类&#xff0c;增加了访问限制。 代理的定义&#xff1a;给目标对象提供一个代理对象&#xff0c;并且由代理对象控…

egg.socket.io后端开发

1. 安装egg-socket.io npm i egg-socket.io4.1.6 --save最好指定egg-socket.io的版本号&#xff0c;比如我后端使用"egg-socket.io": "^4.1.6", 因为跟前端的socket.io-client是一一关联&#xff0c;socket.io-client用高版本或低版本&#xff0c;都不兼容…

果蔬经营平台|基于SSM+vue的果蔬经营平台系统的设计与实现(源码+数据库+文档)

果蔬经营平台系统 目录 基于SSM&#xff0b;vue的果蔬经营平台系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介…

Python面试50题!面试巩固必看!

题目001: 在Python中如何实现单例模式。 点评&#xff1a;单例模式是指让一个类只能创建出唯一的实例&#xff0c;这个题目在面试中出现的频率极高&#xff0c;因为它考察的不仅仅是单例模式&#xff0c;更是对Python语言到底掌握到何种程度&#xff0c;建议大家用装饰器和元类…

【卫星影像三维重建-全流程代码实现】点云Mesh重构

点云—>Mesh模型 1.介绍1.1 背景1.2 效果示意 2 算法实现2.1 依赖库2.2 实验数据2.3 代码实现2.4 实验效果 3.总结 1.介绍 1.1 背景 &#xff08;1&#xff09;本文主要内容是将三维点云&#xff08;离散的三维点&#xff09;进行表面重建生成Mesh网格&#xff0c;之前有篇…

IP跳变是什么,有什么作用?

IP跳变&#xff0c;简单来说&#xff0c;就是用户在使用网络时&#xff0c;不固定使用一个IP地址&#xff0c;而是定期或根据需求切换到另一个IP地址。这种技术为用户在网络环境中提供了一定的灵活性和安全性。 首先&#xff0c;我们来看看IP跳变的具体实现方式。当用户需要切…

UML快速入门篇

目录 1. UML概述 2. 类的表示 2.1. 类的表示 2.2. 抽象类的表示 2.3. 接口的表示 3. 类的属性&#xff0c;方法&#xff0c;访问权限的表示 3.1. 类的属性 3.2. 类的方法 3.3. 类的权限 4. 类的关联 4.1. 单向关联 4.2. 双向关联 4.3. 自关联 4.4. 类的聚合 4.5.…

Lists.partition用法详解

文章目录 一、引入依赖二、用法三、输出 一、引入依赖 依赖于谷歌的guava 包 <!-- guava --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>28.1-jre</version></dependency&…

仿照el-upload 封装自己的上传控件(el-upload 移动端无法吊起相机)

input选择图片的那个选择在h5的时候在去年下半年突然无法无法出现唤醒相机的选项 不知道出现的原因 发现el-upload作为h5的时候无法吊起相机 又因为需要对服务端地址图片进行回显&#xff08;处于编辑功能的情况下 非新增 新增el-upload 可以实现回显&#xff09; 两个功…

如文所示:

影响 ConnectWise 的 ScreenConnect 远程桌面访问产品的严重漏洞已被广泛利用来传播勒索软件和其他类型的恶意软件。 ConnectWise 于 2 月 19 日通知客户&#xff0c;它已发布针对关键身份验证绕过缺陷和高严重性路径遍历问题的补丁。该安全漏洞当时没有 CVE 标识符。第二天&am…

绘唐3启动器怎么启动一键追爆款3正式版

绘唐3启动器怎么启动一键追爆款3正式版 工具入口 一.文案助手&#xff1a; 【注意&#xff01;&#xff01;】如果图片无显示&#xff0c;一般情况下被杀毒拦截&#xff0c;需关闭杀毒软件或者信任文件路径。 win10设置排除文件&#xff1a; 1.【新建工程】使用前先新建工程…

C语言循环队列

以下是一个使用 C 语言实现的简单循环队列示例&#xff1a; #include <stdio.h> #include <stdlib.h>#define MAX_SIZE 5// 定义循环队列结构体 typedef struct {int items[MAX_SIZE];int front, rear; } Queue;// 初始化队列 void initQueue(Queue *q) {q->fr…

维修贝加莱 MAHLO 5PP320.1043-K08 控制器 主板 工控电脑 触摸屏深圳捷达工控维修

贝加莱HMI面板5PP320.1043-39 扩展产品类型&#xff1a;HMI/触摸屏 产品编号&#xff1a;5PP320.1043-39 B&R 类型名称&#xff1a;HMI/触摸屏 描述 电源面板 PP320 BIOS&#xff1b; 10.4英寸VGA彩色TFT显示屏&#xff0c;带触摸屏&#xff08;电阻式&#xff09;&#xf…

谷歌Gboard应用的语言模型创新:提升打字体验的隐私保护技术

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

blender cell fracture制作破碎效果,将一个模型破碎成多个模型

效果&#xff1a; 1.打开编辑-》偏好设置。搜索cell&#xff0c;勾选上如下图所示的&#xff0c;然后点击左下角菜单里的保存设置。 2.选中需要破碎的物体&#xff0c;按快捷键f3&#xff08;快速搜索插件&#xff09;&#xff0c;搜索cell fracture。 3.调整自己需要的参数配置…

广东省网络安全竞赛部分web,misc wp

我的队伍只做了5题&#xff0c;还是太菜了&#xff0c;本来不想发的&#xff0c;但是写都写了&#xff0c;还是水一篇博客吧 这里是我们队的wp misc1 给了一个压缩包&#xff0c;解压需要密码&#xff0c;用纯数字密码没跑出来&#xff0c;感觉可能不是要强跑&#xff0c;看…

[力扣题解] 343. 整数拆分

题目&#xff1a;343. 整数拆分 思路 动态规划 状态转移方程&#xff1a; 3个数取最大 自己&#xff1b;拆成2个数&#xff1b;先拆一个数i - j&#xff0c;剩下的拆分交给前面f[j]&#xff1b; 代码 // 注意&#xff1a;没有给定k的值, 是自己定的 // f[i] : 拆成i个的最…