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://xiahunao.cn/news/3022205.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

2024-05-08 问AI: 在深度学习中,介绍一下RMSProp 优化器

文心一言 在深度学习中&#xff0c;RMSProp&#xff08;Root Mean Square Propagation&#xff09;优化器是一种常用的优化算法&#xff0c;主要用于神经网络训练的梯度下降算法的变体。它是对Adagrad优化器的一种改进&#xff0c;旨在解决Adagrad中学习率过快下降的问题。 R…

【C语言】内存函数的概念,使用及模拟实现

Tiny Spark get dazzling some day. 目录 1. memcpy-- 函数原型-- 函数使用-- 函数的模拟实现 2.memmove-- 函数原型-- 函数使用-- 函数的模拟实现 3. memset-- 函数原型-- 函数使用-- 函数的模拟实现 4. memcmp-- 函数原型-- 函数使用-- 函数的模拟实现 1. memcpy 使用需包含…

贪心算法-----柠檬水找零

今日题目&#xff1a;leetcode860 题目链接&#xff1a;点击跳转题目 分析&#xff1a; 顾客只会给三种面值&#xff1a;5、10、20&#xff0c;先分类讨论 当收到5美元时&#xff1a;不用找零&#xff0c;面值5张数1当收到10美元时&#xff1a;找零5美元&#xff0c;面值5张数…

【面试干货】http请求报文的组成与作用?

【面试干货】http请求报文的组成与作用&#xff1f; 一、http 的请求报文组成二、请求行&#xff08;Request Line&#xff09;三、请求头部&#xff08;Request Headers&#xff09;四、请求体&#xff08;Request Body&#xff09;五、响应头部 &#xff08;Response Headers…

【数据可视化-01】Matplotlib图形实战宝典

在数据分析领域&#xff0c;图形化展示数据是非常重要的环节。Python中的matplotlib库是绘制各类图形的强大工具。本文将介绍如何使用matplotlib绘制折线图、直方图、饼图、散点图和柱状图等数据分析中常见的图形&#xff0c;并附上相应的代码示例&#xff0c;可以当初matplotl…

java多线程编码应用1——java多线程CompletableFuture使用技巧

在实际项目开发过程中&#xff0c;大部分程序的执行顺序都是按照代码编写的先后顺序&#xff0c;依次从上往下挨个执行的&#xff0c;但是对于统计或者批量操作数据时&#xff0c;是否有更好的方案呢&#xff1f;这时候就可以考虑使用多线程编程&#xff0c;异步并行执行多个任…

Dockerfile实践java项目

目的&#xff1a;用java项目测试dockerfil部署&#xff08;前提是安装好了docker&#xff09; 部署准备文件如下 1. java项目 java项目demo地址 https://gitee.com/xiaoqu_12/dockerfileDemo.git 或者百度网盘直接下载打包好的jar包 链接&#xff1a;https://pan.baidu.com/s/…

练习题(2024/5/8)

1 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;…

PotPlayer v1.7.22218 全格式影音播放器,无广绿色版!

软件介绍 PotPlayer是一款多功能且免费的媒体播放软件&#xff0c;兼容多种音频和视频格式。提供了丰富的功能性以及个性化设置&#xff0c;以迎合不同用户的需求。友好的用户界面&#xff0c;允许用户自定义皮肤和快捷键&#xff0c;提升了操作的便利性。 此外&#xff0c;Po…

Python练习(函数)

目录 6-1 使用函数求素数和 函数接口定义&#xff1a; 裁判测试程序样例&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 6-2 使用函数输出指定范围内Fibonacci数的个数 函数接口定义&#xff1a; 裁判测试程序样例&#xff1a; 输入样例&#xff1a; 输出样…

kali apt update报错

错误信息&#xff1a; 获取&#xff1a;http:/dl.google.com/几inux/chrome/.deb stable InRelease 错误&#xff1a;http:/dl.google.com/linux/chrome/deb stable InRelease 由于没有公钥&#xff0c;无法验证下列签名&#xff1a;NO_PUBKEY4EB27DB2A3B88B8B 命中&#xff1a…

【测试报告】星光日册

⭐ 作者&#xff1a;Jwenen &#x1f331; 作者主页&#xff1a;Jwenen的个人主页 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 测试报告 1. 项目介绍2. 测试用例框架3. 自动化测试源码 1. 项目介绍 “星光日册”项目实现了用…

2024年第七届人工智能和模式识别国际会议(AIPR 2024)即将召开!

2024年第七届人工智能和模式识别国际会议&#xff08;AIPR 2024)将于2024年9月20-22日在福建厦门市的华侨大学举行。探索AI边界&#xff0c;解锁识别新境界&#xff01;AIPR 2024旨在促进模式识别与机器学习, 计算机视觉与机器人视觉, 图像、语音、信号和视频处理等领域尖端成果…

【管理咨询宝藏95】SRM采购平台建设内部培训方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏95】SRM采购平台建设内部培训方案 【格式】PDF版本 【关键词】SRM采购、制造型企业转型、数字化转型 【核心观点】 - 重点是建设一个适应战略采…

C++基础理论学习

一、常量及符号 常量就是在程序运行过程中不可以改变的数值。例如&#xff0c;每个人的身份证号码就是一常量&#xff0c;是不能被更改的。常量可分为整型常量、浮点型常量、字符常量和字符串常量。 上面的代码通过com输出4行内容&#xff0c;cot是输出流&#xff0c;实现输出…

Comate,一款基于文心大模型的智能编程助手

一、官网 Baidu Comate官网 二、安装VSCode 如何下载安装VSCode 三、VSCode安装Comate 安装方式1 访问Comate官网点击 立即安装Comate插件 按钮快速安装 安装方式2 访问VSCode市场中的BaiduComate 点击 Install 按钮访问扩展详情界面 2.打开VSCode 3.安装Comate 四、…

嘉楠堪智 CanMV K230 进行 Linux、RT-smart 系统开发

本文记录学习、使用 K230 SDK 进行 Linux、RT-smart 系统的开发的一些关键步骤&#xff0c;如何获取系统源代码&#xff0c;如何配置环境&#xff0c;如何使用 Docker 进行编译&#xff0c;获得系统文件。 具体详细的教程&#xff0c;可以学习 CanMV K230 教程。 目录 一、S…

【C++之map的应用】

C学习笔记---021 C之map的应用1、map的简单介绍1.1、基本概念1.2、map基本特性 2、map的基本操作2.1、插入元素2.2、访问元素2.3、删除元素2.4、遍历map2.5、检查元素是否存在2.6、获取map的大小2.7、清空map2.8、基本样例 3、map的基础模拟实现4、测试用例4.1、插入和遍历4.2、…

学习笔记:IEEE 1003.13-2003(POSIX实时与嵌入式规范)

一、文档 在线参考&#xff1a; IEEE 1003.13-2003 免费下载Draft 版本&#xff08;pdf&#xff09;&#xff1a;IEEE Std. 1003.13 二、概念 1、POSIX标准 可移植操作系统接口&#xff08;英语&#xff1a;Portable Operating System Interface&#xff0c;缩写为POSIX&a…

Shell变成规范与变量

目录 1. Shell脚本 1.1 Shell脚本概述 1.2 Shell的作用 1.3 Shell脚本的构成 2. 重定向与管道操作 2.1 交互式硬件设备 ​ 2.2 重定向操作 3. shell变量 3.1 自定义变量 3.2 变量的作用范围​编辑 3.3 整数变量的运算 4. 环境变量 4.1 特殊的Shell变量 4.2 只读变…