【Ansible自动化运维】二、Playbook 深入探究:构建复杂自动化流程

​        在 Ansible 自动化运维体系中,Playbook 是极为关键的部分。它允许我们以一种结构化、可重复的方式定义和执行一系列复杂的任务,从而构建高效的自动化流程。本篇文章将深入探究 Ansible Playbook 的各个方面,助您掌握构建复杂自动化任务的核心技能。

一、Playbook 语法详解​

Playbook 基于 YAML(Yet Another Markup Language)语法编写,YAML 以其简洁易读的特点,使得 Playbook 的编写和维护变得相对轻松。​

1.1 基本结构​

一个典型的 Playbook 由多个 “play” 组成,每个 “play” 定义了一组要在特定主机或主机组上执行的任务。以下是一个简单的 Playbook 结构示例:

- name: Install and Configure Apachehosts: web_serversbecome: yestasks:- name: Install Apacheyum:name: httpdstate: present- name: Start Apacheservice:name: httpdstate: started

解释:​

  • - name: 为整个 Playbook 或单个任务定义一个描述性名称,方便识别和调试。这里 “Install and Configure Apache” 描述了此 Playbook 的整体目的。​
  • hosts: 指定此 play 要作用的目标主机或主机组。在主机清单文件中定义了 “web_servers” 组,此 play 将在属于该组的主机上执行。​
  • become: 设置为 “yes” 表示需要使用特权(如 root 权限)来执行后续任务,通常用于安装软件、修改系统配置等需要高权限的操作。​
  • tasks: 下是具体任务列表,每个任务也是一个 YAML 字典。​
  • 每个任务同样有name:来描述其作用。如 “Install Apache” 表示此任务用于安装 Apache 软件。​
  • yum: 是 Ansible 的模块名称,这里使用yum模块来管理软件包。​
  • name: 和 state: 是yum模块的参数。name: httpd指定要安装的软件包名称为 “httpd”(Apache 在 CentOS 系统中的软件包名),state: present表示确保该软件包已安装。​
  • 第二个任务 “Start Apache” 使用service模块来管理服务状态,name: httpd指定要操作的服务为 “httpd”,state: started表示启动该服务。

1.2 YAML 语法要点​

  • 缩进规则:YAML 使用缩进表示层级关系,同一层级的元素必须保持相同的缩进量,通常使用 2 个或 4 个空格,不建议使用制表符。例如,tasks下的每个任务都比tasks缩进一级。​
  • 列表与字典:如上述示例中,整个 Playbook 是一个列表(用 “-” 开头表示),每个 play 是列表中的一个元素,而每个 play 又是一个包含多个键值对的字典(如hosts、become、tasks等都是字典的键)。任务列表tasks同样是一个列表,每个任务是其中的元素,且每个任务也是一个字典(包含name以及模块相关的键值对)。​
  • 注释:使用 “#” 进行单行注释,注释内容从 “#” 开始直到行尾。注释可以帮助阅读和理解 Playbook 的逻辑,尤其是在复杂的 Playbook 中。

二、任务与模块运用​

2.1 选择合适的模块​

Ansible 拥有大量丰富的模块,涵盖系统管理、软件安装、网络配置、文件操作等各个领域。在编写 Playbook 时,关键是要根据任务需求选择最合适的模块。​

例如,在安装软件包方面:​

  • 在基于 Red Hat 系的系统(如 CentOS)上,使用yum模块;​
  • 在 Debian 系的系统(如 Ubuntu)上,则使用apt模块。​

2.2 模块参数配置​

每个模块都有其特定的参数,通过合理配置这些参数,我们可以精确控制任务的执行方式。​

以copy模块为例,它用于将文件从控制节点复制到目标主机。假设我们要将控制节点上的/etc/nginx/nginx.conf文件复制到目标主机的相同位置,并备份目标主机上原有的文件,Playbook 片段如下:

- name: Copy Nginx Configurationhosts: web_serverstasks:- name: Copy nginx.confcopy:src: /etc/nginx/nginx.confdest: /etc/nginx/nginx.confbackup: yes

 解释:​

  • src: 指定源文件路径,即控制节点上要复制的文件路径。​
  • dest: 指定目标文件路径,即文件要复制到目标主机的路径。​
  • backup: yes 表示在复制文件前,对目标主机上的原文件进行备份,备份文件会以.bak后缀命名。

三、变量与模板​

3.1 变量定义与使用​

变量在 Playbook 中起着重要作用,它允许我们动态地调整任务执行的参数和内容,提高 Playbook 的灵活性和可复用性。​

变量可以在多个位置定义:​

  • 全局变量:在 Playbook 的开头定义,对整个 Playbook 有效。例如:
---
- name: Configure Servershosts: allvars:app_user: myuserapp_group: mygrouptasks:- name: Create Useruser:name: "{{ app_user }}"group: "{{ app_group }}"

解释:​

  • 在vars部分定义了两个全局变量app_user和app_group。​
  • 在 “Create User” 任务中,通过双大括号{{ app_user }}和{{ app_group }}的方式引用这些变量,Ansible 在执行任务时会将变量替换为实际的值。​
  • 主机变量:在主机清单文件中为特定主机或主机组定义。例如,在/etc/ansible/hosts文件中:
[web_servers]
web1.example.com web_port=8080
web2.example.com web_port=8081

在 Playbook 中可以这样引用主机变量:

- name: Configure Web Servershosts: web_serverstasks:- name: Set Web Portlineinfile:path: /etc/nginx/nginx.confline: "listen {{ web_port }};"

解释:​

  • 这里假设要在nginx.conf文件中设置不同主机的监听端口,通过引用主机清单中为每个主机定义的web_port变量,实现动态配置。​

3.2 Jinja2 模板引擎​

Jinja2 是 Ansible 中用于处理模板的强大引擎。通过 Jinja2 模板,我们可以在文件中嵌入变量、逻辑判断、循环等,生成动态的配置文件。​

假设我们有一个nginx.conf.j2模板文件,内容如下:

user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;#tcp_nopush     on;keepalive_timeout  65;#gzip  on;{% for server in servers %}server {listen       {{ server.port }};server_name  {{ server.name }};location / {root   /usr/share/nginx/html;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}}{% endfor %}
}

在 Playbook 中使用这个模板生成nginx.conf文件的代码如下:

- name: Generate Nginx Configurationhosts: web_serverstasks:- name: Template Nginx Configurationtemplate:src: nginx.conf.j2dest: /etc/nginx/nginx.confvars:servers:- name: web1.example.comport: 80- name: web2.example.comport: 8080

解释:​

  • template模块用于处理模板文件。​
  • src: 指定模板文件的路径,这里是控制节点上的nginx.conf.j2。​
  • dest: 指定生成文件的路径,即目标主机上的/etc/nginx/nginx.conf。​
  • 在vars部分定义了一个列表变量servers,模板文件中通过{% for server in servers %}循环遍历这个列表,动态生成多个server块的配置,根据每个服务器的name和port变量进行个性化配置。

四、任务编排与控制​

4.1 任务顺序执行​

默认情况下,Playbook 中的任务按照定义的顺序依次执行。前一个任务执行成功后,才会执行下一个任务。如果某个任务执行失败,Ansible 会停止执行后续任务,除非进行了特殊配置。例如,在前面安装和启动 Apache 的 Playbook 中,先执行安装任务,安装成功后再执行启动任务。​

4.2 并行执行​

在大规模部署场景下,为了提高执行效率,可以通过设置forks参数来控制并行执行的任务数量。forks参数可以在ansible.cfg文件中全局设置,也可以在 Playbook 中临时设置。例如,在 Playbook 中设置并行任务数为 10:

- name: Install Software on Multiple Servershosts: allforks: 10tasks:- name: Install Packageyum:name: some_packagestate: present

解释:​

  • forks: 10表示同时对 10 个主机执行 “Install Package” 任务,大大加快了在多台主机上安装软件的速度。​

4.3 条件判断(when 关键字)​

