Ansible——template模块

目录

基本参数

选项参数

高级参数

基本用法

示例: 

示例一:Nginx 配置

1. 目录结构

2. 模板文件:nginx.conf.j2

3. Playbook 文件:deploy_nginx.yml

4. 执行 Playbook

示例二:MySQL 配置

1. 目录结构

2. 模板文件:my.cnf.j2

3. Playbook 文件:deploy_mysql.yml

4. 执行 Playbook

示例三:动态生成 hosts 文件

1. 目录结构

2. 模板文件:hosts.j2

3. Playbook 文件:deploy_hosts.yml

4. 执行 Playbook


 

Ansible 的 template 模块用于将模板化的文件部署到远程主机。在模板文件中,我们可以使用 Jinja2 模板语言来动态生成配置文件,从而在部署过程中根据变量替换、循环和条件判断生成实际的配置文件。

 

基本参数

  • src:

    • 描述: 指定模板文件的路径(相对于 templates 目录)。
    • 示例: src: my_template.j2
  • dest:

    • 描述: 指定模板文件复制到远程主机的目标路径。
    • 示例: dest: /etc/myconfig.conf

选项参数

  • backup:

    • 描述: 如果目标文件已存在,则创建一个备份。
    • 类型: 布尔值
    • 默认值: no
    • 示例: backup: yes
  • force:

    • 描述: 如果目标文件已存在且内容相同,是否仍然覆盖它。
    • 类型: 布尔值
    • 默认值: yes
    • 示例: force: no
  • mode:

    • 描述: 设置目标文件的权限模式。
    • 类型: 字符串(八进制)
    • 示例: mode: '0644'
  • owner:

    • 描述: 设置目标文件的所有者。
    • 类型: 字符串
    • 示例: owner: root
  • group:

    • 描述: 设置目标文件的所有组。
    • 类型: 字符串
    • 示例: group: root
  • validate:

    • 描述: 在将模板复制到目标位置之前运行命令以验证文件的内容。变量 %s 表示临时文件的路径。
    • 类型: 字符串
    • 示例: validate: '/usr/sbin/nginx -t -c %s'

高级参数

  • setype:

    • 描述: 设置目标文件的 SELinux 类型。
    • 类型: 字符串
    • 示例: setype: httpd_config_t
  • seuser:

    • 描述: 设置目标文件的 SELinux 用户。
    • 类型: 字符串
    • 示例: seuser: system_u
  • serole:

    • 描述: 设置目标文件的 SELinux 角色。
    • 类型: 字符串
    • 示例: serole: object_r
  • selevel:

    • 描述: 设置目标文件的 SELinux 级别。
    • 类型: 字符串
    • 示例: selevel: s0

 

基本用法

template 模块的基本语法包括两个主要参数:

  • src: 模板文件的路径,一般以 .j2 为后缀。
  • dest: 目标文件的路径,即模板文件渲染后被复制到的远程主机上的路径。

 

示例: 

 假设我们有一个 Web 应用服务器组,需要配置不同的服务如 Nginx 和 MySQL。我们将通过 Ansible 的 template 模块来动态生成和分发这些服务的配置文件。

示例一:Nginx 配置
1. 目录结构

现在在ansible机器中去定义了nginx.conf.j2文件和deploy_nginx.yml剧本文件进行举例。

project/
├── templates/
│   └── nginx.conf.j2
└── deploy_nginx.yml

2. 模板文件:nginx.conf.j2

首先,我们需要创建模板文件 nginx.conf.j2,其内容如下:

server {# 监听80端口listen 80;# 定义服务器名称,这里使用变量 {{ server_name }}server_name {{ server_name }};location / {# 将请求代理到上游服务器,这里使用变量 {{ upstream }}proxy_pass http://{{ upstream }};# 设置主机头信息proxy_set_header Host $host;# 设置客户端真实IP地址proxy_set_header X-Real-IP $remote_addr;# 设置经过的代理服务器列表proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 设置请求的协议(HTTP 或 HTTPS)proxy_set_header X-Forwarded-Proto $scheme;}
}

