Ansible进阶1——大项目清单管理

news2024/10/7 10:17:37

文章目录

  • 一、playbook引用主机方式
    • 1.1 引用清单主机
    • 1.2 引用主机别名
    • 1.3 使用通配符引用
  • 二、动态清单
  • 三、管理多个清单
  • 四、forks和serial
  • 五、包含与导入
    • 5.1 导入playbook
    • 5.2 导入任务文件
    • 5.3 包含任务文件
    • 5.4 结合变量

一、playbook引用主机方式

  • 清单文件的使用方式很多,在大型项目中清单管理尤为重要。

1.1 引用清单主机

  • 在playbook中使用hosts指定要操作的受控机,可以是受控机的ip,也可以引用清单文件。

1.查看清单文件有两个组。
在这里插入图片描述
2.playbook中引用mq组的主机,对其下的受控机进行操控。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 系统初始化
  gather_facts: no
  hosts: mq
  tasks:
    - name: 测试主机
      ping:

在这里插入图片描述
3.也可以单独写清单文件中的某个ip。
在这里插入图片描述
4.使用all引用清单文件中的所有主机,忽略组的概念。
在这里插入图片描述
5.使用ungrouped引用清单文件中所有组之外的所有主机ip。
在这里插入图片描述

1.2 引用主机别名

  • 当有成百上千台服务器时,清单文件里填写那么多ip我们是分不出来每台机器是干什么的,所以这是可以设置主机别名,通过引用清单文件中的主机别名也可以进行对受控机操控。
  • 设置ansible_host主机变量,在清单中将某一别名指向特定的IP地址,再创建host_vars/主机别名文件。

1.清单文件自定义主机别名。
在这里插入图片描述
2.创建host_vars目录,其下根据清单中的主机别名来创建文件,里面通过ansible_host变量写主机ip。
在这里插入图片描述
3.playbook中引用主机别名,可以直接使用。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 系统初始化
  gather_facts: no
  hosts: mariadb_1    #3引用清单文件中的主机别名
  tasks:
    - name: 测试主机
      ping:

在这里插入图片描述

1.3 使用通配符引用

  • playbook中使用通配符“ * ”可以匹配清单中所有清单名称、主机和主机组,不区别名称是DNS名、IP地址还是组,所以可能会导致一些意外的匹配。
  • 通配符必须使用引号。

1.单用“ * ” 时,则直接匹配清单中的所有主机,直接忽略组的概念,与all作用相同。
在这里插入图片描述
在这里插入图片描述
2.当通配符匹配多个主机时,可以忽略组、主机别名的概念,如下是匹配以m开头的所有主机组、主机别名下的主机。
在这里插入图片描述
3.也可以取反匹配。
在这里插入图片描述

二、动态清单

为什么要使用动态清单?

  • 动态清单适用管理百台服务器以上的项目,当服务器太多时使用静态清单不好管理这些服务器,因为写Ip就要写100、1000遍,这样会失去我们使用ansible的意义。
  • 而动态清单就是通过外部脚本程序自动获取受控机的信息变化自动更新,不需要人工再一个一个敲,方便管理使用。

概念:

  • Ansible支持动态清单脚本,这些脚本会在Ansible执行时从这些类型的来源检索当前的信息,使清单文件实时更新。动态清单脚本是可以执行的程序,能够从一些外部来源收集信息,并以JSON格式输出清单。

使用方式:

  • 与静态清单文本文件一样,清单文件位置可以通过ansible配置文件ansible.cfg文件中指定,或通过-i选项指定。

编写方式:

  1. 从ansible社区获取,使用python语言编写,ansible社区连接
  2. 自定义动态清单程序,可以使用任何语言编写,但传递适当的选项时必须以JSON格式返回清单信息,可以参考社区的详细编写信息,社区参考连接。
    • 可以使用ansible-inventory命令学习如何以JSON格式编写Ansible动态清单,–list参数获取内容详情。
    • 动态清单脚本需要适当解释器行,例如,#!/usr/bin/python开头并且可以执行。
    • 动态清单脚本必须显示清单中所有主机和组的JSON编码散列/字典。

三、管理多个清单

  • 可以创建inventory目录,将所有清单文件放入该目录,执行ansible时使用-i指定目录,则会执行目录下的所有清单文件。

注意事项:

  • 目录下的清单文件按照字母顺序进行解析。
  • Ansible会忽略清单目录中以特定后缀结尾的文件。这可以通过在Ansible配置文件中的inventory_ignore extensions指令来控制。
    在这里插入图片描述

