自动化之ansible(二)

一、ansible中playbook(剧本)

官方文档:

Ansible playbooks — Ansible Community Documentation

1、playbook的基本结构

一个基本的playbook由以下几个主要部分组成

hosts: 定义要执行任务的主机组或主机。
become: 是否需要使用超级用户权限(如 sudo)。
vars: 在 Playbook 中定义变量。

tasks: 任务列表,指定要执行的操作。

注:playbook:由一个play或者多个play组成,一个paly可以包含多个task任务

ansible中playbook的文件结尾是.yml格式后缀

示例:

---
- name: Playbook名称hosts: 主机组become: true  # 是否需要使用管理员权限(sudo)vars:  # 可选部分,定义变量variable_name: valuetasks:  # 任务列表- name: 任务1名称module_name:  # Ansible模块名称parameter1: value1parameter2: value2- name: 任务2名称module_name:parameter1: value1name: Playbook或Play的名称,通常用于描述Playbook的作用。
hosts: 要运行任务的主机组。可以是inventory中定义的主机组,也可以是单个主机(如localhost)
become: 设为true时,任务将以管理员权限(sudo)执行。
vars: 定义变量,在Playbook中全局可用。
tasks: 包含一个或多个任务,每个任务由名称和模块组成。每个任务都会通过特定的模块来执行指定的操作。

2、安装和启动nginx

[master-61 root ~/playbook] # cat nginx.yml 
---
- name: install nginxhosts: webbecome: truetasks:- name: install nginxyum:name: nginxstate: present- name: start nginxservice:name: nginxstate: startedenabled: true

 在执行playbook脚本时报错了如下:

web7主机出现系统的文件系统被挂载为只读模式,导致没法执行yml脚本

解决方法:登录上web-7主机,将文件系统重新挂载为读写模式

检查文件系统的挂载状态,确认是否为只读模式
[web-7 root ~] # mount | grep ' / '
/dev/mapper/centos-root on / type xfs (ro,relatime,attr2,inode64,noquota)ro 表示只读,这就意味着文件系统被挂载为只读模式重新挂载为读写模式,重新挂载根文件系统(/)为读写模式
[web-7 root ~] # mount -o remount,rw /
[web-7 root ~] # df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 979M     0  979M   0% /dev
tmpfs                    991M     0  991M   0% /dev/shm
tmpfs                    991M  9.5M  981M   1% /run
tmpfs                    991M     0  991M   0% /sys/fs/cgroup
/dev/mapper/centos-root   37G  2.1G   35G   6% /
/dev/sda1               1014M  140M  875M  14% /boot
tmpfs                    199M     0  199M   0% /run/user/0
[web-7 root ~] # ls /root/
anaconda-ks.cfg  .bash_history    .bash_profile    .cshrc           .pki/            .tcshrc
.ansible/        .bash_logout     .bashrc          network.sh       .ssh/            .viminfo

重新执行playbook

先执行命令检查一下是否正常
[master-61 root ~/playbook] # ansible-playbook -C nginx.yml PLAY [install nginx] **********************************************************************************TASK [Gathering Facts] ********************************************************************************
ok: [172.16.1.7]TASK [install nginx] **********************************************************************************
changed: [172.16.1.7]TASK [start nginx] ************************************************************************************
changed: [172.16.1.7]PLAY RECAP ********************************************************************************************
172.16.1.7                 : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

执行剧本

[master-61 root ~/playbook] # ansible-playbook nginx.yml PLAY [install nginx] **********************************************************************************TASK [Gathering Facts] ********************************************************************************
ok: [172.16.1.7]TASK [install nginx] **********************************************************************************
changed: [172.16.1.7]TASK [start nginx] ************************************************************************************
changed: [172.16.1.7]PLAY RECAP ********************************************************************************************
172.16.1.7                 : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

验证web-7机器是否安装启动成功

二、ansible中roles角色

1、roles介绍

roles相当于是在ansible中playbooks的目录组织结构。它可以将任务(tasks)、变量(vars)、文件(files)、模板(templates)、处理器(handlers)、默认值(defaults)、以及其他资源分组到一个单独的目录中,提升代码的可维护性。

2、roles目录结构如下

my_role/
├── defaults/
│   └── main.yml          # 默认变量
├── files/                # 存放静态文件
├── handlers/
│   └── main.yml          # 任务完成后的处理器
├── meta/
│   └── main.yml          # 角色的元数据,例如依赖关系
├── tasks/
│   └── main.yml          # 主要的任务文件
├── templates/            # 存放 Jinja2 模板文件
├── tests/
│   └── test.yml          # 测试脚本
└── vars/└── main.yml          # 存放变量