这个文件定义了一个 Nginx 服务器块,其中 server_name 和 upstream 是变量,稍后会在 Playbook 中动态替换。

3. Playbook 文件:deploy_nginx.yml

然后,创建 Playbook 文件 deploy_nginx.yml,其内容如下:

---
- name: Deploy Nginx configuration  # Playbook 名称hosts: webservers  # 目标主机组vars:server_name: example.com  # 定义服务器名称变量upstream: 127.0.0.1:8080  # 定义上游服务器地址变量tasks:- name: Deploy nginx configuration from template  # 任务名称template:src: templates/nginx.conf.j2  # 指定模板文件路径(相对于 templates 目录)dest: /etc/nginx/nginx.conf  # 指定模板文件复制到远程主机的目标路径notify:  # 触发处理程序- reload nginx  # 通知 reload nginx 处理程序handlers:- name: reload nginx  # 处理程序名称service:name: nginx  # 服务名称state: reloaded  # 重载 Nginx 服务
  • hosts: webservers:指定任务将应用到名为 webservers 的主机组。
  • vars:定义模板中使用的变量 server_name 和 upstream
  • tasks:使用 template 模块将模板 nginx.conf.j2 渲染并复制到远程主机的 /etc/nginx/nginx.conf 位置。
  • notify:修改配置后通知 reload nginx 处理器重新加载 Nginx 服务。
  • handlers:定义处理器,在接收到通知时执行 Nginx 服务的重载操作。

4. 执行 Playbook

确保主机清单/etc/ansible/hosts已经定义了 webservers 主机组,然后执行以下命令运行 Playbook:

ansible-playbook deploy_nginx.yml

示例二:MySQL 配置

 

1. 目录结构

创建并编写的my.cnf.j2和deploy_mysql.yml文件在ansible机器中的位置。

project/
├── templates/
│   └── my.cnf.j2
└── deploy_mysql.yml

2. 模板文件:my.cnf.j2

接下来,创建模板文件 my.cnf.j2,其内容如下:

[mysqld]
# MySQL 服务器的用户
user = mysql# MySQL 服务器的 PID 文件位置
pid-file = /var/run/mysqld/mysqld.pid# MySQL 服务器的 Unix 套接字文件位置
socket = /var/run/mysqld/mysqld.sock# MySQL 服务器的端口
port = 3306# MySQL 数据库文件的存储目录
datadir = /var/lib/mysql# MySQL 服务器绑定的地址,可以使用变量 {{ mysql_bind_address }} 替换为实际值
bind-address = {{ mysql_bind_address }}

这个文件定义了 MySQL 的配置,其中 mysql_bind_address 是一个变量,会在 Playbook 中动态替换。

3. Playbook 文件:deploy_mysql.yml

然后创建 Playbook 文件 deploy_mysql.yml,其内容如下:

---
- name: Deploy MySQL configuration  # Playbook 名称hosts: dbservers  # 目标主机组vars:mysql_bind_address: 0.0.0.0  # 定义 MySQL 绑定地址变量tasks:- name: Deploy my.cnf from template  # 任务名称template:src: templates/my.cnf.j2  # 指定模板文件路径(相对于 templates 目录)dest: /etc/mysql/my.cnf  # 指定模板文件复制到远程主机的目标路径notify:  # 触发处理程序- restart mysql  # 通知 restart mysql 处理程序handlers:- name: restart mysql  # 处理程序名称service:name: mysql  # 服务名称state: restarted  # 重启 MySQL 服务

  • hosts: dbservers:指定任务将应用到名为 dbservers 的主机组。
  • vars:定义模板中使用的变量 mysql_bind_address
  • tasks:使用 template 模块将模板 my.cnf.j2 渲染并复制到远程主机的 /etc/mysql/my.cnf 位置。
  • notify:修改配置后通知 restart mysql 处理器重新启动 MySQL 服务。
  • handlers:定义处理器,在接收到通知时执行 MySQL 服务的重启操作。

4. 执行 Playbook

确保在主机清单中已经定义了 dbservers 主机组,然后执行以下命令运行 Playbook:

ansible-playbook deploy_mysql.yml

示例三:动态生成 hosts 文件