1.创建目录inventory,将qingjun清单和baimu清单放入该目录,执行ansible时指定目录对这两个清单文件中的所有主机进行操控。
在这里插入图片描述

四、forks和serial

forks参数:

  • 作用:Ansible默认以每5台主机来运行playbook,直至所有主机运行完任务。在配置文件中设置参数值。
  • playbook执行流程:一个playbook中有多个任务,先是对第一批的5台受控机执行第一个任务,再对第二批的5台受控机执行第一个任务,所有受控机把第一台任务执行完后再对第一批的5台受控机执行第二个任务,直至所有任务执行完成。
  • 弊端:容易导致线上服务长时间瘫痪。比如若要更新服务,则需先执行第一个任务停止服务,再执行第二个任务启动服务,当服务器过多时,执行完第一个任务需要花费几分钟,一直到所有主机执行完第一个任务后再能开始执行第二个任务启动服务,所以这几分钟内所有服务都是停止状态,线上环境处于瘫痪状态,需要避免这种情况。
  • 注意事项:使用参数时,需要根据主控机上的内存资源来设置参数值,否则容易导致主控机资源性崩溃。

serial参数:

  • 作用:弥补forks参数缺陷设计,在playbook中使用serial参数。
  • playbook执行流程:一个playbook中有多个任务,先在前5台主机上执行playbook中的所有任务,包括handlers中的任务,所有受控机上的任务执行完成后再在第二批的5台主机上执行playbook中的所有任务,包括handlers中的任务。
    在这里插入图片描述

五、包含与导入

基本了解:

  • 若playbook很长或很复杂,我们可以将其分成较小的文件以便于管理,采用模块化方式将多个playbook组合为一个主要playbook,或者将文件中的任务列表插入playbook中,之后运行主playbook任务,这样就可以更轻松地在不同项目中重用play或任务序列。

概念:

  • 包含内容是一个动态操作,在playbook运行期间,Ansible会在内容到达时处理所包含的内容。
  • 导入内容是一个静态操作,在运行开始之前,Ansible在最初解析playbook时预处理导入的内容。

5.1 导入playbook

  • 导入文件就是将一个大playbook按照任务模块分成很多小playbook,再使用import_playbook模块定义一个任务文件,最后使用这个任务文件启动。
  • 常常用在playbook很长的情况下,可以分开写,最后再合在一起启动,方便管理阅读。

1.如下图,有3个playbook,第一个是测试主机连通性,第二个是安装httpd服务,第三个启动服。最后定义一个任务文件,依次执行这3个playbook。
在这里插入图片描述
2.指定任务文件执行playbook,查看结果。
在这里插入图片描述
3.也可以再任务文件里自定义任务play,配合上面的playbook一起使用。

[root@localhost playbook]# cat qingjun_all.yml 
- name: 测试主机
  import_playbook: qingjun_1.yml
- name: 安装阿帕奇
  import_playbook: qingjun_2.yml
- name: 启动服务
  import_playbook: qingjun_3.yml

- name: 停止服务       ##定义一个任务play,停止服务。
  hosts: all
  tasks:
    - name: 停止阿帕奇
      service:
        name: httpd
        state: stopped

在这里插入图片描述

5.2 导入任务文件

注意事项:

  • 使用import_tasks模块时,导入时设置的when等条件语句将应用于导入的每个任务。
  • 无法将循环用于import_tasks功能。
  • 如果使用变量来指定要导入的文件的名称,则将无法使用主机或组清单变量。
  • 推荐使用。

1.先定义3个任务文件,最后再定义playbook文件时使用import_tasks模块引用任务文件依次执行。

[root@localhost playbook]# cat qingjun_1.yml 
- name: 测试主机连通性
  ping:

[root@localhost playbook]# cat qingjun_2.yml 
- name: 安装阿帕奇
  yum:
    name: httpd
    state: present

[root@localhost playbook]# cat qingjun_3.yml 
- name: 启动阿帕奇
  service:
    name: httpd
    state: stopped

[root@localhost playbook]# cat qingjun_all.yml 
---
- hosts: all
  tasks:
    - import_tasks: qingjun_1.yml     
    - import_tasks: qingjun_2.yml
    - import_tasks: qingjun_3.yml

2.执行playbook,查看结果。
在这里插入图片描述

