Ansible----playbook模块之templates模块、tags模块、roles模块

目录

引言

一、templates模块

(一)关键信息

(二)实际操作

1.定义主机组

2.设置免密登录

3.分别建立访问目录

4.定义模板文件

5.创建playbook文件

6.执行剧本

7.验证结果

二、tags模块

(一)创建playbook文件

(二)调用标签

(三)跳过标签

(四)特殊标签

(五)play级标签

三、role模块

(一)角色的优势

(二)基本构成

(三)模块使用

1.定义主机组

2.创建目录组件

3.编写各类文件

3.1 定义变量

3.2 制定任务

3.3 调用角色模块

4.执行模块

(四)多角色搭建服务

1.创建目录

2.编写模块文件

2.1 编写mysql模块文件

2.2 编写php模块

3.调用角色模块

4.执行模块


引言

Ansible 是一款强大的自动化运维工具,它通过简单的配置文件(playbooks)和可复用的模块(modules)以及角色(roles)来描述 IT 基础架构的配置和部署过程。下面我将详细介绍如何编写一个Ansible Playbook,并展示如何使用模块和角色来组织和简化配置管理

一、templates模块

在 Ansible 中,templates 模块不是一个直接可调用的模块,而是通过 template 操作(action)来实现模板文件处理的功能。template 操作是 Ansible 的核心功能之一,它允许用户使用 Jinja2 模板语言来动态生成配置文件或其他文本文件,并将这些文件分发到远程主机上

Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记

(一)关键信息

模板文件:模板文件需要存储在 playbook 目录下的 templates 子目录中,并且文件名以 .j2 结尾,表明这是 Jinja2 模板文件。例如,一个名为 httpd.conf.j2 的文件可能包含了 Apache 配置,其中包含了一些由 Ansible 变量填充的占位符。

变量注入:Jinja2 模板支持从 Ansible 的变量中提取值,这些变量可以是 playbook 中定义的,也可以是从 inventory、角色默认变量、主机变量等来源获取的。变量使用双大括号 {{ variable_name }} 进行引用。

动态生成配置:当 playbook 运行时,Ansible 会处理这些模板文件,用实际的变量值替换模板中的占位符,从而生成最终的配置文件内容。

(二)实际操作

1.定义主机组

[root@ansible opt]#sed -n '32,34p' /etc/ansible/hosts 
[web]
192.168.83.80 http_port=192.168.83.80:10000 server_name=www.pla.com:10000  dir_path=/data/html/
192.168.83.90 http_port=192.168.83.90:10001 server_name=www.china.com:10001  dir_path=/data/html/

[web]
#主机组名第一条记录:IP地址:192.168.83.80HTTP端口配置:http_port=192.168.83.80:10000
#定义httpd_port变量值为192.168.83.80:10000,在后面通过编写.j2文件调用
#意味着这个服务器上的Web服务将在IP地址192.168.83.80的10000端口上监听服务器名称:server_name=www.pla.com:10000
#同样定义变量值,在后面通过编写.j2文件调用
#表示通过域名www.pla.com和端口10000可以访问到这个服务器。根目录:dir_path=/data/html/
#指出该Web服务器存储网页文件的根目录位于/data/html/下。第二条记录:IP地址:192.168.83.90 HTTP端口配置:http_port=192.168.83.90:10001
#这个服务器上的Web服务将在IP地址192.168.83.80的10001端口上监听服务器名称:server_name=www.pla.com:10001
#与第一条记录相同根目录:dir_path=/data/html/
#与第一个服务器意思相同

2.设置免密登录

[root@ansible opt]#ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:NMIiOsO4IB4KL4WshtpL8gk/U+uY6a1rT9nE3xKqZlE root@ansible
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|     .           |
|  . . o o        |
|+o . oEo .       |
|X+.  .o S        |
|O*. o+ o o       |
|Ooo.ooo o .      |
|oO+B+.   .       |
|.o&@=            |
+----[SHA256]-----+
[root@ansible opt]#sshpass -p '123' ssh-copy-id root@192.168.83.80
[root@ansible opt]#sshpass -p '123' ssh-copy-id root@192.168.83.90

