小阿轩yx-案例:Ansible剧本文件实践
小阿轩yx-案例:Ansible剧本文件实践
Playbook 介绍
什么是 playbook
- playbook 顾名思义,即剧本,现实生活中演员按照剧本表演
- 在 ansible 中,由被控计算机表演,进行安装,部署应用,提供对外的服务等,以及组织计算机处理各种各样的事情。
- playbook 是 ansible 用于配置,部署,和管理节点的剧本通过 playbook 的详细描述,执行其中的一些列 tasks,可以让远端的主机达到预期的状态。
- playbook 就像 ansible 控制器给被控节点列出的一系列 to-do-list,而且被控节点必须要完成。
Ansible play 使用场景
- 执行一些简单的任务,使用 ad-hoc 命令可以方便的解决问题,但有时一个设施过于复杂,需要大量的操作的时,执行的 ad-hoc 命令是不合适的,这时候最好使用 playbook。
- 就像执行 shell 命令与写 shell 脚本一样,也可以理解为批处理任务,不过 playbook 有自己的语法格式使用 playbook 可以方便的重复使用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。
- 使用 Ansible 的过程中,会发现,处理的大部分操作都是编写playbook。
- 可以把常见的应用都编写为 playbook,之后管理服务器会变得很简单。
Playbook 的组成
- 由一个或多个 “play” 组成的列表
主要功能
- 通过将 task 定义好的角色归并为组进行统一管理
- 也就是通过 Task 调用 Ansible 的模板将多个 “play” 组织在一个 Playbook 中运行
Playbook 本身由下面几部分组成
- Tasks:任务,即调用模块完成的某操作;
- Variables:变量;
- Templates:模板;
- Handlers:处理器,某条件满足时,触发执行的操作;
- Roles:角色。
恢复上一章 Ansible 部署的快照
Playbook 的简单示例
[root@ansible-node1 ~]# vi a.yml
---
- hosts: webremote user:roottasks :- name: create useruser:name: zhangsanpassword: "{{ 'aptech' | password_hash('sha512') }}"state: presenttags:- CCC
...
执行 playbook,进行语法检查
[root@ansible-node1 ~]# ansible-playbook --syntax-check a.yml
预测试
[root@ansible-node1 ~]# ansible-playbook -C a.ym1
列出主机
[root@ansible-node1 ~]# ansible-playbook --list-hosts a.yml
列出任务
[root@ansible-node1 ~]# ansible-playbook --list-tasks a.yml
列出标签
[root@ansible-node1 ~]# ansible-playbook --list-tags a.yml
执行任务
[root@ansible-node1 ~]# ansible-playbook a.yml
Hosts 和 Users 介绍
Playbook 的设计目的
- 为了让某个或某些主机以某个用户身份去执行完成相应的任务。
- 用于指定要执行指定任务的主机用 hosts 定义,可以是一个也可以是由冒号分隔的多个主机组;
- 用于指定被管理主机上执行任务的用户用 remote user 来定义
如示例所示
- hosts: webremote_user: zhangsan
remote_user 也可定义指定用户通过 sudo 的方法在被管理主机上运行指令, 甚至可以在使用sudo 时用 sudo user 指定 sudo 切换的用户。
[root@ansible-node1 ~]# vim b.yaml
---
- hosts: webremote_user: zhangsantasks:- name: test connectionping:
...
远程连接拷贝
[root@ansible-node1 ~]# ssh-copy-id zhangsan@192.168.10.102
执行
[root@ansible-node1 ~]# ansible-playbook b.yaml
任务列表和 action 介绍
- “Play” 的主体是任务列表(Tasks list)。
- 任务列表中的任务按照次序逐个在 hosts 中指定的所有主机上执行,在顺序执行这些任务时,如果发生错误会将所有已执行任务回滚。
- 因此,需要在更正 Playbook 中的错误后重新执行这些任务。
Task 的任务
- 按照指定的参数去执行模块。
- 每个 task 使用 name 输出 Playbook 的运行结果一般输出内容为描述该任务执行的步骤。
- 如果没有提供将输出 action 的运行结果。
- 定义 task 的格式可以用 “action:module options” 或 “module:options” 都可,其中后者可以实现向后兼容。
- 如果 action 的内容过多,可在行首使用空白字符进行换行。
[root@ansible-node1 ~]# vi a.yml
---
- hosts: webremote_user: roottasks:- name: create usenuser:name: zhangsanpassword: "{{ 'aptech' | password_hash('sha512') }}"state: presenttags:
- hosts: dbremote_user: roottasks:- name: copy file to webcopy: src=/etc/passwd dest=/opttags:- ddd
...
- - hosts: db
- remote_user: root
- tasks:
- - name: copy file to web
- copy: src=/etc/passwd dest=/opt
- tags:
- - ddd
执行
[root@ansible-node1 ~]# ansible-playbook a.yml
- 如果多次执行修改的 Playbook 时,涉及到一些没有变化的代码,可以使用 tages 让用户选择跳过没有变化代码,只运行 Playbook 中发生变化的部分代码。
- 可以在 Paybook 中为某个或某些任务定义 “标签”,在执行此 Playbook 时通过 ansible-playbook 命令的 --tags 选项能实现仅运行指定的 tasks 而非所有的 tasks。
Handlers 介绍
- Handlers 用于当关注的资源发生变化时所采取的操作。
- 在 notify 中列出的操作便称为 handler,也就是 notify 中需要调用 handler 中定义的操作。
- 而 notify 这个动作用于在每个 “play” 的最后被触发,仅在所有的变化发生完成后一次性地执行指定操作。
拷贝模板文件为 /etc/foo.conf 文件时,重新启动 memcached 和 apache 服务
创建 conf 目录
[root@ansible-node1 ~]# mkdir conf
安装 httpd
[root@ansible-node1 ~]# yum -y install httpd
拷贝文件到指定目录下
[root@ansible-node1 ~]# cp /etc/httpd/conf/httpd.conf conf
修改配置文件
[root@ansible-node1 ~]# vim conf/httpd.conf
Listen 8080 //修改端口号
编写配置文件
[root@ansible-node1 ~]# vim a.yml
- host: webremote_user: roottasks:- name: install httpd packageyum: name=httpd state=latest- name: install configuration file or httpdcopy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf- name: start httpd serviceservice: enabled=true name=httpd state=started
执行
[root@ansible-node1 ~]# ansible-playbook a.yml
登录被管理主机 ansible-node2
[root@ansible-node2 ~]# rpm -qa httpd
查看执行结果
[root@ansible-node2 ~]# grep "Listen" /etc/httpd/conf/httpd.conf | grep -v "#"
查看状态
[root@ansible-node2 ~]# systemctl status httpd
设置 handlers
- 如果配置文件有改动
- 如:Apache 端口号改变,则需要定义 notify 和 handlers,触发更新相关执行操作。
修改端口号
[root@ansible-node1 ~]# vim conf/httpd.conf
Listen 808
编写文件
[root@ansible-node1 ~]# vim b.yml
---
- hosts: webremote_user: roottasks:- name: change portcopy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.confnotify:- restart httpd serverhandlers:- name: restart httpd serverservice: name=httpd state=restarted
...
执行
[root@ansible-node1 ~]# ansible-playbook b.yml
node2 上要关闭 selinux,否则,同步配置会出错
登录被管理主机 ansible-node2 进行查看
[root@ansible-node2 ~]# netstat -anpt | grep httpd
Templates 介绍
- Jinja 是基于 Python 的模板引擎。
- Template 类似 Jinja 的另一个重要组件,可以看作是一个编译过的模板文件。
- 用来产生目标文本,传递 Python 的变量给模板去替换模板中的标记。
创建 templates 目录
[root@ansible-node1 ~]# mkdir templates
拷贝文件到指定目录下
[root@ansible-node1 ~]# cp conf/httpd.conf templates/httpd.conf.j2
创建模板文件
[root@ansible-node1 ~]# vim templates/httpd.conf.j2
Listen {{ http_port }}
ServerName {{ ansible_fqdn }}
为远程主机添加变量
[root@ansible-node1 ~]# vim /etc/ansible/hosts
[web]
192.168.10.102 http_port=8888
[db]
192.168.10.103
- http_port=8888
编写 playbook 文件
[root@ansible-node1 ~]# vim apache.yml
- hosts: webremote_user: rootvars:- package: httpd- service: httpdtasks:- name: install httpd packageyum: name={{ package }} state=latest- name: install configuration file for httpdtemplate: src=/root/templates/httpd.conf,i2 dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: start httpd serviceservice: enabled=true name={{ service }} state=startedhandlers:- name: restart httpdservice: name={{ service }} state=restarted
- - restart httpd
- - name: restart httpd
执行
[root@ansible-node1 ~]# ansible-playbook apache.yml
登录被管理主机 ansible-node2, 执行查看命令
[root@ansible-node2 ~]# grep -i listen /etc/httpd/conf/httpd.conf | grep -v "#"
[root@ansible-node2 ~]# grep -i servername /etc/httpd/conf/httpd.conf | grep -v "#"
Roles 介绍
什么是 Roles
- Ansible 为了层次化、结构化地组织 Playbook,使用了角色(roles),可以根据层次结构自动装载变量文件、tasks 以及 handlers 等。
- 只需要在 Playbook 中使用 include 指令便可使用 roles。
- 简单来讲, roles 就是分别将变量、文件、任务、模块及处理器设置于单独的目录中,便捷地使用它们。
利用 Roles 部署 mariadb
被管理主机配置 yum 源
配置数据库角色
[root@node1 ~]# mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
mkdir: 已创建目录 "/etc/ansible/roles/mariadb"
mkdir: 已创建目录 "/etc/ansible/roles/mariadb/files"
mkdir: 已创建目录 "/etc/ansible/roles/mariadb/tasks"
mkdir: 已创建目录 "/etc/ansible/roles/mariadb/handlers"
进入 tasks 目录
[root@node1 ~]# cd /etc/ansible/roles/mariadb/tasks/
编写主文件
[root@nodel tasks]# vi main.yml
---
- name: install mariadbyum: name=mariadb-server state=present
- name: install MySOL-pythonyum: name=MySOL-python state=present
- name: move config mariadbshell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
- name: provide a new config filecopy: src=my.cnf dest=/etc/my.cnf
- name: reload mariadbshell: systemctl restart mariadb
- name: create database testdbshell: mysql -u roote -e "create database testdb;grant all on testdb.* to test'@'192.168.10.%' identified by 'test123';flush privileges;notify:- restart mariadb
...
切换至 handlers 目录
[root@node1 tasks]# cd /etc/ansible/roles/mariadb/handlers
编写触发器文件
[root@localhost handlers]# vi main.yml
---
- name:restart mariadbservice: name=mariadb state=restarted
...
切换至 files 目录
[root@nodel tasks]# cd /etc/ansible/roles/mariadb/files
查看
[root@node1 files]# ls
my.cnf ##将编辑好的 my.cnf 文件拷贝在此处
切换至 ansible 目录
[root@node1 files]# cd /etc/ansible
编写角色文件
[root@nodel ansible]# vi mariadb.yml
---
- hosts: dbremote_user: rootroles:- mariadb
...
测试角色文件
[root@nodel ansible]# ansible-playbook --syntax-check mariadb.yml
执行 yml 文件
[root@nodel ansible]# ansible-playbook mariadb.yml
检查远程服务器上数据库
- 查看数据库信息,看看有没有创建制定的数据库
利用 Ansible 管理数据库
用 ansible 查看数据库
[root@localhost ~]# ansible db -m shell -a 'mysql -u root -e "show databases;"'
192.168.10.103 | SUCCESS >> Database
information_schema
mysql
performance_schema
test
testdb
创建账户并授权
[root@localhost ~]# ansible db -m yum -a "name=MySQL-python state=present"
[root@localhost ~]# ansible db -m mysql_user -a "name=zhangsan password=pwd123 host=192.168.10.% priv=*.*:ALL"
[root@localhost ~]# ansible db -m mysql_user -a "name=lisi password=pwd123 priv=*.*:ALL"
- 张三能够远程登录,但李四不能
- 要想使用 mysql_user 模块,需要在客户端安装MySQL-python,安装时注意大小写
为老用户授权(语法和创建用户并授权的语法是相同的)
[root@localhost ~]# ansible db -m mysql_user -a "name=root password=pwd123 host=192.168.10.% priv=*.*:ALL"
小阿轩yx-案例:Ansible剧本文件实践
相关文章:
小阿轩yx-案例:Ansible剧本文件实践
小阿轩yx-案例:Ansible剧本文件实践 Playbook 介绍 什么是 playbook playbook 顾名思义,即剧本,现实生活中演员按照剧本表演在 ansible 中,由被控计算机表演,进行安装,部署应用,提供对外的服…...
【ShuQiHere】深入理解微架构(Microarchitecture):LC-3 的底层实现 ️
【ShuQiHere】🖥️ 微架构(Microarchitecture) 是计算机体系结构中的重要概念,它定义了如何将 指令集架构(Instruction Set Architecture, ISA) 转化为实际硬件。通过微架构,我们可以理解计算机…...
Ubuntu24.04.1系统下VideoMamba环境配置
文章目录 前言第一步:基本的环境创建第二步:causal-conv1d和mamba_ssm库的安装第三步:安装requirements.txt 前言 VideoMamba环境的配置折磨了我三天,由于Mamba对Cuda的版本有要求,因此配置环境的时候Cuda版本以及各种…...

