小阿轩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、…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...
基于Python的气象数据分析及可视化研究
目录 一.🦁前言二.🦁开源代码与组件使用情况说明三.🦁核心功能1. ✅算法设计2. ✅PyEcharts库3. ✅Flask框架4. ✅爬虫5. ✅部署项目 四.🦁演示效果1. 管理员模块1.1 用户管理 2. 用户模块2.1 登录系统2.2 查看实时数据2.3 查看天…...
