如何利用Ansible角色对基础设施环境进行抽象

Ansible 系列之 Ansible 角色 Ansible 角色(Roles)可以理解为将一个剧本(playbook)拆解为多个不同功能的子剧本,然后由一个role(父目录)统一进行管理,方便剧本的更改和迁移。 阅读详情

提供:ZStack云计算

内容介绍

Ansible是一套易于使用的配置管理系统,能够帮助大家立足于单一设备对大量服务器进行配置。大家可以自动完成复杂任务,同时轻松将设备添加至基础设施当中。

在此前的教程中我们探讨了如何安装并配置Ansible以及如何创建playbooks以自动实现系统配置。今天,我们将探讨如何利用Ansible角色将配置工作拆分为更具模块性的步骤。

我们假定大家已经拥有一套安装有Ansible的Ubuntu 12.04的VPS。大家还需要在Ansible配置中拥有一台或者多台其它主机计算机。

Ansible角色是什么?

大家应该已经了解了如何Ansible利用ansible命令与已配置客户端进行交互,外加如何利用ansible-playbook命令实现自动配置。那么在这套模式中,角色的作用是什么?

简单来讲,角色属于抽象的更高层级,用于组织playbooks。在向playbooks中添加更多功能性与灵活性元素时,我们往往很难将其容纳在单一文件之内。角色允许我们创建精简化playbooks,并通过目录结构核定其执行所必需的实际配置步骤。

将事物组织为角色还允许大家在不同服务器上对通用配置步骤进行复用。我们当然可以在同playbook中包含其它文件来实现利用,但在角色当中,这些文件间的链接类型会自动基于一套特定的目录层次。

总体来讲,角色的作用是帮助大家定义服务器的作用,而非指定服务器执行操作的特定步骤。

创建角色框架

为了让Ansible正确处理角色,我们需要构建一套目录结构,用于Ansible找到并理解角色。我们可以在Ansible工作目录内创建“roles”目录。

这里假定大家将用户的主目录作为Ansible工作目录。大家可以将其替换为您所使用的实际目录。

这里我们创建名为”roles”的目录,Ansible将在这里查找角色。

cd ~
mkdir roles
cd roles

在此目录中,我们将定义自己的角色。我们基本需要为每个所创建的角色创建对应的目录。由于我们还需要复制Nginx playbook,因此先创建一个Nginx角色:

mkdir nginx
cd nginx

在此目录中,我们创建另一组目录来区分一个普通playbook内的不同部分。现在创建这些目录:

mkdir files handlers meta templates tasks vars

这些目录将容纳配置的全部实现代码。大家不一定会用到全部目录,因此在实际操作中,也不一定要创建全部目录。

下面来看各目录类型:

  • files: 此目录容纳此角色配置中需要被传输至各主机的常规文件。其中还可能包含需要运行的脚本文件。
  • handlers: 此前playbook中包含的全部处理程序都可被添加至此目录中。
  • meta: 此目录能够容纳用于建立角色依赖性的文件。大家可以预先列出全部当前角色正确运行所必需的关联角色。
  • templates: 大家可以将所有在创建过程中使用变量以代替信息的文件存放在这里。
  • tasks: 此目录容纳playbook中的全部常规任务。其可以引用包含在各自目录内的文件及模板,而不需额外指定路径。
  • vars: 角色变量可在此目录中进行指定,并用于配置文件。

除了“files”与“templates”两个目录,其它目录中若存在main.yml文件,则其中包含的内容将在调用该角色时自动被载入playbook。

将playbook抽象为角色

对于多数playbooks,我们都应优先将其作为角色进行功能实现。

通过上一部分,我们已经设置了roles/nginx/{subdirectories}结构,接下来需要在结构中创建main.yml文件。

创建main.yml任务文件

首先从任务子目录入手,进入tasks目录:

cd ~/roles/nginx/tasks

现在将nginx.yml文件复制到此目录:

cp ~/nginx.yml main.yml

现在我们需要编辑该main文件并移除非任务的部分:

nano main.yml

该文件的初始内容应为:

---
- hosts: droplets
  tasks:
- name: Installs nginx web serverapt: pkg=nginx state=installed update_cache=truenotify:- start nginx- name: Upload default index.php for hostcopy: src=static_files/index.php dest=/usr/share/nginx/www/ mode=0644register: phpignore_errors: True- name: Remove index.html for hostcommand: rm /usr/share/nginx/www/index.htmlwhen: php|success- name: Upload default index.html for hostcopy: src=static_files/index.html dest=/usr/share/nginx/www/ mode=0644when: php|failed

  handlers:
- name: start nginx
  service: name=nginx state=started

我们只需要其中红色的几行。另外,我们可以去掉任务左侧多余的空格。在变更后,新的tasks/main.yml文件如下:

---
- name: Installs nginx web server
  apt: pkg=nginx state=installed update_cache=true
  notify:
- start nginx

- name: Upload default index.php for host
  copy: src=static_files/index.php dest=/usr/share/nginx/www/ mode=0644
  register: php
  ignore_errors: True

- name: Remove index.html for host
  command: rm /usr/share/nginx/www/index.html
  when: php|success

- name: Upload default index.html for host
  copy: src=static_files/index.html dest=/usr/share/nginx/www/ mode=0644
  when: php|failed

可以看到,这种格式更易于阅读,执行步骤也更为清晰。

另外,我们还需要变更配置中的外部文件引用。我们的src行引用的是“static_files”目录。如果将全部静态文件都放置在“files”子目录中,这部分内容就不需要了。Ansible会自动将其找到。

对这些行进行变更,之后tasks/main.yml如下:

---
- name: Installs nginx web server
  apt: pkg=nginx state=installed update_cache=true
  notify:
- start nginx

- name: Upload default index.php for host
  copy: src=index.php dest=/usr/share/nginx/www/ mode=0644
  register: php
  ignore_errors: True

- name: Remove index.html for host
  command: rm /usr/share/nginx/www/index.html
  when: php|success

- name: Upload default index.html for host
  copy: src=index.html dest=/usr/share/nginx/www/ mode=0644
  when: php|failed

完成后保存并退出。

为Handlers创建main.yml文件

现在我们在tasks/main.yml文件内已经拥有了playbook的大部分内容,接下来需要将handlers部分移动到handlers/main.yml文件内。

再次复制nginx.yml文件,这一次目的地为handlers目录:

cd ~/roles/nginx/handlers
cp ~/nginx.yml main.yml

再次打开该文件:

nano main.yml

我们需要的部分仍然标红:

---
- hosts: droplets
  tasks:
- name: Installs nginx web server
  apt: pkg=nginx state=installed update_cache=true
  notify:
    - start nginx

- name: Upload default index.php for host
  copy: src=static_files/index.php dest=/usr/share/nginx/www/ mode=0644
  register: php
  ignore_errors: True

- name: Remove index.html for host
  command: rm /usr/share/nginx/www/index.html
  when: php|success

- name: Upload default index.html for host
  copy: src=static_files/index.html dest=/usr/share/nginx/www/ mode=0644
  when: php|failed

  handlers:
- name: start nginxservice: name=nginx state=started

将handlers左侧的空格移除,最终文件如下:

---
- name: start nginx
  service: name=nginx state=started

完成后保存并退出。

最终整理

由于我们的初始playbook非常简单,因此到这里任务已经基本结束了。

首先,我们将index.html页面(如果有的话,也包括index.php页面)移动到~/static_files目录之外,并将其放置在~/roles/nginx/files目录内:

cp ~/static_files/* ~/roles/nginx/files

如果我们的角色与另一角色关联,则需要在meta目录内添加一个main.yml文件。此文件指定此角色依赖于另一名为“apt”的角色。

如果我们的角色依赖于另一名为“apt”的角色,那么~/roles/nginx/meta/main.yml文件如下:

---
dependencies:
  - { role: apt }

这样一来,“apt”角色中的信息会先于Nginx信息进行提取,从而保证正确的依赖性。

前面曾经提到,“vars”目录可用于为角色设定变量。尽管我们也可以通过vars/main.yml文件配置默认参数来实现这一效果,但这里并不推荐该作法,因为这会让配置的细节存在于角色层次之内。

一般来讲,我们会将细节放置在角色之外,从而更轻松地实现角色结构共享而不必担心信息泄露。另外,在角色内进行变量声明能够简化变量调整流程,从而降低依赖性。

现在大家一定很纳闷,为什么我们要将信息组织在多个目录当中,而且大部分目录还包含main.yml文件?为什么我们不直接创建tasks.yml文件,而是使用tasks/main.yml文件?

这是因为,我们希望尽可能降低文件数量。main.yml文件会由Ansible自动获取,但我们可以使用学习能力ude功能轻松添加更多文件。

如果我们拥有一个用于对tasks/ssl.yml内主要进行SSL配置的额外task文件,则可这样调用:

. . .
tasks:
  - include: roles/nginx/tasks/ssl.yml

创建一套主干playbook

现在我们的角色结构已经配置完成,下面可以轻松在简单playbook内调用全部功能了。

如此一来,我们就能使用playbooks声明各服务器的既定职责,而非其具体执行步骤。

在完整的角色结构之外,我们在工作目录(本示例中为主目录)内创建一个playbook文件:

cd ~
nano play.yml

在文件中,我们需要的信息极少。首先,我们不需要定义任何主机,另外,我们只需要声明所使用的角色:

---
- hosts: droplets
  roles:
- role: nginx

保存并退出。这就是我们的完整playbook了。可以看到,其内容非常清晰且允许我们专注于核心功能。如果我们配置了多个角色,则能够轻松列出不同服务器的具体执行任务。

例如,如果我们的角色负责设置一套WordPress服务器,则可以使用如下playbook:

---
- hosts: wordpress_hosts
  roles:
- nginx
- php
- mysql
- wordpress

就是这么简单。史上,我们也可以使用playbook调用某个角色,命令语法如下:

ansible-playbook play.yml

总结

Ansible角色属于可选项,但如果大家希望广泛使用Ansible,那么强烈各位认真了解角色的相关功能。除了简洁合理地实现主机层级配置,它还能帮助我们复用代码并以模块化方式实现变更。

本文来源自DigitalOcean Community。英文原文:How to Use Ansible Roles to Abstract your Infrastructure Environment By Justin Ellingwood

翻译:diradw

STM32以太网通信-STM32以太网外设(ETH) 通过 DMA 控制器进行介质访问控制 (MAC) STM32F4xx系列控制器内部集成了一个以太网外设,它实际上是一个通过DMA控制器进行介质访问控制(MAC),它的功能就是实现MAC 层的任务。 借助以太网外设,STM32F4xx 控制器可以通过ETH 外设按照IEEE 802.3-2002 标准发送和接收MAC 数据包。 ETH 内部自带专用的DMA 控制器用于MAC,ETH 支持两个工业标准接口介质独立接口(MII)和简化介质独立接口(RMII)用于与外部PHY 芯片连接。MII 和RMII 接口用于 阅读详情

相关推荐

无人机基本组成部件

无人机基本组成部件

qq_37410522的博客 1万+

Ansible(三十三)-- ansible roles(角色) 详解

一、角色的定义 角色(roles)是ansible自1.2版本开始引入的新特性,用于层次性,结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单的说,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地include他们的一种机制。角...

qq_35887546的博客 3441

高速接口SI验证核心:Loopback回环测试原理与三层实践

Loopback(回环测试)是高速数字接口信号完整性(SI)验证的基础技术,其本质是通过内部路径将发送信号原路返回接收端,实现芯片级物理层行为的隔离测量。原理上分为数字环回、近端模拟环回和远端模拟环回三层,分别对应协议逻辑、TX/RX模拟前端及全链路SI压力验证。该技术具备强工程落地性,能直接暴露驱动器温漂、封装阻抗失配、电源噪声耦合等底层问题,在PCIe 5.0、CXL、HBM3等先进接口验证中不可替代。结合PRBS序列激励、眼图分析与BER量化,loopback成为连接仿真模型校准与系统联调的关键枢纽,

weixin_34274029的博客 408

自动化运维——Ansible学习(四)——roles角色

ansible的roles角色学习

雷神乐乐的博客 3802

Cesium 实战 19 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型

Cesium 实战 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型。

非科班Java出身GISer的博客 6436

【华为OD技术面】 - 考到的Lettcode手撕算法代码真题目录

【华为OD技术面 - 考到的Lettcode手撕算法代码真题目录

算法大师! 7825

了解ansible中的角色

本章主要介绍ansible 中角色的使用。

2301_77081516的博客 1061

使用 MATLAB/Simulink + Reinforcement Learning Toolbox 构建一个基于强化学习的永磁同步电机(PMSM)自适应控制仿真系统

随着人工智能(AI)技术的快速发展,强化学习(Reinforcement Learning, RL)在控制系统中的应用日益广泛。在电机控制领域,传统的PID控制虽然成熟稳定,但在面对非线性、时变、不确定负载等复杂工况时,其控制性能可能受限。而强化学习通过与环境的交互学习,能够实现在线自适应控制策略优化,显著提升系统的鲁棒性与响应速度。本教程将带你使用构建一个基于强化学习的永磁同步电机(PMSM)自适应控制仿真系统,实现从控制策略设计、环境建模、训练到仿真的全过程。当前转速(ω)

amy_mhd的博客 407

ansible中的角色使用

ansible roles 1、ansible中的角色简介 角色(roles)是ansible自1.2版本开始引入的新特性,用于层次性、结构化的组织playbook;roles能够根据层次型结构自动装载变量文件、tasks以及handlers等剧本元素;简单的说就是,roles通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们的一种机制;角色一般用于基于主机构建服务的场景中,在企业复杂业务场景中应用的频率很高;也可以用于构建守护进程等场景中;roles以特定的层级

m0_59749940的博客 2290

水与光的奇妙“切割之舞”:水导激光切割技术探秘

水导激光切割技术的诞生,是材料加工领域不断追求高精度、高质量加工的成果。传统激光切割技术在加工过程中,材料会因瞬间高温而产生热变形、热影响区大以及切割面粗糙等问题,这些弊端在对一些高精度、热敏性材料的加工中尤为突出 ,迫切需要一种新的技术来克服这些难题。水导激光切割技术的起源可以追溯到 20 世纪 80 年代。1986 年,德国公司 Aesculap-Werke AG 首次提出了将水流引入激光切割过程的创新想法,并制造出首代水导激光设备。不过,当时的技术尚处于雏形阶段,仅仅是在光纤出口添加了一小柱水流,激光

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1674

【零基础学习CAPL】——CAN报文的发送(CRC——ChecSum值)

本章主要介绍带有CRC值的报文发送一般报文可使用CANoe的IG模块直接发送,但带有CRC值的报文就只能编写脚本进行发送,以下详细讲解在配合Panel面板情况下,如何进行带有循环冗余码的报文进行报文的发送。

LOVE135149的博客 1916

【Ansible】Ansible 角色

【Ansible】Ansible 角色

guanguan12319的博客 867

【微电网优化】基于粒子群求解CHP机组、气网、电网、储热罐和电锅炉微电网优化模型附matlab代码

1 简介 我国风力发电近年发展迅速,装机容量已成为全球首位.随着风力发电在电力系统中的渗透率不断提高,我国多个地区(尤其是"三北"地区)已经面临着十分严峻的风电消纳问题,产生不容忽视的弃风问题.针对目前我国风电消纳存在的困难,本文提出粒子群优化CHP机组、气网、电网、储热罐和电锅炉微电网控制策略. 2 部分代码 Ppv=[0;0;0;0;0;0;9.86000000000000;19.0100000000000;33.1000000000000;45.0700000000000;64.7900000

qq_59747472的博客 672

JVM中垃圾回收

JVM中的垃圾回收是通过对堆内存进行管理、清理无用对象,从而确保应用的高效运行。整个垃圾回收过程包括对象的分代存储、不同的垃圾回收算法(标记-清除、复制、标记-整理等),以及多种垃圾回收器(Serial GC、Parallel GC、CMS GC、G1 GC等)来适应不同的应用场景。优化垃圾回收是一个综合的过程,需要根据应用的特性选择合适的垃圾回收器,并通过合理的内存分配、减少对象创建与销毁、调优对象晋升策略等方法减少GC对应用性能的影响。

yymagicer的博客 2261

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

一文整明白js中垃圾回收,垃圾回收的机制,为什么有垃圾回收

讲述了js中为什么有垃圾回收,垃圾回收的机制

weixin_64104823的博客 1803

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java八股-垃圾回收机制-垃圾回收算法,分代回收,垃圾回收器

深入的图文并茂讲解垃圾回收器,垃圾回收算法,分代回收

weixin_46028606的博客 2772

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

垃圾回收:垃圾回收器

垃圾收集器分类作用位置使用算法特点适用场景Serial串行运行作用于新生代复制算法响应速度优先适用于单CPU环境下的client模式ParNew并行运行作用于新生代复制算法响应速度优先多CPU环境Server模式下与CMS配合使用Parallel并行运行作用于新生代复制算法吞吐量优先适用于后台运算而不需要太多交互的场景Serial Old串行运行作用于老年代标记-压缩算法响应速度优先适用于单CPU环境下的Client模式并行运行作用于老年代。

学习总结 1527

垃圾回收算法和垃圾回收器

二万九千字,图文并茂解释垃圾回收算法和垃圾回收器,让你彻底理解垃圾回收算法和垃圾回收器

我是Java程序员廖志伟,感谢朋友们的支持! 1571

Ansible角色

借助编写好的角色,可以从playbook中向角色传递调整其行为的变量,设置所有站点相关的主机名、IP地址、用户名,或其他在本地需要的具体详细信息。顶级目录定义角色本身的名称。除了将角色包含在play的roles部分中外,也可以使用普通任务将角色添加到play中,使用include_role模块可以动态包含角色,使用import_role模块可以静态导入角色。Vars: 此目录的main.yml文件定义角色的变量值,这些变量通常用于角色内部用途,这些变量的优先级较高,在playbook中使用时不应更改。

weixin_54822053的博客 657

Ansible 中的 Role

role(角色) 用来实现代码的组织管理功能,将实现各种不同功能的 playook 文件,变量文件,模板文 件,handlers 文件根据约定,分别放置在不同的目录,分门别类的管理起来,使其看起来更像一个项 目,其主要用来解决多文件之间的相互包含,引用,组合等问题,将各个功能模块进行拆分,使其原子 化,要实现一个大型复杂需求时,再用 include 指令来引用不同的功能。meta 额外信息需要用到的一些数据,至少有一个名为 main.yaml 的文件,该文件通过 include 来 引用目录下的其它文件。

qq_59349464的博客 2018

Ansible 中的角色使用

Ansible 中的角色使用 1. ansible roles 1. ansible roles ansible 角色简介 Ansible roles 是为了层次化,结构化的组织Playbook roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们 roles一般用于基于主机构建服务的场景中,在企业复杂业务场景中应用的频率很高 以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;相当于函数

weixin_54720351的博客 275

Linux Ansible角色介绍

可以创建一个自定义角色(ansible-galaxy init 角色名)在templates目录下创建jinja2模板配置tasks目录下的main.yml文件---yum:notify:template:编写handlers下的maini.yml(触发器notify触发后执行此yml任务)---service:然后创建yml文件调用角色---roles:- apache运行yml只要此roles.yml不报错,就证明apache角色当中所有的yml语法都ok验证httpd服务是否开启。

m0_49864110的博客 1739

Ansible进阶2——角色管理

1、角色介绍、使用。 2、编写自定义角色。 3、获取系统角色和社区角色。

百慕卿君博客 1447

Ansible(八)——角色

创建和使用角色三个步骤:一、创建角色目录结构。examrole/├── files├── meta├── tasks├── tests└── vars二、定义角色内容---- name:debug:三、在playbook中使用角色---- name:hosts: AAroles:- examrole。

笔落_惊风雨的博客 560

Ansible:roles角色

卸载掉httpd 、nginx等软件;删掉nginx、httpd、mysql等以前创建的用户。键role用于指定角色名称,后续的k/v用于传递变量给角色。本地访问:输入192.168.100.101:81。本地访问:输入192.168.100.101。针对大型项目使用Roles进行编排。还可基于条件测试实现角色调用。范例:roles的目录结构。

chairon的博客 1276

Ansible - - roles 角色

1,roles 简介 ansible 自1.2 版本引入的新特性,用于层次性、结构化地组织 playbook。roles 能够根据层次型结构自动化转载变量文件、tasks 以及 handlers 等。要使用 roles 只需要在 playbook 中使用 include 指令即可。简单来讲,roles 就是通过分别将变量、文件、任务、模板机处理器放置于单独的目录中,并可以便捷地 include ...

weixin_33873846的博客 166
上一篇: 如何利用MySQL设置远程数据库以优化站点性能
下一篇: 如何配置OpenLDAP并执行LDAP管理任务
普通网友
博客等级 码龄10年 769粉丝 269原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值