3.分别建立访问目录

[root@ansible opt]#echo "welcome to 192.168.83.80" >index.html
[root@ansible opt]#echo "welcome to 192.168.83.90" >/data/index.html

4.定义模板文件

[root@ansible data]#ls
httpd.conf
[root@ansible data]#cp  httpd.conf httpd.conf.j2
[root@ansible data]#ls
httpd.conf  httpd.conf.j2
[root@ansible data]#vim  httpd.conf.j2
[root@ansible data]#cat -n httpd.conf.j2| sed -n '42p;95p;118,125p'42	Listen {{http_port}}          95	ServerName {{server_name}}118	#119	DocumentRoot "{{dir_path}}"120	121	#122	# Relax access to content within /var/www.123	#124	<Directory "{{dir_path}}">125	    AllowOverride None
#所有的变量,取自于/etc/ansible/hosts文件中主机后面定义的变量值
-------------------------------------------------------------------------------------
Listen {{http_port}}  
#指定HTTP服务监听的端口,这里使用模板变量{{http_port}}动态设定        ServerName {{server_name}}
#设置服务器的主机名或IP与端口号,同样使用模板变量{{server_name}}动态设定DocumentRoot "{{dir_path}}"
#设置访问目录<Directory "{{dir_path}}">
#同样设置访问目录,给目录授权,使httpd程序可以访问站点目录

5.创建playbook文件

name: httpd
#指定了剧本名称,hosts: web
#指定了操作的目标为主机组web,且以root用户身份远程登录执行任务。Vars: 
#变量定义部分,用于设定剧本中将会引用的变量值。
#这里定义了两个变量:package为需要安装的软件包名(httpd),service为服务名(也是httpd)tasks:- name: firewalldservice: name=firewalld state=stopped
#关闭防火墙服务firewalld,以便HTTP服务可以无障碍地接收外部请求。- name: install httpdyum: name={{package}}
#使用YUM包管理器安装package定义的变量名的服务- name: configtemplate: src=/data/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
#使用template模板功能将/data/httpd.conf.j2模板文件复制并到/etc/httpd/conf/httpd.conf
#作为HTTP服务器的配置文件。template模板会自动将httpd.conf.j2模板文件中定义的变量,替换为
#ansible的hosts文件中定义的各个变量值notify: restart httpd
#此步骤通过notify: restart httpd来通知处理程序在配置更改后重启httpd服务。- name: dir_pathfile: path=/data/html/ state=directory
#确保/data/html/目录存在,用于存放网页文件。- name: start httpdservice: name=httpd state=started
#启动httpd服务。- name: index01copy: src=/opt/index.html dest=/data/html/when: ansible_default_ipv4.address == '192.168.83.80'- name: index02copy: src=/data/index.html dest=/data/html/when: ansible_default_ipv4.address == '192.168.83.90'
#根据远程主机的IPv4地址条件性地从不同源路径拷贝index.html文件到/data/html/目录下。
#如果主机IP为192.168.83.80,则从/opt/index.html拷贝;
#如果为192.168.83.90,则从/data/index.html拷贝。
handlers:- name: restart httpdservice: name={{service}} state=restarted
#handlers处理程序块,定义了在特定条件下执行的操作。这里只有一个处理程序restart httpd,
#当有任务通知(通过notify: restart httpd)时,会重启httpd服务,确保配置变更生效。

6.执行剧本

7.验证结果

7.1 访问验证

7.2 查看配置文件

二、tags模块

在Ansible中,tags模块并不是一个实际的模块,而是Playbooks中一个非常有用的功能,它允许用户为任务或者播放(plays)分配标签(tags)。这些标签可以帮助你在执行Playbook时,有选择性地执行特定的任务集,而不是默认执行所有任务。这对于大型Playbook的管理和维护特别有帮助,因为你可以在不同的场景下,快速执行或跳过某些任务