5.3 包含任务文件

  • 可以使用include_tasks功能将任务文件动态导入playbook内的play中,作用与import_tasks模块一样。
  • 使用include_tasks模块时,包含时设置的when等条件语句将确定任务是否包含在play中。
  • 不能使用ansible-playbook --start-at-task从已包含任务文件中的任务开始执行playbook。
  • 不能使用notify语句触发已包含任务文件中的处理程序名称。可以在包含整个任务文件的主playbook中触发处理程序,在这种情况下,已包含文件中的所有任务都将运行。
  • 不推荐使用。

1.先定义3个任务文件,最后再定义playbook文件时使用inport_tasks模块引用任务文件依次执行。

[root@localhost playbook]# cat qingjun_1.yml 
- name: 测试主机连通性
  ping:

[root@localhost playbook]# cat qingjun_2.yml 
- name: 安装阿帕奇
  yum:
    name: httpd
    state: present

[root@localhost playbook]# cat qingjun_3.yml 
- name: 启动阿帕奇
  service:
    name: httpd
    state: started

在这里插入图片描述
2.执行playbook,查看结果。
在这里插入图片描述
3.使用ansible-playbook --list-tasks可以列出任务。当使用import_tasks模块时只列出已导入文件中定义的各个任务名称;当使用imclude_tasks模块时只会列出playbook中引入的导入任务文件的任务。
在这里插入图片描述
在这里插入图片描述

5.4 结合变量

  • 结合变量可以重复使用playbook,而不需要频繁修改文件。

1.在playbook文件里定义变量,在任务文件里引用变量。

[root@localhost playbook]# cat qingjun_2.yml 
- name: 安装{{ page_name  }}
  yum:
    name: "{{ page_name }}"
    state: present
[root@localhost playbook]# cat qingjun_3.yml 
- name: 启动{{ service_name  }}
  service:
    name: "{{ service_name  }}"
    state: started
[root@localhost playbook]# cat qingjun_all.yml 
---
- hosts: all
  vars:
    page_name: postfix
    service_name: postfix
  tasks:
    - import_tasks: qingjun_2.yml
    - import_tasks: qingjun_3.yml

2.执行playbook,受控机查看postfix服务状态验证。
在这里插入图片描述
3.第二种写法,playbook+引入任务文件配合使用。

[root@localhost playbook]# cat qingjun_4.yaml 
---
- hosts: all
  gather_facts: no
  vars:
    page_name: postfix
    service_name: postfix
  tasks:
    - name: import tasks install
      import_tasks: qingjun_2.yml
    - name: import tasks service
      import_tasks: qingjun_3.yml

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UNIX网络编程卷一 学习笔记 第十八章 路由套接字

