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.80

HTTP端口配置: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: firewalld
    service: name=firewalld state=stopped
#关闭防火墙服务firewalld,以便HTTP服务可以无障碍地接收外部请求。
  - name: install httpd
      yum: name={{package}}
#使用YUM包管理器安装package定义的变量名的服务

  - name: config
    template: 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_path
    file: path=/data/html/ state=directory
#确保/data/html/目录存在,用于存放网页文件。

  - name: start httpd
    service: name=httpd state=started
#启动httpd服务。

  - name: index01
    copy: src=/opt/index.html dest=/data/html/
    when: ansible_default_ipv4.address == '192.168.83.80'
  - name: index02
    copy: 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 httpd
    service: 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_server
  hosts: web
  tasks:
    - name:
      file: path=/opt/test/ state=directory
      tags:
        - dir   #设置标签名称为dir
    - name:
      file: path=/opt/test01/ state=directory
      tags:
        - dira  #设置标签名称为dira
    - name:
      file: path=/opt/test02/ state=directory
      tags:
        - 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 epel
  yum: name={{epel}}      #调用vars中定义的变量,下载epel源
- name: install nginx
  yum: name={{package}} state=latest   #下载nginx服务
- name: start nginx
  service: 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 mariadb
  yum: name={{package}} state=latest
- name: start mariadb
  service: 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 php
  yum: name={{package}} state=latest
- name: start php-fpm
  service: enabled=true name={{server}} state=started

3.调用角色模块

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

4.执行模块

远端主机查看是否安装

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

stm32_RTC_2_HAL——stm32CudeMX

介绍 RTC&#xff08;实时时钟&#xff09;不仅仅提供计数功能&#xff0c;它是一个完整的时钟和日历模块&#xff0c;用于提供日期和时间信息。RTC 能够提供年、月、日、星期、时、分、秒等时间信息&#xff0c;并且通常具有闹钟功能&#xff0c;可以用于定时唤醒或触发事件。…

Qt | QLineEdit 类(行编辑器)

01、上节回顾 Qt | QComboBox(组合框)02、QLineEdit 1、QLineEdit 类是 QWidget 类的直接子类,该类实现了一个单行的 输入部件,即行编辑器,见右图 2、验证器(QValidator 类)和输入掩码简介:主要作用是验证用户输入的字符是否符合验证器 的要求,即限制对用户的输入,比…

详细介绍ARM-ORACLE Database 19c数据库下载

目录 1. 前言 2. 获取方式 2.1 ORACLE专栏 2.2 ORACLE下载站点 1. 前言 现有网络上已有非常多关于ORACLE数据库机下载的介绍&#xff0c;但对于ARM平台的介绍不多&#xff0c;借此机会我将该版的下载步骤做如下说明&#xff0c;希望能够一些不明之人提供帮助和参考 2. 获…

【STM32G474】利用Cpp编写STM32代码后,Cubemx修改配置后代码报错147个error,如何处理?

问题描述 打开Cubemx&#xff0c;添加TIM7用于定时器精准延时&#xff0c;生成代码后&#xff0c;Keil提示有147个error。 之前是Cubemx是没有问题的&#xff0c;是利用Cpp编写stm32&#xff08;将Keil改为Version6&#xff09;后才导致Cubemx配置失败&#xff1a; debug成功…

[学习笔记]CyberDog小米机器狗 开发学习

1、机器狗本身是UbuntuROS2系统 2、控制机器人只需要了解lcm和Ros topic通讯 3、传感器数据&#xff08;包括一些imu(/imu)、激光雷达(/scan)&#xff09;会进行topic的一个广播。 仿真环境通信接口&#xff1a; -命令输入(见后续运控说明) 运控lcm数据接口 Motion man…

Gmail邮箱怎么注册?2024年完整指南(包含跳过手机号验证)

一、为什么要注册Gmail邮箱&#xff1f; 全球通用性&#xff1a;Gmail是一个全球性的邮件服务平台&#xff0c;被广泛认可和信赖。因为客户对于Gmail的接受度高&#xff0c;无需担心邮件被自动标记为垃圾邮件。 整合营销工具&#xff1a;通过Gmail账号&#xff0c;你可以轻松…

CleanMyMac X 4.15.3 版本发布

CleanMyMac X 4.15.3 版本发布&#xff0c;一款苹果 macOS 系统好用的伴侣软件&#xff0c;其包含 1.一键深度清理。2.系统垃圾专清。3.大/旧文件专清。4.系统提速。5.性能悬浮窗。6.恶意软件防护。7.隐私保护。8.软件卸载器。9.软件更新器等 9 大功能&#xff0c;为您的苹果电…

Flask-HTTP请求、响应、上下文、进阶实验