(一)创建playbook文件

[root@ansible data]#vim tags.yaml
[root@ansible data]#cat tags.yaml 
---
- name: tags_serverhosts: webtasks:- name:file: path=/opt/test/ state=directorytags:- dir   #设置标签名称为dir- name:file: path=/opt/test01/ state=directorytags:- dira  #设置标签名称为dira- name:file: path=/opt/test02/ state=directorytags:- dirb  #设置标签名称为dirb

(二)调用标签

当你运行Playbook时,可以通过--tags选项指定你想要执行的标签。Ansible将仅执行那些匹配指定标签的任务

ansible-playbook 剧本名 --tags="标签名"

去远程主机查看

[root@client01 opt]#ls
rh  test01
#只执行了指定标签的任务,建立了test01目录文件

(三)跳过标签

如果你想执行除了某些标签之外的所有任务,可以使用--skip-tags选项

在远程主机查看

(四)特殊标签

Ansible还支持一些特殊标签,如always和never。带有always标签的任务总会被执行,而带有never标签的任务则永远不会被执行,无论命令行中指定了哪些标签

重新定义一个playbook剧本

执行剧本

指定执行标签名为dir的的任务,即使不指定always标签,它的任务也同样会执行

执行顺序默认时从上往下执行,即使你指定标签,如果always标签在指定标签的上方,那么它就会先执行always标签的任务

当指定never标签,它的任务才会被执行

(五)play级标签

除了在任务级别,还可以在Play级别定义标签,这样该Play下的所有任务(除非被特定任务的标签覆盖)都将继承该Play的标签

指定需要执行的play任务

只会执行指定的play任务,下面的任务并不会被执行

三、roles模块

在Ansible中,roles 是一种强大的组织和复用配置管理代码的方法,它从 Ansible 版本1.2 开始被引入。角色设计的目的是为了实现配置的层次化和结构化,使得 Playbooks 更加清晰、易于管理和重复利用

(一)角色的优势

  • 模块化: 角色使得复杂的配置任务得以分解,每个角色负责一部分功能,便于管理和维护。
  • 重用性: 可以在多个项目或不同环境中重用相同的角色。
  • 团队协作: 团队成员可以独立开发和测试各自负责的角色,然后集成到更大的自动化流程中。
  • 清晰性: Playbooks 变得更简洁,因为具体的配置细节被封装在角色中

(二)基本构成

ansible的角色目录,yum安装默认存放在/etc/ansible/目录下

一个典型的 Ansible 角色目录结构可能包含以下几个部分

files: 用来存放由 copy 模块或 script 模块调用的文件。

templates:存放Jinja2模板文件,用于动态生成配置文件。

tasks: (tasks/main.yml) :此目录应当包含一个 main.yml 文件。包含了该角色需要执行的任务列表。

handlers: (handlers/main.yml):此目录应当包含一个 main.yml 文件 。定义了在特定条件触发时执行的操作,如服务重启。

vars: (vars/main.yml): 此目录应当包含一个 main.yml 文件 。定义角色内部使用的变量。

defaults: (defaults/main.yml):此目录应当包含一个 main.yml 文件 。提供角色的默认变量值,这些值可以被覆盖。

meta: (meta/main.yml):此目录应当包含一个 main.yml 文件 。包含角色的元数据,比如角色的依赖关系。

(三)模块使用

1.定义主机组

[root@ansible data]#vim /etc/ansible/hosts
[root@ansible data]#sed -n '32,35p' /etc/ansible/hosts
[web]
192.168.83.80
[webserver]
192.168.83.90

2.创建目录组件