每个目录的用途如下:

defaults/main.yml:定义角色的默认变量,变量值可以被 Playbook 或其它角色覆盖。
files/:存放一些静态的文件,可以通过 copy 或 template 模块来部署到目标主机。
handlers/main.yml:用于定义触发特定条件时执行的处理器。通常是服务的重启、重载等操作。
meta/main.yml:描述角色的元数据,如角色的依赖关系、作者信息等。
tasks/main.yml:包含角色的任务,定义了这个角色执行的具体工作。
templates/:存放 Jinja2 模板文件。你可以在角色中使用模板来动态生成文件。
tests/test.yml:用于测试角色是否正常工作,通常会包含一些验证任务,确保角色行为符合预期。
vars/main.yml:存放角色的变量,这些变量在 Playbook 中可以覆盖。

3、创建roles角色

命令:ansible-galaxy init 角色名

(11:04:31)[master-61 root /etc/ansible/roles] # ansible-galaxy init my_role
- Role my_role was created successfully
(11:04:35)[master-61 root /etc/ansible/roles] # 
(11:04:38)[master-61 root /etc/ansible/roles] # tree my_role/
my_role/
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars└── main.yml8 directories, 8 files

4、使用roles角色

roles角色的执行流程:

定义tasks任务 --> 定义jinja2模板,作为配置文件用 --> 定义变量 --> 定义触发 --> 定义roles的yml文件 -->检查yml语法 --> 执行roles.yml文件 --> 查看nginx服务启动状态

4.1定义任务,在task/main.yml文件中定义任务

(14:45:56)[master-61 root /etc/ansible/roles/nginx] # cat tasks/main.yml ---
- name: "Install wget"yum:name: "wget"state: "present"- name: "Download nginx package"get_url:url: "http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.18.0-1.el7.ngx.x86_64.rpm"dest: "/etc/ansible/roles/nginx/files/"
- name: "Copy nginx package to /tmp"copy:src: "nginx-1.18.0-1.el7.ngx.x86_64.rpm"dest: "/tmp/nginx-1.18.0-1.el7.ngx.x86_64.rpm"- name: "Install nginx from rpm package"yum:name: "/tmp/nginx-1.18.0-1.el7.ngx.x86_64.rpm"state: "latest"- name: "Configure nginx"template:src: "nginx.conf.j2"dest: "/etc/nginx/nginx.conf"tags:- "nginxconf"notify:- "Reload nginx configuration"- name: "Start nginx service"service:name: "nginx"state: "started"enabled: true

4.2 定义templates生成配置文件

(16:23:43)[master-61 root /etc/ansible/roles/nginx] # cat templates/nginx.conf.j2 
user nginx;  # 设置 Nginx 服务的系统使用用户
worker_processes {{ ansible_processor_vcpus }};  # 工作进程数error_log /var/log/nginx/error.log warn;  # Nginx 的错误日志
pid /var/run/nginx.pid;  # Nginx 启动时的 PIDevents {worker_connections 1024;  # 每个进程允许的最大连接数
}http {  # HTTP 请求配置,一个 http 可以包含多个 serverinclude /etc/nginx/mime.types;  # 定义 Content-Typedefault_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;  # 访问日志sendfile on;  # 高效文件传输keepalive_timeout 65;  # 客户端与服务端的超时时间server {  # HTTP 服务,一个 server 可以配置多个 locationlisten {{ nginx_config.nginx_port }};  # 服务监听端口server_name localhost;  # 主机名、域名location / {root /usr/share/nginx/html;  # 页面存放目录index index.html index.htm;  # 默认页面}error_page 500 502 503 504 /50x.html;  # 错误页面重定向location = /50x.html {root /usr/share/nginx/html;  # 页面存放的目录}}include /etc/nginx/conf.d/*.conf;  # 包含其他配置文件
}

4.3定义变量,在vars/main.yml文件中定义变量

(14:49:48)[master-61 root /etc/ansible/roles/nginx] # vim  vars/main.yml 
---
nginx_config:nginx_port:888

4.4 定义触发

(16:25:55)[master-61 root /etc/ansible/roles/nginx] # cat handlers/main.yml 
---
- name: reload new config service: name: nginxstatr: restarted

4.5定义剧本文件

(16:26:42)[master-61 root /etc/ansible/roles/nginx] # cat roles.yml 
- hosts: webremote_user: rootroles: - nginx

4.6 检查yml文件语法是否正确,如果报错需要检查对应配置文件