内核中的Unix路由表传统上一直使用ioctl函数访问,但没有ioctl函数请求能获取整个路由表,而netstat等程序通过读取内核的内存获取路由表内容。诸如gated等路由守护进程需要监视由内核收取的ICMP重定向消息(用于在IP网络中通知主机或路由器更优…

【网络】UDP网络服务器

代码的整体逻辑: UDP服务端:udpServer.cc(服务端的调用),udpServer.hpp(服务端的实现) UDP客户端:udpClient.cc(客户端的调用),udpClient.hpp(客户端的实现) 1.udp服务…

Flask中使用Flask-WTF验证JSON对象参数

Flask中使用Flask-WTF验证JSON对象参数 1 安装 Flask-WTF是对WTForms库的扩展,默认只对”form“标签下的表单进行验证。针对当前前后端分离的项目中,json传输参数需要进行二次封装才能使用。 # 安装Flask-WTF包 pip install Flask-WTF2 源代码 2.1 工…

一些忘了的东西(二)

Symbol出现的原因/作用 ①作为属性 避免属性冲突重复,就是使用它来表示唯一值; 问题是我们什么情况下 要保障属性一定不冲突重复 覆盖呢? 在vue里 有this.$ parent ,this.$ options ,this.$ set 这些,使用$命名开头就是想通过命名约定来减少…

BLIP使用教程

文章目录 准备测试示例一示例二: 结论源代码 原理篇: BLIP2-图像文本预训练论文解读 准备 如果无网络需提前下载相关模型 安装torch、transformers pip install torch trtransformers测试 测试blip基于图片生成文本描述能力(Caption&…

《嵌入式系统》知识总结8:寄存器编程方式操纵GPIO

方式1: 查手册找到相关寄存器的地址,自行编写代码,定义指针指向该地址,并根据需要进行寄存器读写。 举例: //方式1举例:自定义GPIOB_ODR寄存器 #define GPIOB_ODR (*(volatile unsigned int *)0x40010C0…

Vivado时序约束基础

今天这篇博客,笔者向大家简单介绍Xilinx FPGA中的Vivado时序约束基础知识,也为后续的学习打好铺垫。 Xilinx Design Constraints (XDC) 概述 • XDC 在本质上就是Tcl 语言,但其仅支持基本的Tcl 语法,如变量、列表和运算符等等&a…

Go 语言基础

文章目录 Go 语言基础1. 程序基础2. 数据类型3. 字符串与复合数据类型4. 函数、方法、接口和反射5. 并发编程(核心重点)6. 包和代码测试7. 综合实战案例框架部分探索深度 Go 语言基础 1. 程序基础 了解常量和遍历【const var 关键词】 : 初始化以及赋值…

微服务如何治理

微服务远程调用可能有如下问题: 注册中心宕机; 服务提供者B有节点宕机; 服务消费者A和注册中心之间的网络不通; 服务提供者B和注册中心之间的网络不通; 服务消费者A和服务提供者B之间的网络不通; 服务提供者…

Redux And Redux Toolkit

笔记介绍了react_redux和redux_toolkit react_redux只介绍了原理图,为理解redux_toolkit做铺垫。 本笔记是对一下课程做的输出,若大家有不理解的地方,可看完课程后,再借助课程理解笔记内容,同时也鼓励大家对自己的听…

【环境搭建】40系一些奇奇怪怪的环境问题

【设备信息】我的设备是4070ti,支持cuda12.0,但是目前用的还是11.7 1)fatal error: cusparse.h: No such file or directory 因为cuda版本和改名的原因,这个在cuda版本中比较有效的解决办法是: sudo apt search libcusparse得到…

matplotlib实操

matplotlib实操 问题1.分析离网用户的基本特征:包括但不限于地市、年龄、网龄、融合类型、套餐分布、用户价值等,年龄、网龄、用户价值(ARPU)、MOU、DOU;数据预处理处理异常值地市分布县级分布年龄分布网龄分布性别与年龄分布融合类型套餐分布用户价值(ARPU)MOU(每用…

vulnhub靶场之hackme2-DCHP

Burp联动xray 1.信息收集 探测存活主机,输入:netdiscover -r 192.168.239.0/24 ,发现192.168.239.179存活。 对目标主机192.168.239.179进行端口扫描,发现存活22、80端口。 在浏览器上输入:http://192.168.239.179&a…

axios解决跨域问题

Vue3中使用axios访问聚合的天气API,出现跨域问题,需要在前端进行一些配置: 首先是修改vue.config.js: const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServe…

vue2.0基础

文章目录 VUEVue2.0vue特点事件处理键盘事件计算属性监听watch深度监视绑定class样式条件渲染列表渲染列表过滤列表排序Vue.set()的使用Vue检测数组的原理Vue监测原理总结指令生命周期Vue componentVue配置文件vue.config.JS其他:组件自定义事件组件自定义事件解绑全…

【Mysql数据库从0到1】-入门基础篇--用户与权限管理

【Mysql数据库从0到1】-入门基础篇--用户与权限管理 🔻一、Mysql 用户管理1.1 🍃 Mysql服务器登录1.2 🍃 用户创建1.3 🍃 用户修改1.4 🍃 用户删除1.5 🍃 用户密码修改1.6 🍃 用户密码管理 &…

深入浅出C语言—【函数】上

目录 1.函数的概念 2.C语言函数的分类 2.1 库函数 2.1.1 strcpy库函数举例学习方式 2.1.2 库函数扩展知识 2.2 自定义函数 2.2.1求两个整数中的较大值 3. 函数的参数 3.1 实际参数(实参) 3.2 形式参数(形参) 4. 函数的…

Linux安全之账户安全

账户安全 Linux用户账户概述: 用户账号 超级用户root系统用户普通用户组账号 基本组(私有组----每一个私有组里面只有一个用户)附加组(公共组----每一个用户都可以加入到这个组里面) UID和GID: UID&…

【minio】Ubuntu安装MinIO文件服务器并通过C++上传下载

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍MinIO的使用。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习知识,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路&…

pandas速学-DataFrame

一、理解DataFrame 他是一个表格结构:DataFrame 是一个表格型的数据结构 他是有序的,不同值类型:它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。 他可以被看做一个由series组成的…