[root@ansible data]#mkdir -p /etc/ansible/roles/nginx/{files,templates,tasks,handlers,vars,defaults,meta}
[root@ansible data]#ll /etc/ansible/roles/
总用量 0
drwxr-xr-x 9 root root 105 5月   8 21:29 nginx
[root@ansible data]#ll /etc/ansible/roles/nginx/
总用量 0
drwxr-xr-x 2 root root 6 5月   8 21:29 defaults
drwxr-xr-x 2 root root 6 5月   8 21:29 files
drwxr-xr-x 2 root root 6 5月   8 21:29 handlers
drwxr-xr-x 2 root root 6 5月   8 21:29 meta
drwxr-xr-x 2 root root 6 5月   8 21:29 tasks
drwxr-xr-x 2 root root 6 5月   8 21:29 templates
drwxr-xr-x 2 root root 6 5月   8 21:29 vars

3.编写各类文件

3.1 定义变量

定义变量,需要在vars目录下建立mian.yml文件

[root@ansible data]#vim /etc/ansible/roles/nginx/vars/main.yml
[root@ansible data]#cat /etc/ansible/roles/nginx/vars/main.yml
epel: epel-release.noarch
package: nginx
3.2 制定任务

制定任务需要在tasks目录下建立main.yml文件

[root@ansible data]#vim /etc/ansible/roles/nginx/tasks/main.yml
[root@ansible data]#cat /etc/ansible/roles/nginx/tasks/main.yml
- name: install epelyum: name={{epel}}      #调用vars中定义的变量,下载epel源
- name: install nginxyum: name={{package}} state=latest   #下载nginx服务
- name: start nginxservice: enabled=true name={{package}} state=started  #启动nginx服务

3.3 调用角色模块

在/etc/ansible/目录下,编写yml文件

[root@ansible data]#vim /etc/ansible/nginx.yml
[root@ansible data]#cat /etc/ansible/nginx.yml
---
- hosts: web         #指定主机组remote_user: root  #指定远程连接用户roles:             #使用roles模块- nginx          #使用模块目录名,为nginx

4.执行模块

访问测试

(四)多角色搭建服务

1.创建目录

[root@ansible data]#mkdir -p /etc/ansible/roles/{mysql,php}/{files,templates,tasks,handlers,vars,defaults,meta}
[root@ansible data]#ls /etc/ansible/roles/mysql/
defaults  files  handlers  meta  tasks  templates  vars
[root@ansible data]#ls /etc/ansible/roles/php/
defaults  files  handlers  meta  tasks  templates  vars
[root@ansible data]#ls /etc/ansible/roles/nginx/
defaults  files  handlers  meta  tasks  templates  vars

2.编写模块文件

2.1 编写mysql模块文件

2.1.1 定义变量

[root@ansible data]#cat /etc/ansible/roles/mysql/vars/main.yml
package:- mariadb- mariadb-server
server: mariadb

2.1.2 制定任务

[root@ansible data]#cat /etc/ansible/roles/mysql/tasks/main.yml
- name: install mariadbyum: name={{package}} state=latest
- name: start mariadbservice: enabled=true name={{server}} state=started

2.2 编写php模块

2.1.1 定义变量

[root@ansible data]#vim /etc/ansible/roles/php/vars/main.yml
[root@ansible data]#cat /etc/ansible/roles/php/vars/main.yml
package:- php- php-fpm
server: php-fpm

2.1.2 制定任务

[root@ansible data]#vim /etc/ansible/roles/php/tasks/main.yml
[root@ansible data]#cat /etc/ansible/roles/php/tasks/main.yml
- name: install phpyum: name={{package}} state=latest
- name: start php-fpmservice: enabled=true name={{server}} state=started

3.调用角色模块

[root@ansible data]#vim  /etc/ansible/nmp.yml 
[root@ansible data]#cat  /etc/ansible/nmp.yml 
---
- hosts: webserverremote_user: rootroles:- nginx     #按顺序,依次执行,先执行nginx角色模块- mysql- php

4.执行模块

远端主机查看是否安装

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

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

相关文章

《QT实用小工具·六十一》带动画的三角形指示箭头

1、概述 源码放在文章末尾 该项目实现了一个带动画效果的三角形指示箭头&#xff0c;项目demo演示如下所示&#xff1a; 用法 interestingindicate.h interestingindicate.cpp 放到工程中&#xff0c;直接使用即可。 注意&#xff1a;建议绝对布局&#xff0c;手动指定 wid…