c++第十二章续(队列结构类模拟)
队列类 设计类,需要开发公有接口和私有实现 Queue类接口 公有接口: 默认初始化,和可以用显式初始化覆盖默认值 Queue类的实现 如何表示队列数据: 一种方法是使用new动态分配一个数组,它包含所需的元素数。不过&…...

数据集-目标检测系列-豹子 猎豹 检测数据集 leopard>> DataBall
数据集-目标检测系列-豹子 猎豹 检测数据集 leopard>> DataBall 数据集-目标检测系列-豹子 猎豹 检测数据集 leopard 数据量:5k 想要进一步了解,请联系。 DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集&#x…...

基于ESP8266—AT指令连接阿里云+MQTT透传数据(3)
MQTT_RX设备为接收(订阅)数据的Topic,使用ESP8266通过AT指令实现。 首先需要串口通信软件,如 SSCOM、PuTTY、SecureCRT 等串口调试工具,功能丰富,支持常见的串口调试功能,用于发送AT指令。 以下是ESP8266通过AT指令连接阿里云MQTT服务的步骤: 1、初始化WiFi 发送下面…...

redis的数据结构,内存处理,缓存问题
redisObject redis任意数据的key和value都会被封装为一个RedisObject,也叫redis对象: 这就redis的头信息,占有16个字节 redis中有两个热门数据结构 1.SkipList,跳表,首先是链表,和普通链表有以下差异&am…...
机器学习模型评估与选择
前言 承接上篇讲述了机器学习有哪些常见的模型算法,以及使用的场景,本篇将继续讲述如何选择模型和评估模型。几个概念了解一下: 经验误差:模型在训练集上的误差称之为经验误差;过拟合:模型在训练集上表现…...