动态生成 /etc/hosts 文件有许多实际应用场景,特别是在网络管理和自动化部署中,它能极大地简化运维管理,提高资源利用效率。

1. 目录结构
project/
├── templates/
│   └── hosts.j2
└── deploy_hosts.yml

2. 模板文件:hosts.j2

接下来,创建模板文件 hosts.j2,其内容如下:

{% for host in hosts %}
{{ host.ip }} {{ host.name }}
{% endfor %}

这个文件定义了 /etc/hosts 文件的模板,使用变量 hosts 动态生成内容。这是一个 Jinja2 for 循环语句,开始循环遍历变量 hostshosts 是一个列表,其中每个元素是一个包含 ipname 键的字典。

3. Playbook 文件:deploy_hosts.yml

然后,创建 Playbook 文件 deploy_hosts.yml,其内容如下:

---
- name: Deploy /etc/hosts file  # Playbook 名称hosts: all  # 目标主机组,指定该 Playbook 应用到所有主机vars:hosts:  # 定义 hosts 变量,包括主机名称和 IP 地址的列表- { name: 'host1', ip: '192.168.1.2' }  # 定义主机1的信息- { name: 'host2', ip: '192.168.1.3' }  # 定义主机2的信息- { name: 'host3', ip: '192.168.1.4' }  # 定义主机3的信息tasks:- name: Deploy /etc/hosts from template  # 任务名称template:src: templates/hosts.j2  # 指定模板文件路径(相对于 templates 目录)dest: /etc/hosts  # 指定模板文件复制到远程主机的目标路径
  • hosts: all:指定任务将应用到所有主机。
  • vars:定义模板中使用的变量 hosts 列表。
  • tasks:使用 template 模块将模板 hosts.j2 渲染并复制到远程主机的 /etc/hosts 位置。

4. 执行 Playbook

确保主机清单文件里已经定义了相关的主机组,然后执行以下命令运行 Playbook:

ansible-playbook deploy_hosts.yml

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

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

相关文章

LLM大语言模型(GPT)的分布式预训练与微调及部署

LLM大语言模型(GPT)的分布式预训练与微调及部署 实现方案:设计并实现了一个大规模语言模型(GPT)的分布式预训练,结合RAG(文档、MySQL)、Agent、LLM连网等技术在基座上微调,以提高模型在特定领域任务上的性能和效率。 …

函数(下) C语言

函数下 嵌套调用和链式访问1. 嵌套调用2. 链式访问 函数的声明和定义1. 单个文件2. 多个文件3. static 和 extern3.1 static 嵌套调用和链式访问 1. 嵌套调用 嵌套调用就是函数之间的互相调用,每个函数就像⼀个乐高零件,正是因为多个乐高的零件互相无缝…

Nginx缓存之代理缓存配置

Nginx 的缓存功能是集成在代理模块中的,当启用缓存功能时,Nginx 将请求返回的响应数据持久化在服务器磁盘中,响应数据缓存的相关元数据、有效期及缓存内容等信息将被存储在定义的共享内存中。当收到客户端请求时,Nginx 会在共享内…

十四、 组合数学

人们在生活中经常会遇到排列组合问题。比如说:在 5 5 5个礼物中选 2 2 2个,问有多少种选取方法? 组合数学就是研究一个集合内满足一定规则的排列问题。这类问题如下: 存在问题:即判断这些排列是否存在计数问题&#x…

Java中的封装、继承和多态的概念是什么?

封装 封装是面向对象编程的一个核心概念,它涉及到隐藏对象的属性和实现细节,只对外公开接口,控制在程序中属性的读和修改的访问级别。封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外…

当同时绑定mousedown和mouseup时,不执行mouseup

问题描述: 当我同时给一个标签添加mousedown和mouseup两个鼠标事件,点击span的时候会触发mousedown事件,但是不会执行mouseup事件;但是注释图二中的setCloudControl方法又能触发mouseup。 后来查阅资料,发现是在封装a…

[算法刷题积累] 两数之和以及进阶引用