华为车BU迈入新阶段,新任CEO对智能车的3个预判

作者 |张马也 编辑 |德新 4月24日&#xff0c;北京车展前夕&#xff0c;华为召开了新一年的智能汽车解决方案新品发布会。 这次发布会&#xff0c;也是华为智能汽车解决方案BU&#xff08;简称「车BU」&#xff09;CEO 靳玉志的公开首秀。 一开场&#xff0c;靳玉志即抛出了…

BACnet转MQTT网关智联楼宇json格式自定义

智能建筑的BACnet协议作为楼宇自动化领域的通用语言&#xff0c;正逐步迈向更广阔的物联网世界。随着云计算和大数据技术的飞速发展&#xff0c;如何将BACnet设备无缝融入云端生态系统&#xff0c;成为众多楼宇管理者关注的焦点。本文将以一个实际案例&#xff0c;揭示BACnet网…

Clion STM32CubeMX 项目

系列文章目录 前言 最后修改 2024 年 4 月 16 日 操作系统&#xff1a;Windows / Linux / macOS 所需工具 STM32CubeMX、GNU ARM 工具链 项目格式&#xff1a; CMake 兼容配置&#xff1a; OpenOCD 运行与调试/嵌入式 GDB 服务器 对于以 STM32 板卡为目标的嵌入式项目&#xf…

分布式与一致性协议之ZAB协议(七)

ZAB协议 ZAB协议:如何处理读写请求 你应该有这样的体会&#xff0c;如果你想了解一个网络服务&#xff0c;执行的第一个功能肯定是写操作&#xff0c;然后才会执行读操作。比如&#xff0c;你要了解ZooKeeper&#xff0c;那么肯定会在zkClient.sh命令行中执行写操作(比如crea…

如何购买阿里云99计划的ECS云服务器?99元购买阿里云2核2G3M服务器教程

阿里云助力中小企业和开发者无忧上云的“99计划”中有两款性价比超高的ECS云服务器&#xff0c;2026年3月31日活动结束前新购和续费价格一样。 其中个人和企业新老用户同享的2核2G3M服务器仅需99元/年&#xff08;续费同价&#xff09;&#xff0c;企业新老用户同学的2核4G5M仅…

Python 框架安全:Django SQL注入漏洞测试.(CVE-2021-35042)

什么是 Django 框架 Django 是一个用 Python 编写的 Web 应用程序框架。它提供了许多工具和库&#xff0c;使得开发 Web 应用程序变得更加容易和高效。Django 遵循了“MTV”&#xff08;模型-模板-视图&#xff09;的设计模式&#xff0c;将应用程序的不同组件分离开来&#x…

《从零开始,搭建一个简单的UVM验证平台》实操

最近的工作中需要用UVM平台去仿真软件同事写的C程序&#xff0c;虽然只要用EDA同事已经搭好的UVM平台稍微改改就行&#xff0c;但对于我这种从未接触过UVM甚至都没用过System Verilog的纯FPGA工程师来说还是很有难度的&#xff0c;因为我对这方面一点概念都没有。 基于此&…

[Kubernetes] 安装KubeSphere

选择4核8G&#xff08;master&#xff09;、8核16G&#xff08;node1&#xff09;、8核16G&#xff08;node2&#xff09; 三台机器&#xff0c;按量付费进行实验&#xff0c;CentOS7.9安装Docker安装Kubernetes安装KubeSphere前置环境: nfs和监控安装KubeSphere masternode1no…

【QT学习】14.线程学习

一。线程了解 线程是计算机科学中的一个重要概念&#xff0c;它是操作系统能够进行运算调度的最小单位。线程是进程中的一个执行流&#xff0c;一个进程可以包含多个线程。与进程相比&#xff0c;线程更轻量级&#xff0c;可以更高效地利用计算机资源。 线程有以下几个特点&…

OpenCV|简单绘制一个矩形