通过when关键字,我们可以根据条件来决定是否执行某个任务。例如,只在目标主机是 CentOS 系统时安装yum软件包:

- name: Install Yum Package on CentOShosts: alltasks:- name: Install Packageyum:name: some_packagestate: presentwhen: ansible_distribution == "CentOS"

解释:​

  • when: ansible_distribution == "CentOS"表示只有当ansible_distribution变量(Ansible 内置变量,用于标识目标主机的操作系统发行版)的值为 “CentOS” 时,才会执行 “Install Package” 任务。

4.4 循环(with_items 等)​

当需要对一组数据重复执行相同任务时,可以使用循环。例如,要在目标主机上创建多个用户:

- name: Create Multiple Usershosts: alltasks:- name: Create Useruser:name: "{{ item }}"state: presentwith_items:- user1- user2- user3

 解释:​

  • with_items后面是一个列表,Ansible 会依次从列表中取出每个元素,将其赋值给item变量,并执行 “Create User” 任务,从而实现创建多个用户的功能。

通过深入理解和运用 Ansible Playbook 的语法、任务与模块、变量与模板以及任务编排与控制等方面,我们能够构建出复杂而高效的自动化流程,极大地提升自动化运维的能力和效率。 

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

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

相关文章

springboot项目中常用的工具类和api