两数之和很经典,通常对于首先想到的就是暴力的求解,当然这没有问题,但是我们如果想要追求更优秀算法,就需要去实现更加简便的复杂度。 这里就要提到我们的哈希表法: 我们可以使用unordered_map去实现,也可以根据题目&a…

【Gradio】Chatbots 如何用 Gradio 创建聊天机器人

Creating A Chatbot Fast 简介 聊天机器人是大型语言模型的一个流行应用。使用 gradio ,您可以轻松构建您的聊天机器人模型的演示,并与您的用户分享,或者使用直观的聊天机器人用户界面自己尝试。 本教程使用 gr.ChatInterface() ,…

Lua优化技巧

常见的Lua优化小技巧 Lua常见优化点:1. 尽量使用局部变量2. table的相关减少对表的访问for循环预分配表空间元表 3. string的相关4. 避免运行时加载编译5. 尽量避免频繁创建临时对象闭包表 Lua常见优化点: 1. 尽量使用局部变量 尽量将变量局部化&#x…

SiGILP是什么?

SiGILP是什么? SiGILP(Simultaneous Generative and Interpretive Language Processing,中文:同时生成和解释语言处理)是一种先进的多模态模型。简单来说,SiGILP可以同时理解和生成多模态数据,…

SpringMVC系列四: Rest-优雅的url请求风格

Rest请求 💞Rest基本介绍💞Rest风格的url-完成增删改查需求说明代码实现HiddenHttpMethodFilter机制注意事项和细节 💞课后作业 上一讲, 我们学习的是SpringMVC系列三: Postman(接口测试工具) 现在打开springmvc项目 💞Rest基本介…

基于Spark3.3.4版本,实现Standalone 模式高可用集群部署

目录 一、环境描述 二、部署Spark 节点 2.1 下载资源包 2.2 解压 2.3 配置 2.3.1 配置环境变量 2.3.2 修改workers配置文件 2.3.3 修改spark.env.sh文件 2.3.4 修改spark-defaults.conf 2.4 分发 2.5 启动服务 2.5.1 启动zookeeper 2.5.2 启动hdfs 2.5.3 启动spar…

归并排序 (递归实+非递归)

前言 归并排序是一种逻辑很简单,但是实现有点难度的排序,尤其是非递归,对于区间的把握更是需要一点逻辑的推导,但是没有关系,轻松拿捏 归并排序gif 归并排序单趟实现 1,创建tmp数组, 2&#xff…

javaWeb项目-在线考试系统详细功能介绍

项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog 1、Java简介 Java语…

「Qt Widget中文示例指南」如何实现一个滑动条(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 滑动条示例展示了如…

轻轻松松上手的LangChain学习说明书

本文为笔者学习LangChain时对官方文档以及一系列资料进行一些总结~覆盖对Langchain的核心六大模块的理解与核心使用方法,全文篇幅较长,共计50000字,可先码住辅助用于学习Langchain。 一、Langchain是什么? 如今各类AI…

昇思25天学习打卡营第1天|快速入门

学AI还能赢奖品?每天30分钟,25天打通AI任督二脉 (qq.com) 本节通过MindSpore的API来快速实现一个简单的深度学习模型。若想要深入了解MindSpore的使用方法,请参阅各节最后提供的参考链接。 import mindspore from mindspore import nn from …

项目训练营第一天

项目训练营第一天 springboot后端环境搭建 1、首先需要找文章下载好tomcat、JDK、maven、mysql、IDEA。(软件下载及环境变量配置略) 2、在下载好的IDEA中,选择新建spring initial项目,选定java web,即可新建一个spri…

从Manifest V2到V3:Chrome扩展后台脚本不完全指南,background.js的运行机制

背景 最近我在接触Chrome插件开发,发现后台脚本(background script)非常有趣。在开发过程中,我思考了关于这个脚本的三个问题,希望大家也能分享一下见解: background.js 在什么时候运行?backg…

模块的加载机制

模块的加载机制是编程中一个重要的概念,它涉及到在运行时将模块(可以是独立的源代码文件或预编译的二进制文件)引入到程序中的过程。 模块查找: 加载机制首先会根据程序中引用的模块名称进行查找。在Node.js中,对于自…