Web认识 -- 第一课
文章目录 前言一、HTML是什么?二、了解Web1. 基本概念2.Web标准3. Web构成1.前端1. HTML2.CSS3. javaScript4.常见浏览器介绍 2.Web标签构成1.结构标准2.表现标准 -- css3. 行为标准 -- javaScript 总结 前言 这里是我们进入前端学习的开端,在本次更新之后我会陆续…...

Recaptcha2 图像识别 API 对接说明
Recaptcha2 图像识别 API 对接说明 本文将介绍一种 Recaptcha2 图像识别2 API 对接说明,它可以通过用户输入识别的内容和 Recaptcha2验证码图像,最后返回需要点击的小图像的坐标,完成验证。 接下来介绍下 Recaptcha2 图像识别 API 的对接说…...
6种MySQL高可用方案对比分析
大家好,我是 V 哥,关于 MySQL 高可用方案,在面试中频频出现,有同学在字节面试就遇到过,主要考察你在高可用项目中是如何应用的,V 哥整理了6种方案,供你参考。 MySQL的高可用方案有多种…...
FastAPI: websocket的用法及举例
1. Websocket 1.1 Websocket介绍 WebSocket 是一种在单个TCP连接上进行全双工通信的协议,允许客户端和服务器之间相互发送数据,而不需要像传统的HTTP请求-响应模型那样频繁建立和断开连接。 全双工通信(Full-Duplex Communication)是一种通信模式&#…...