(16:27:11)[master-61 root /etc/ansible/roles/nginx] # ansible-playbook --syntax-check roles.yml playbook: roles.yml

4.7 执行roles.yml文件

(10:48:31)[master-61 root /etc/ansible/roles/nginx] # ansible-playbook roles.yml PLAY [web] ********************************************************************************************TASK [Gathering Facts] ********************************************************************************
ok: [172.16.1.8]
ok: [172.16.1.7]TASK [nginx : Install wget] ***************************************************************************
ok: [172.16.1.7]
ok: [172.16.1.8]TASK [Download nginx package] *************************************************************************
ok: [172.16.1.7]
ok: [172.16.1.8]TASK [Install nginx from rpm package] *****************************************************************
ok: [172.16.1.7]
ok: [172.16.1.8]TASK [Configure nginx] ********************************************************************************
changed: [172.16.1.7]
changed: [172.16.1.8]TASK [Start nginx service] ****************************************************************************
changed: [172.16.1.7]
changed: [172.16.1.8]PLAY RECAP ********************************************************************************************
172.16.1.7                 : ok=6    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.8                 : ok=6    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

4.8 检查服务启动状态

web-7和web-8中nginx服务都正常启动

网页访问也正常

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

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

相关文章

uni-app小程序开发 基础知识2

目标&#xff1a; 构建一个文章发表平台。 我们先来写一个静态框架。 以下是 首页初代码文章列表页代码&#xff1a; <template><view class"content"><!-- 轮播图 --><swiper class"swiper-container" autoplay"true"…

kafka-集群扩容

一. 前言&#xff1a; 随着业务增加&#xff0c;我们会面临这kafka当性能问题&#xff0c;需要进行集群扩容&#xff0c;增加broker节点。 二. 扩容说明: 增加新服务到kafka集群是很容易的(参考&#xff1a; kafka-部署安装-CSDN博客 )&#xff0c;只要为新服务分配一个独一无…

uni-app开发app时 使用uni.chooseLocation遇到的问题

问题一&#xff1a;不显示 问题二&#xff1a;选择地址列表一直在加载中 因为 uni-app 接口文档 中已经说明&#xff0c;使用腾讯的话需要开启云服务&#xff0c;具体可看官网&#xff0c;这就是为什么使用时直接不显示的原因&#xff0c;所以我使用的高德&#xff0c;但又出现…

RabbitMQ的脑裂(网络分区)问题

问题描述&#xff1a; Mnesia reports that this RabbitMQ cluster has experienced a network partition. There is a risk of losing data 一、什么是MQ脑裂&#xff1f; 网络分区 如果另一个节点在一段时间内&#xff08;默认为 60 秒&#xff09;无法与其联系&#xff0…

SQL知识体系

SQL复习 MySQL SQL介绍 SQL SQL的全拼是什么&#xff1f; SQL全拼&#xff1a;Structured Query Language&#xff0c;也叫结构化查询语言。 SQL92和SQL99有什么区别呢&#xff1f; SQL92和SQL99分别代表了92年和99年颁布的SQL标准。 在 SQL92 中采用&#xff08;&#xff…

企业商业秘密百问百答之五十三【商业秘密转让】

《企业商业秘密百问百答》是由天禾律所陈军律师团队精心编撰的成果&#xff0c;汇集了该团队律师在处理商业秘密相关的刑事和民事案件中的丰富经验。近年来&#xff0c;这份资料已通过线上和线下的方式向全国近千家企业进行了广泛宣讲&#xff0c;并获得了积极的社会反响。 其…

巧用GitHub的CICD功能免费打包部署前端项目

近年来&#xff0c;随着前端技术的发展&#xff0c;前端项目的构建和打包过程变得越来越复杂&#xff0c;占用的资源也越来越多。我有一台云服务器&#xff0c;原本打算使用Docker进行部署&#xff0c;以简化操作流程。然而&#xff0c;只要执行sudo docker-compose -f deploy/…

STM32 CubeMx配置串口收发使用DMA并调用Idle模式(二)

本篇主要结合代码落实&#xff0c;之前串口已经配置好的DMA方式。 一、首先我们把串口看成一个对象&#xff0c;它有属性、私有数据和方法&#xff1b; 每个串口都有名字属性&#xff1b;有初始化、发送、接收方法&#xff1b;还有一个私有数据&#xff08;这个私有数据是每个…

react实例与总结(二)