OpenCV中的rectangle() 为绘制矩形命令&#xff0c;形式如下&#xff1a; # (img: cv2.typing.MatLike, pt1: cv2.typing.Point, pt2: cv2.typing.Point, color: cv2.typing.Scalar, thickness: int ..., lineType: int ..., shift: int ...)cv2.rectangle(img, pt1, pt2, …

Dynamic Extraction of Subdialogues for Dialogue Emotion Recognition

对话情感识别的子对话动态提取 摘要1. 介绍2 相关工作2.1 对话上下文建模2.2 常识知识 3 方法3.1 问题定义3.2 模型概述3.3 特征提取模块3.4 依赖性建模3.5 交互式子对话提取模块3.6 重要性增强的多头自注意力模块3.7 子对话框主题提取模块3.8. 分类模块 四、实验4.1 数据集4.1…

含义:理财风险等级R1、R2、R3、R4、R5

理财风险等级R1、R2、R3代表什么&#xff0c;为什么R1不保本&#xff0c;R2可能亏损 不尔聊投资https://author.baidu.com/home?frombjh_article&app_id1704141696580953 我们购买理财产品的时候&#xff0c;首先都会看到相关产品的风险等级。风险等级约定俗成有5级&…

Java进阶07集合(续)

Java进阶07 集合&#xff08;续&#xff09; 一、数据结构&#xff08;树&#xff09; 1、关于树 1.1 相关概念 节点&#xff1a;树中每个单独的分支 节点的度&#xff1a;每个节点的子节点数量 树高&#xff1a;树的总层数 根节点&#xff1a;最顶层节点 左子节点&…

Python专题:三、数字和运算(2)

目录 一、数学运算 二、赋值运算 一、数学运算 1、运算符号 加法 减法- 乘法* 除法/ 计算机中浮点数表示有精度限制&#xff0c;Python有限&#xff0c;所以近似取数 2、除法取整// Python2中 整数/整数 值为整数 Python3中 整数/整数 整数or浮点数 //计算除法对结果取…

2024年最适合做的母婴赛道,选品思路揭秘,教你如何选品!

大家好&#xff0c;我是电商花花。 在我印象中&#xff0c;每年都有人唱衰抖音小店不好做了&#xff0c;太卷了&#xff0c;普通人没有机会了&#xff0c;但是现在直播电商时代&#xff0c;很多信息都会片面的&#xff0c;做不好并不是因为不好做&#xff0c;而是因为你做不好…

60*13薪,外包到新疆...去吗?

大家好&#xff0c;我是白露呀。 今天我在牛客上看到一篇帖子&#xff0c;一位网友说自己收到一个 offer &#xff0c;薪资很高&#xff1a;60k*13&#xff0c;大约一年有近80万。 但是有个要求是外包到新疆的乌鲁木齐&#xff0c;他拿不定主意&#xff0c;就在牛客上发了这个…

Crocoddyl 使用教程(二)

系列文章目录 前言 小车摆杆是另一个经典的控制实例。在这个系统中&#xff0c;一根欠驱动的杆子被固定在一辆一维驱动的小车顶部。游戏的目的是将杆子升到站立位置。 模型如下&#xff1a; https://en.wikipedia.org/wiki/Inverted_pendulum 我们用 表示小车质量、 表示摆杆质…

Agent Hospital: 一种可进化医疗代理人的医院模拟器

论文来源: https://arxiv.org/pdf/2405.02957 1 引言 大型语言模型(LLM)代理在各种任务中表现出了有前景的性能,包括代码生成、信息博弈和问答等。受 LLM 代理能力的启发,一些研究采用它们来模拟人类互动和行为,而不是处理单一任务,例如社交媒体上的信息传播和"Stanford…

Pyside6详细使用教程python之GUI开发

1、首先需要安装Pyside6&#xff0c;终端执行命令&#xff1a; pip3.10 install pyside6 2、你们的一般是 pip install pyside6 2、如下代码创建一个简易程序导入必要的模块 import sys from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton,…