JavaSE——面向对象2:方法的调用机制、传参机制、方法递归、方法重载、可变参数、作用域
目录 一、成员方法 (一)方法的快速入门 (二)方法的调用机制(重要) (三)方法的定义 (四)注意事项和使用细节 1.访问修饰符(作用是控制方法的使用范围) 2.返回的数据类型 3.方法名 4.形参列表 5.方法体 6.方法调用细节说明 (五)传参机制 1.基本数据类型的传参机制 …...
Vue+Flask
App.vue 首先要安装 npm install axios<template><div><h1>{{ message }}</h1><input v-model"name" placeholder"Enter your name" /><input v-model"age" placeholder"Enter your age" /><…...
深入剖析 Android Lifecycle:构建高效稳定的应用
在 Android 开发中,管理应用组件的生命周期是至关重要的。正确处理生命周期事件可以确保应用的性能、稳定性和用户体验。Android Framework 提供了一系列的机制来管理应用组件的生命周期,而android.arch.lifecycle库则为我们提供了更简洁、更灵活的方式来…...

ElasticSearch分词器、相关性详解与聚合查询实战
目录 1. ES分词器详解 1.1 基本概念 1.2 分词发生时期 1.3 分词器的组成 切词器:Tokenizer 词项过滤器:Token Filter 字符过滤器:Character Filter 1.4 倒排索引的数据结构 2. 相关性详解 2.1 什么是相关性(Relevance&am…...
删除二叉树中以x为根节点的子树(包括根结点)
已知二叉树以二叉链表存储,编写算法完成:对于树中每个元素值为x的结点,删除以它为根的子树,并释放相应的空间。 思想: 删除二叉树采用后序遍历。先删除左子树,然后右子树,最后根。 利用层次遍…...

Netty 与 WebSocket之间的关系
WebSocketProtocolHandler 和 Netty 在处理 WebSocket 连接时扮演不同的角色,但它们通常是一起使用的,尤其是在基于 Netty 的项目中。为了更好地理解它们之间的区别,我们首先需要了解 WebSocket 和 Netty 的基本概念。 WebSocket WebSocket…...

通信工程学习:什么是CSMA/CA载波监听多路访问/冲突避免
CSMA/CA:载波监听多路访问/冲突避免 CSMA/CA(Carrier Sense Multiple Access/Collision Avoidance),即载波监听多路访问/冲突避免,是一种用于数据传输时避免各站点之间冲突的算法,尤其适用于无线局域网&…...

JAVA并发编程系列(13)Future、FutureTask异步小王子
美团本地生活面试:模拟外卖订单处理,客户支付提交订单后,查询订单详情,后台需要查询店铺备餐进度、以及外卖员目前位置信息后再返回。 时间好快,一转眼不到一个月时间,已经完成分享synchronized、volatile、…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...