目录 一、脚手架基础语法(16~17) 1.1、hello react 1.2、组件样式隔离(样式模块化) 1.3、react插件 二、React Router v5 2.1、react-router-dom相关API 2.1.1、内置组件 2.1.1.1、BrowserRouter 2.1.1.2、HashRouter 2.1.1.3、Route 2.1.1.4、Redirect 2.1.1.5、L…

【并发测试】Redis并发性能测试

arthas 测试示例 Redis配置类 Slf4j Configuration public class RedisConfig {BeanJedisConnectionFactory jedisConnectionFactory() {RedisStandaloneConfiguration configuration new RedisStandaloneConfiguration();configuration.setHostName(redisHost);configuratio…

【Linux基础八】计算机体系结构(冯诺依曼和操作系统)

【Linux基础八】计算机体系结构&#xff08;冯诺依曼和操作系统&#xff09; 1.冯诺依曼体系结构2.冯诺依曼的优势3.硬件间的交流4.操作系统对硬件资源的管理 1.冯诺依曼体系结构 计算机大部分遵守冯诺依曼体系 输入设备&#xff1a;键盘、鼠标、摄像头、麦克风、磁盘、网卡…

深入解析Qt事件循环

在Qt开发中&#xff0c;QApplication::exec()这行代码是每个开发者都熟悉的“魔法咒语”。为什么GUI程序必须调用它才能响应操作&#xff1f;为何耗时操作会导致界面冻结&#xff1f;本文将以事件循环为核心&#xff0c;揭示Qt高效运转的底层逻辑&#xff0c;探讨其设计哲学与最…

Hadoop 基础原理

Hadoop 基础原理 基本介绍Hadoop 的必要性Hadoop 核心组件Hadoop 生态系统中的附加组件 HDFSHDFS 集群架构HDFS 读写流程HDFS 写流程HDFS 读流程 NameNode 持久化机制 MapReduce底层原理示例 Hadoop 是一个由 Apache 基金会开发的分布式系统基础架构&#xff0c;主要解决海量数…

视觉分析之边缘检测算法

9.1 Roberts算子 Roberts算子又称为交叉微分算法&#xff0c;是基于交叉差分的梯度算法&#xff0c;通过局部差分计算检测边缘线条。 常用来处理具有陡峭的低噪声图像&#xff0c;当图像边缘接近于正45度或负45度时&#xff0c;该算法处理效果更理想。 其缺点是对边缘的定位…

【从0做项目】Java音缘心动(1)———项目介绍设计

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 零&#xff1a;项目结果展示 一&#xff1a;音乐播放器Web网页介绍 二&#xff1a;前期准备工作&…

数据链路层分析----交换机基本原理

目录 一、交换机基本原理 1、小型交换网络 2、交换机转发行为 二、交换机转发原理 1、MAC地址表 2、交换机初始状态 3、交换机学习MAC地址 4、ARP协议 5、交换机转发数据帧 6、目标主机回复 常见的以太网设备包括Hub、交换机等。交换机工作在数据链路层&#xff0c;它有…

三、Three.js模型对象、材质

一、三维向量Vector3与模型位置 点模型Points、线模型Line、网格网格模型Mesh等模型对象的父类都是Object3D&#xff0c;如果想对这些模型进行旋转、缩放、平移等操作&#xff0c;如何实现&#xff0c;可以查询Threejs文档Object3D对相关属性和方法的介绍 1、三维向量Vector3 …

2025.2.16机器学习笔记:TimeGan文献阅读

2025.2.9周报 一、文献阅读题目信息摘要Abstract创新点网络架构一、嵌入函数二、恢复函数三、序列生成器四、序列判别器损失函数 实验结论后续展望 一、文献阅读 题目信息 题目&#xff1a; Time-series Generative Adversarial Networks会议&#xff1a; Neural Information…

【第二节】C++设计模式(创建型模式)-抽象工厂模式

目录 引言 一、抽象工厂模式概述 二、抽象工厂模式的应用 三、抽象工厂模式的适用场景 四、抽象工厂模式的优缺点 五、总结 引言 抽象工厂设计模式是一种创建型设计模式&#xff0c;旨在解决一系列相互依赖对象的创建问题。它与工厂方法模式密切相关&#xff0c;但在应用…

微信小程序:多菜单栏设计效果

一、实现效果 二、代码 wxml 编辑前端界面,步骤 菜单逻辑: 逐步取出数组中的项,首先取出顶部菜单项,然后选中后取出选中的底部数据(左侧菜单+右侧内容),然后点击左侧菜单取出选中的左侧菜单对应的右侧内容 ①这里我的数据是全部封装到一个数组对象的,首先我的循环…