本节主要目录如下&#xff1a; 一、请求响应循环 二、HTTP请求 2.1、请求报文 2.2、Request对象 2.3、在Flask中处理请求 2.4、请求钩子 三、HTTP响应 3.1、响应报文 3.2、在Flask中生成响应 3.3、响应格式 3.4、Cookie 3.5、session&#xff1a;安全的Cookie 四、…

[公开课学习]台大李宏毅-自注意力机制 Transformer

自注意力机制 存在一些问题&#xff0c;将vector set/sequence作为input&#xff0c;例如&#xff1a; 文字处理&#xff1a;将文字用one-hot表示&#xff0c;或者向量空间的向量表示&#xff0c;然后进行翻译任务等语音处理&#xff1a;25ms音频作为一个向量&#xff0c;10m…

初识C++ · 模板初阶

目录 1 泛型编程 2 函数模板 3 类模板 1 泛型编程 模板是泛型编程的基础&#xff0c;泛型我们碰到过多次了&#xff0c;比如malloc函数返回的就是泛型指针&#xff0c;需要我们强转。 既然是泛型编程&#xff0c;也就是说我们可以通过一个样例来解决类似的问题&#xff0c…

pytorch基础: torch.unbind()

1. torch.unbind 作用 说明&#xff1a;移除指定维后&#xff0c;返回一个元组&#xff0c;包含了沿着指定维切片后的各个切片。 参数&#xff1a; tensor(Tensor) – 输入张量dim(int) – 删除的维度 2. 案例 案例1 x torch.rand(1,80,3,360,360)y x.unbind(dim2)print(&…

gitlab集群高可用架构拆分部署

目录 前言 负载均衡器准备 外部负载均衡器 内部负载均衡器 (可选)Consul服务 Postgresql拆分 1.准备postgresql集群 手动安装postgresql插件 2./etc/gitlab/gitlab.rb配置 3.生效配置文件 Redis拆分 1./etc/gitlab/gitlab.rb配置 2.生效配置文件 Gitaly拆分 1.…

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

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

60、郑州大学附属肿瘤医院 :用于预测胃癌患者术后生存的深度学习模型的开发和验证[同学,我们的人生应当是旷野]

馒头老师要说的话&#xff1a; 我近期看了一下北京的脑机公司&#xff0c;大概是我之前对这一行业太过于乐观&#xff0c;北京的BCI公司和研究所&#xff0c;比上海、深圳、杭州甚至是重庆都要少&#xff0c;门槛也要高很多。也有我自己的原因&#xff0c;有时站的太高&#x…

92、动态规划-最小路径和

思路&#xff1a; 还是一样&#xff0c;先使用递归来接&#xff0c;无非是向右和向下&#xff0c;然后得到两种方式进行比较&#xff0c;代码如下&#xff1a; public int minPathSum(int[][] grid) {return calculate(grid, 0, 0);}private int calculate(int[][] grid, int …

ubuntu_Docker安装配置

什么是docker? Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有…

为什么要梯度累积

文章目录 梯度累积什么是梯度累积如何理解理解梯度累积梯度累积的工作原理 梯度累积的数学原理梯度累积过程如何实现梯度累积 梯度累积的可视化 梯度累积 什么是梯度累积 随着深度学习模型变得越来越复杂&#xff0c;模型的训练通常需要更多的计算资源&#xff0c;特别是在训…

深度学习笔记_10YOLOv8系列自定义数据集实验

1、mydaya.yaml 配置方法 # 这里分别指向你训练、验证、测试的文件地址&#xff0c;只需要指向图片的文件夹即可。但是要注意图片和labels名称要对应 # 训练集、测试集、验证机文件路径&#xff0c;可以是分类好的TXT文件&#xff0c;也可以直接是图片文件夹路径 train: # t…

Litedram仿真验证(四):AXI接口完成板级DDR3读写测试(FPGA-Artix7)

目录 日常唠嗑一、仿真中遗留的问题二、板级测试三、工程获取及交流 日常唠嗑 接上一篇Litedram仿真验证&#xff08;三&#xff09;&#xff1a;AXI接口完成仿真&#xff08;FPGA/Modelsim&#xff09;之后&#xff0c;本篇对仿真后的工程进行板级验证。 本次板级验证用到的开…

学成在线 - 第3章任务补偿机制实现 + 分块文件清理

7.9 额外实现 7.9.1 任务补偿机制 问题&#xff1a;如果有线程抢占了某个视频的处理任务&#xff0c;如果线程处理过程中挂掉了&#xff0c;该视频的状态将会一直是处理中&#xff0c;其它线程将无法处理&#xff0c;这个问题需要用补偿机制。 单独启动一个任务找到待处理任…
最新文章