自动化之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: value
  tasks:  # 任务列表
    - name: 任务1名称
      module_name:  # Ansible模块名称
        parameter1: value1
        parameter2: value2
    - name: 任务2名称
      module_name:
        parameter1: value1


name: Playbook或Play的名称,通常用于描述Playbook的作用。
hosts: 要运行任务的主机组。可以是inventory中定义的主机组,也可以是单个主机(如localhost)
become: 设为true时,任务将以管理员权限(sudo)执行。
vars: 定义变量,在Playbook中全局可用。
tasks: 包含一个或多个任务,每个任务由名称和模块组成。每个任务都会通过特定的模块来执行指定的操作。

2、安装和启动nginx

[master-61 root ~/playbook] # cat nginx.yml 
---
- name: install nginx
  hosts: web
  become: true
  tasks:
    - name: install nginx
      yum:
        name: nginx
        state: present
    - name: start nginx
      service:
        name: nginx
        state: started
        enabled: 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.yml

8 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 启动时的 PID

events {
    worker_connections 1024;  # 每个进程允许的最大连接数
}

http {  # HTTP 请求配置,一个 http 可以包含多个 server
    include /etc/nginx/mime.types;  # 定义 Content-Type
    default_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 可以配置多个 location
        listen {{ 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: nginx
    statr: restarted

4.5定义剧本文件

(16:26:42)[master-61 root /etc/ansible/roles/nginx] # cat roles.yml 
- hosts: web
  remote_user: root
  roles: 
    - 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服务都正常启动

网页访问也正常

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

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

相关文章

函数执行中的栈和寄存器调用

函数执行中的栈和寄存器调用 函数执行过程中主要用到的寄存器有程序计数器和栈指针。 程序计数器(IP):指向下一条执行指令的地址,其值用%rip来表示 栈指针:指向栈顶地址,其值用%rsp来表示 当过程P调用过…

纯新手教程:用llama.cpp本地部署DeepSeek蒸馏模型

0. 前言 llama.cpp是一个基于纯C/C实现的高性能大语言模型推理引擎,专为优化本地及云端部署而设计。其核心目标在于通过底层硬件加速和量化技术,实现在多样化硬件平台上的高效推理,同时保持低资源占用与易用性。 最近DeepSeek太火了&#x…

建筑兔零基础自学python记录22|实战人脸识别项目——视频人脸识别(下)11

这次我们继续解读代码,我们主要来看下面两个部分; 至于人脸识别成功的要点我们在最后总结~ 具体代码学习: #定义人脸名称 def name():#预学习照片存放位置path M:/python/workspace/PythonProject/face/imagePaths[os.path.join(path,f) f…

【Java消息队列】应对消息丢失、重复、顺序与积压的全面策略

应对消息丢失、重复、顺序与积压的全面策略 引言kafka消息丢失生产者消费者重复消费顺序消费消息积压生产者消费者其他RabbitMQ消息丢失生产者事务机制,保证生产者发送消息到 RabbitMQ Server发送方确认机制,保证消息能从交换机路由到指定队列保证消息在 RabbitMQ Server 中的…

PHP会务会议系统小程序源码

📅 会务会议系统 一款基于ThinkPHPUniapp框架,精心雕琢的会议管理微信小程序,专为各类高端会议场景量身打造。它犹如一把开启智慧殿堂的金钥匙,为会议流程优化、开支精细化管理、数量精准控制、标准严格设定以及供应商严格筛选等…

Unity通过Vosk实现离线语音识别方法

标注:deepseek直接生成,待验证 在Unity中实现离线语音识别可以通过集成第三方语音识别库来实现。以下是一个使用 Unity 和 Vosk(一个开源的离线语音识别库)的简单示例。 准备工作 Vosk:一个开源的离线语音识别库&am…

架构学习第七周--Prometheus

目录 一、监控系统基础 二、Prometheus介绍 三、Prometheus单机部署 四、服务发现与告警功能 4.1,服务发现 4.2,告警功能实现 五、Prometheus与Kubernetes 5.1,Kubernetes指标 5.2,Prometheus集群部署 一、监控系统基础…

技术总结 | MySQL面试知识点

MySQL面试知识点 1.存储引擎1.1 Archive1.2 BlackHole1.3 MyISAM1.4 InnoDB (重点记一下哦)1.5 Memory1.6 CSV 2. 事务2.1. 什么是事务2.2. 事务的特性2.3. 事务的操作sql2.4. 事务的隔离级别 3.三大日志3.1. undo log 回滚日志3.2. redo log 重做日志3.3. bin log 二进制日志4…

DeepSeek模型快速部署教程-搭建自己的DeepSeek

前言:在人工智能技术飞速发展的今天,深度学习模型已成为推动各行各业智能化转型的核心驱动力。DeepSeek 作为一款领先的 AI 模型,凭借其高效的性能和灵活的部署方式,受到了广泛关注。无论是自然语言处理、图像识别,还是…

图论 之 BFS

文章目录 3243.新增道路查询后的最短距离1311.获取你好友已观看的视频 BFS:广度优先搜索(BFS) 是一种常用的算法,通常用于解决图或树的遍历问题,尤其是寻找最短路径或层级遍历的场景。BFS 的核心思想是使用队列(FIFO 数…

VSCode集成deepseek使用介绍(Visual Studio Code)

VSCode集成deepseek使用介绍(Visual Studio Code) 1. 简介 随着AI辅助编程工具的快速发展,VSCode作为一款轻量级、高度可扩展的代码编辑器,已成为开发者首选的工具之一。DeepSeek作为AI模型,结合Roo Code插件&#x…

Qt中利用httplib调用https接口

httplib中如果要调用https接口,需要开启OPENSSL支持,经过半天坑爹得摸索,总结下经验。 1,下载 并安装Win64OpenSSL 地址如下,我Qt版本是5.15.2 ,openssl选择的是 64位(Win64OpenSSL-3_3_3.msi…

使用Geotools读取DEM地形数据实战-以湖南省30米数据为例

目录 前言 一、DEM地形数据介绍 1、DEM数据简介 2、DEM应用领域 3、QGIS中读取DEM数据 二、GeoTools解析地形 1、Maven中依赖引用 2、获取数据基本信息 三、总结 前言 随着全球数字化进程的加速,各类地理空间数据呈爆炸式增长,DEM 数据作为其中的…

登录-01.基础登录功能

一.需求分析 当前的页面不需要登录就可以进入,十分不安全,因此要设置登录功能来维护系统的安全性。登录时要根据输入的用户名和密码进行登录校验,如果在数据库中没有找到匹配的用户名和密码的话,那么就无法登录。 因此要先根据用…

调用click.getchar()时Windows PyCharm无法模拟键盘输入

文章目录 问题描述解决方案参考文献 问题描述 调用 click.getchar() 时,Windows PyCharm 无法模拟键盘输入 解决方案 Run → Edit Configurations… → Modify options → Emulate terminal in output console 参考文献 Terminal emulator | PyCharm Documentati…

京东杀入外卖界,这波操作到底香不香?

京东杀入外卖界,这波操作到底香不香? 最近外卖圈炸了!京东这个电商巨头,居然一声不吭地搞起了外卖!一出手就是0佣金,品质堂食 两大杀招,直接把美团、饿了么整懵了。今天咱们就来唠唠&#xff0…

PTH 哈希传递攻击

参考文章:内网渗透 | 哈希传递攻击(Pass-the-Hash,PtH)-腾讯云开发者社区-腾讯云 哈希传递攻击(Pass-the-Hash,PtH)_c 实现 pass the hash功能-CSDN博客 域控机器账户:WIN-0V0GAORDC17 域控 ip:192.168.72.163 域内攻击者机器 ip&#xf…

Vue3项目,蛋糕商城系统

简单的vue3商城 蛋糕商城系统 下单平台 带用户 登录 注册 首页轮播图 购物车后台管理 商品订单 登录注册 商品详情 纯前端无后台、无数据库 纯Vue3项目作业 vue3 setup语法糖写法 技术实现 本项目主要使用如下技术实现, - 基于vue3vite搭建的项目框架 -…

快速上手gdb/cgdb

Linux调试器-gdb使用 1.背景2.调试原理、技巧命令2.1指令2.2 本质2.3 技巧 1.背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g…

LLM增强强化学习:开启智能决策的新篇章

标题期刊年份关键词Survey on Large Language Model-Enhanced Reinforcement Learning: Concept, Taxonomy, and MethodsIEEE Transactions on Neural Networks and Learning Systems2024Reinforcement learning (RL), large language models (LLM), vision-language models (V…