在Spring Boot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率。以下是一些常用的工具类及其典型应用场景,涵盖 Spring 原生工具、第三方库(如Hutool、Guava) 和 Java 自带工具。 1. Spring Framework 自带工具类 (…

23种设计模式-行为型模式-模板方法

文章目录 简介场景解决代码关键优化点 总结 简介 模板方法是一种行为设计模式,它在超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。 场景 假如你正在开发一款分析文档的数据挖掘程序。用户需要向程序输入各种格式&…

解决Long类型前端精度丢失和正常传回后端问题

在 Java 后端开发中,可能会遇到前后端交互过程中 Long 类型精度丢失的问题。尤其是在 JavaScript 中,由于其 Number 类型是双精度浮点数,超过 16 位的 Long 类型值就会发生精度丢失。 问题背景 假设有如下实体类: public class…

PowerPhotos:拯救你的Mac照片库,告别苹果原生应用的局限

如果你用Mac管理照片,大概率被苹果原生「照片」应用折磨过——无法真正并行操作多个图库。每次切换图库都要关闭重启,想合并照片得手动导出导入,重复文件更是无处可逃…… 直到我发现了 PowerPhotos,这款专为Mac设计的照片库管理…

android 14.0 工厂模式 测试音频的一些问题(高通)

1之前用tinycap,现在得用agmcap 执行----agmcap /data/test.wav -D 100 -d 101 -i CODEC_DMA-LPAIF_RXTX-TX-3 -T 3 报错1 agmcap data/test.wav -D 100 -d 101 -i CODEC_DMA-LPAIF_RXTX-TX-3 -T 3 Failed to open xml file name /vendor/etc/backend_co…

以库存系统为核心的ERP底层架构设计

在企业资源计划(ERP)系统中,库存系统常被视为基础模块。但在现代企业的数字化进程中,库存系统不仅仅是一个模块,它已经逐步演化为驱动整个ERP生态的核心引擎。本文从架构设计的角度,探讨为何库存系统应被置…

辛格迪客户案例 | 北京舒曼德医药实施电子合约系统(eSign)

01 北京舒曼德医药科技开发有限公司:医药科技的数字化先锋 北京舒曼德医药科技开发有限公司(以下简称“舒曼德医药”)作为国内医药科技领域的领军企业,致力于创新药物的研发、临床试验和市场推广。公司以“科技兴药、质量为先、服…

【UE5】RTS游戏的框选功能+行军线效果实现

目录 效果 步骤 一、项目准备 二、框选NPC并移动到指定地点 三、框选效果 效果 步骤 一、项目准备 1. 新建一个俯视角游戏工程 2. 新建一个pawn、玩家控制器和游戏模式,这里分别命名为“MyPawn”、“MyController”和“MyGameMode” 3. 打开“MyGameMode”,设置玩家…

vim定位有问题的脚本/插件的一般方法

在使用vim的过程中可能会遇到一些报错或其他不符合预期的情况,本文介绍一些我自己常用的定位有问题脚本/插件的方法(以下方法同样适用于neovim) 执行了某些命令的情况 这种情况最简单,使用:h 命令,如果插件有文档的话…

智能驱动教育变革:人工智能在高中教育中的实践路径与创新策略

一、引言 随着信息技术的飞速发展,人工智能(Artificial Intelligence, AI)已成为推动社会进步的重要力量。在教育领域,人工智能的应用正逐渐改变着传统的教学模式和方法,为教育现代化注入了新的活力。高中教育作为教育…

VLAN(虚拟局域网)

一、vlan概述 VLAN(virtual local area network)是一种通过逻辑方式划分网络的技术,允许将一个物理网络划分为多个独立的虚拟网络。每一个vlan是一个广播域,不同vlan之间的通信需要通过路由器或三层交换机 [!注意] vlan是交换机独有的技术,P…

spring-cloud-starter-alibaba-seata使用说明

Spring Cloud Alibaba Seata 使用说明 spring-cloud-starter-alibaba-seata 是 Spring Cloud Alibaba 生态中用于集成分布式事务框架 Seata 的核心组件,支持 AT(自动补偿)、TCC(手动补偿) 等模式。 一、依赖配置 添加…

每日一题(小白)暴力娱乐篇23

由题意得知给我们一串数字,我们每次交换两位,最少交换多少次成功得到有顺序的数组。我们以平常的思维去思考,加入给你一串数字获得最少的交换次数,意味着你的交换后续基本不会变,比如说2 1 3 5 4 中1与2交换后不变&…

Python基础——Pandas库

对象的创建 导入 Pandas 时,通常给其一个别名“pd”,即 import pandas as pd。作为标签库,Pandas 对象在 NumPy 数组基础上给予其行列标签。可以说,列表之于字典,就如 NumPy 之于 Pandas。Pandas 中,所有数…

Spring入门概念 以及入门案例

Spring入门案例 Springspring是什么spring的狭义与广义spring的两个核心模块IoCAOP Spring framework特点spring入门案例不用new方法,如何使用返回创建的对象 容器:IoC控制反转依赖注入 Spring spring是什么 spring是一款主流的Java EE轻量级开源框架 …

The packaging for this project did not assign a file to the build artifact

问题: maven install报错:The packaging for this project did not assign a file to the build artifact 解决方案: 方案1: 使用mvn clean install 就可以解决问题, 方案2: 找到lifecycle点clean再点…

C++入门一:C++ 编程概述

一、C 语言与 C 的关系:从 “带类的 C” 到独立王国 1.1 血缘关系:C 是 C 的 “超级进化版” 起源:C 由 Bjarne Stroustrup 在 1980 年代开发,最初名为 “C with Classes”(带类的 C),旨在为 …

LLM生成文本的 束搜索参数是什么(Beam Search)

LLM生成文本的 束搜索参数是什么(Beam Search) 束搜索(Beam Search)是一种在序列生成任务(如机器翻译、文本生成等)中常用的启发式搜索算法,用于在搜索空间中寻找最优的生成序列。 束搜索的基本概念 在序列生成过程中,每一步都会有多个可能的选择(即候选标记)。 …

Java-多级排序结合thenComparing()

List<User>,user有个字段有值的时候设置1,没值就是null,怎么排序根据这个字段排序? 若要对 List<User> 按照某个字段(如 flag,有值时为 1,无值时为 null)排序,可 以使用 ​​Comparator​​ 结合 null 值处理逻辑。 1. 排序规则说明​​ 假设需求是:…

卷积神经网络(CNN)基础

目录 一、应用场景 二、卷积神经网络的结构 1. 输入层&#xff08;Input Layer&#xff09; 2. 卷积层&#xff08;Convolutional Layer&#xff09; 3. 池化层&#xff08;Pooling Layer&#xff09; 最大池化&#xff08;max_pooling&#xff09;或平均池化&#xff08;…