Ansible 自动化运维工具 --- playbook 剧本

文章目录

  • 1. Host inventory ---- 主机清单
    • 1.1 简介
    • 1.2 inventory文件
    • 1.3 Inventory 文件的构成
      • 1.3.1 主机与组
      • 1.3.2 变量
    • 1.4 inventory 中的常用变量
  • 2. Ansible-playbook剧本
    • 2.1 简介
    • 2.2 Playbook的结构组成
    • 2.3 编写playbook的基本格式与写法
      • 2.3.1 基本格式
      • 2.3.2 语句的横向/纵向写法
  • 3. Playbook剧本编写实例
    • 3.1 编写yum安装nginx的playbook
      • 3.1.1 更新主机清单
      • 3.1.2 编写剧本
      • 3.1.3 运行剧本
      • 3.1.4 查看web服务器组的主机
    • 3.2 基本格式与常用参数
      • 3.2.1 示例
    • 3.3 变量的定义和引用
      • 3.3.1 方式一 ---- 在yaml文件中定义和引用
      • 3.3.2 方式二 ---- 在命令行定义
    • 3.4 指定远程主机sudo切换用户
      • 3.4.1 编写剧本
      • 3.4.2 执行剧本
    • 3.5 when条件判断
      • 3.5.1 使用方式
      • 3.5.2 编写剧本,使用条件判断语句
      • 3.5.3 执行剧本
    • 3.6 迭代 ---- 循环结构

1. Host inventory ---- 主机清单

在这里插入图片描述

1.1 简介

为ansible定义了管理主机的策略。

一般小型环境下我们只需要在host文件中写入主机的ip地址即可。
但是当中大型环境下,我们可能需要使用静态inventory或者动态主机清单来生成我们需要执行的目标主机。

1.2 inventory文件

默认路径为/etc/ansible/hosts

Ansible Inventory 文件是一个纯文本文件,用于定义 Ansible 执行命令的目标主机和组,以及这些主机和组的变量和属性

1.3 Inventory 文件的构成

1.3.1 主机与组

  • 主机:一个主机就是目标机器,可以是 IP 地址、域名或在 SSH 配置中定义的别名,也可以使用 ansible_host 指定。

  • :可以将多个主机划分到同一个组中,并可以对组进行操作。

在这里插入图片描述
注:组名不能包含空格,并且主机和组名必须放在方括号中。

1.3.2 变量

  • 主机变量
    为单个主机指定变量,使用主机名或 IP 地址作为标识符,变量可以设置为一个或多个值。
#示例
[ServerA]
192.168.x.xx http_port=80 https_port=443

[ServerB]
serverb.example.com ansible_user=admin ansible_password=1234
  • 组变量
    在组名之后,使用 vars 关键字设置变量,可以在组间共享变量
#示例
#所有主机指定 `ansible_ssh_user` 变量,这意味着每个主机都具有该变量。
#为每个主机定义唯一的 `name` 变量。
[WebServer]
192.168.1.10 name=webserver1
192.168.1.11 name=webserver2
192.168.1.12 name=webserver3

[DatabaseServer]
192.168.1.20 name=dbserver1
192.168.1.21 name=dbserver2

[all:vars]
ansible_ssh_user=centos
  • 组的嵌套
    将一个组嵌套到另一个组中,在 Inventory 文件中使用 :children 关键字
#示例
#将 `WebServer` 和 `DatabaseServer` 组嵌套到 `Production` 组中。
[WebServer]
192.168.1.10
192.168.1.11
192.168.1.12

[DatabaseServer]
192.168.1.20

[Production:children]
WebServer
DatabaseServer
  • 别名
    使用 Alias(别名)来引用 Inventory 中的主机。
#为 `WebServer` 和 `DatabaseServer` 组定义别名,并将它们作为两个分离的组 `Web` 和 `Db` 的成员
#创建了一个名为 `Production` 的组,该组由这两个组的别名组成。
[WebServer]
192.168.1.10
192.168.1.11
192.168.1.12

[DatabaseServer]
192.168.1.20

[Web:children]
WebServer

[Db:children]
DatabaseServer

[Production]
@Web
@Db

1.4 inventory 中的常用变量

hosts 文件为主机或组定义变量,在 playbook中可以直接调用变量

变量名含义
ansible_hostansible连接节点时的IP地址
ansible_port连接对方的端口号,ssh连接时默认为22
ansible_user连接对方主机时使用的用户名。不指定时,将使用执行ansible或ansible-playbook命令的用户
ansible_password连接时的用户的ssh密码,仅在未使用密钥对验证的情况下有效
ansible_ssh_private_key_file指定密钥认证ssh连接时的私钥文件
ansible_ssh_common_args提供给ssh、sftp、scp命令的额外参数
ansible_become允许进行权限提升
ansible_become_method指定提升权限的方式,例如可使用sudo/su/runas等方式
ansible_become_user提升为哪个用户的权限,默认提升为root
ansible_become_password提升为指定用户权限时的密码

2. Ansible-playbook剧本

在这里插入图片描述

2.1 简介

playbook 是由一个或多个play组成的列表

play的主要功能在于将直线归并为一组的主机装扮实现通过ansible中的task定义好的角色
从根本来讲,所谓的task无非是调用ansible的一个module

将多个play组织在一个playbook内,即可以让它们联动起来按实现编排的机制唱一台大戏

playbook采用YAML语言编写

2.2 Playbook的结构组成

  1. Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行
  2. Variables:变量
  3. Templates:模板
  4. Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
  5. Roles:角色

2.3 编写playbook的基本格式与写法

2.3.1 基本格式

xxx.yaml/xxx.yml
--- #表示开始
- name:  #指定play的名称
  hosts: #指定主机清单中定义的主机组名
  remote_user: #指定远程主机的执行用户
  grather_facts: ture|fales #指定是否要收集远程主机的facts信息
  vars:   #自定义变量,只能在当前play有效
    - 变量1: 值1  #格式为key: value
    - 变量2: 值2
  tasks: #定义任务列表,默认从上往下依次执行
    - name: #定义任务的名称
      模块名: 模块参数        
      ignore errors: true  #忽略任务的失败
    - name: #可以定义多个任务
      模块名: 模块参数  
      notify: 任务名  #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
      ##条件判断##
     - name:
       模块名: 模块参数
       when: #定义条件表达式(== != > < >= <=),条件成立时执行此task任务,否则不执行任务
       ##循环##
     - name:
       模块名: 模块参数={{item}}
       with_items: #定义循环列表
     ##tags模块,标签## 
     - name: 
       模块名: 模块参数 
       tags:
       - 标签1
       - 标签2
        
  handlers: 
    - name: 任务名  #和notify中的任务名相同
      模块名: 模块参数

#无注释版
---
- name: 
  hosts: 
  remote_user:
  grather_facts: ture|fales 
  vars:
    - 变量1: 值1
    - 变量2: 值2
  tasks:
    - name:
      模块名: 模块参数        
      ignore errors: true
    - name:
      模块名:
      notify: 任务名
     - name:
       模块名:
       when:
     - name:
       模块名: 模块参数={{item}}
       with_items:
  handlers: 
    - name: 任务名
      模块名: 模块参数

Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler。

这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启

2.3.2 语句的横向/纵向写法

  • 横向写法一般是数组类型

  • 纵向写法一般是<font color=blueyell列表类型

task任务的模块语法格式
横向格式:
模块名: 参数1=值 参数2={{变量名}} ...

纵向格式:
模块名:
  参数1: 值
  参数2: "{{变量名}}"
  ...
  
with_items 和 vars 的语法格式
横向格式:
with_items: ["值1", "值2", "值3", ...]

值为对象(键值对字段)时:
with_items:
- {key1: "值1", key2: "值2"}
- {key1: "值3", key2: "值4"}
...

纵向格式:
with_items:
- 值1
- 值2
- 值3
...

值为对象(键值对字段)时:
with_items:
- key1: "值1"
  key2: "值2"
- key1: "值3"
  key2: "值4"
...

3. Playbook剧本编写实例

3.1 编写yum安装nginx的playbook

3.1.1 更新主机清单

vim /etc/ansible/hosts

在这里插入图片描述

3.1.2 编写剧本

/etc/ansible
#编写yaml文件,安装nginx的剧本
vim test.yaml

---
 - name: first play
   hosts: webservers  #指定执行脚本的目标
   remote_user: root
   gather_facts: false
   tasks:
     - name: firewalld
       service: name=firewalld state=stopped enabled=no
     - name: selinux
       command: '/usr/sbin/setenforce 0 '
       ignore_errors: true
     - name: mount
       mount: src=/dev/sr0 path=/mnt state=mounted fstype=iso9660
     - name: nginx.repo file
       copy: src=/etc/yum.repos.d/nginx.repo dest=/etc/yum.repos.d/nginx.repo  #需要提前准备好源
     - name: epel.repo
       copy: src=/etc/yum.repos.d/epel.repo dest=/etc/yum.repos.d/
     - name: nginx install
       yum: name=nginx state=latest
     - name: configuration file
       copy: src=/opt/nginx.conf dest=/etc/nginx/nginx.conf            #需要提前准备好配置文件
       notify: "reload nginx"
     - name: start nginx
       service: name=nginx state=started enabled=yes
   handlers:
     - name: reload nginx
       service: name=nginx state=reloaded

在这里插入图片描述

3.1.3 运行剧本

ansible-playbook test.yaml

在这里插入图片描述

3.1.4 查看web服务器组的主机

systemctl status firewalld
getenforce

systemctl status nginx

在这里插入图片描述

3.2 基本格式与常用参数

#执行playbook
ansible-playbook xx.yaml/yml [参数]
常用参数描述使用场景
–syntax-check检查yaml文件的语法是否正确
–list-task检查tasks任务
–list-hosts检查生效的主机
–start-at-task=’ name ’指定从某个task开始运行一般用于剧本较长且不想从头重复执行的场景
-k用来交互输入ssh密码-ask-pass
-K用来交互输入sudo密码-ask-become-pass
-u指定用户

3.2.1 示例

#检查yaml文件的语法是否正确
ansible-playbook test.yaml --syntax-check    

在这里插入图片描述

#检查tasks任务
ansible-playbook test.yaml --list-task      

在这里插入图片描述

#检查生效的主机
ansible-playbook test.yaml --list-hosts      

在这里插入图片描述

#指定从 nginx install 开始运行
ansible-playbook test.yaml --start-at-task='nginx install'

在这里插入图片描述

3.3 变量的定义和引用

  vars:   #自定义变量,只能在当前play有效
    - 变量1: 值1  #格式为key: value
    - 变量2: 值2
  tasks:  #在任务列表中引用变量
    -name:
     module: {{变量1}}

3.3.1 方式一 ---- 在yaml文件中定义和引用

vim test2.yml

---
 - name: second play
   hosts: webservers
   remote_user: root
   gather_facts: true
   vars: 
     - groupname: mysql 
     - username: nginx
   tasks:
     - name: create group
       group: name={{groupname}} system=yes gid=306    #使用 {{key}} 引用变量的值
     - name: create user
       user: name={{username}} uid=306 group={{groupname}} 
     - name: copy file
       copy: content="{{ansible_default_ipv4.network}}" dest=/opt/vars.txt    #在setup模块中可以获取facts变量信息
       
#ansible_default_ipv4为facts变量信息中的字段
#ansible_default_ipv4.network中的 .network表示只提取信息中network部分
ansible-play test2.yml

在这里插入图片描述

3.3.2 方式二 ---- 在命令行定义

ansible-playbook test1.yml -e "username=nginx"
#通过 -e 参数传递一个额外的变量 "username=nginx" 给 playbook
#playbook 将会使用变量 "username" 的值设置为 "nginx"

3.4 指定远程主机sudo切换用户

使用-k-K参数实现。

3.4.1 编写剧本

vim test3.yml

---
- hosts: webservers
  remote_user: test           
  become: yes	                 #2.6版本以后的参数,之前是sudo,意思为切换用户运行
  become_user: root              #指定sudo用户为root
  tasks: 
    - name: ts
      command: ls ./

3.4.2 执行剧本

#执行playbook,加上参数-k和-K
ansible-playbook test3.yml -k -K 

3.5 when条件判断

3.5.1 使用方式

在Ansible中,提供的唯一一个通用的条件判断是when指令

当when指令的值为true时,则该任务执行,否则不执行该任务。

When指令一个比较常见的应用场景是实现跳过某个主机不执行任务 或者 只有满足条件的主机执行任务。

3.5.2 编写剧本,使用条件判断语句

vim test4.yaml
---
- name: secend play
  hosts: all
  remote_user: root
  vars:
   - dirname: /var/www/html
  tasks:
   - name: create dir
     file: path={{dirname}} state=directory
     when: ansible_default_ipv4.address == "192.168.67.101"

  #when指令中的变量名不需要手动加上 {{}}
或 
     when: inventory_hostname == "<主机名>"

3.5.3 执行剧本

ansible-playbook test4.yaml

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.6 迭代 ---- 循环结构

Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环

#循环创建文件
vim test5.yaml

---
- name: diedai play
  hosts: dbservers
  remote_user: root
  tasks:
  - name: create file
    file: path={{item}} state=touch
    with_items: ["/opt/a", "/opt/b", "/opt/c", "/opt/d"]
ansible-playbook test5.yml

在这里插入图片描述
在这里插入图片描述

#循环创建目录与文件
vim test6.yml

---
- name: diedai play
  hosts: webservers
  remote_user: root
  vars:
  - myfiles: ["/opt/a", "/opt/b", "/opt/c", "/opt/d"]
  - mydirs:
    - /opt/aaa
    - /opt/bbb
    - /opt/ccc
    - /opt/ddd

  tasks:
  - name: create file
    file: path={{item}} state=touch
    with_items: "{{myfiles}}"

  - name: create dir
    file: path={{item}} state=directory
    with_items: "{{mydirs}}"
ansible-playbook test6.yml

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【T690 之十二】基于方寸EVB2开发板(T690芯片)构建基于GMSSL的文件系统的方式

备注&#xff1a; 1&#xff0c;假设您已对方寸微电子的T690系列芯片的使用方式都有了一定的了解&#xff0c;然后需要构建基于GMSSL的文件系统&#xff0c;此文才对您有意义&#xff1b; 2&#xff0c;若您对方寸微电子的T690芯片不了解&#xff0c;但想进一步了解它&#xff…

[C++ 中]:6.类和对象下(static成员 + explicit +友元函数 + 内部类 + 编译器优化)

(static成员 explicit 友元函数 内部类 编译器优化&#xff09; 一.static 成员&#xff1a;1.概念引入&#xff1a;1-1&#xff1a;定义全局变量记录个数&#xff1f; 2.如果有多个类需要分开去记录类对象的个数&#xff1f;2-1&#xff1a;可不可以声明成员变量解决&#…

LangChain之关于RetrievalQA input_variables 的定义与使用

最近在使用LangChain来做一个LLMs和KBs结合的小Demo玩玩&#xff0c;也就是RAG&#xff08;Retrieval Augmented Generation&#xff09;。 这部分的内容其实在LangChain的官网已经给出了流程图。 我这里就直接偷懒了&#xff0c;准备对Webui的项目进行复刻练习&#xff0c;那么…

HTML的初步学习

HTML HTML 描述网页的骨架, 标签化的语言. HTML 的执行是浏览器的工作,浏览器会解析 html 的内容,根据里面的代码,往页面上放东西,浏览器的工作归根结底,还是以汇编的形式在CPU上执行. 浏览器对于html语法格式的检查没有很严格,即使你写的代码有一些不合规范之处,浏览器也会尽可…

GIS开发入门,TopoJSON格式是什么?TopoJSON格式与GeoJSON格式有什么不同?

TopoJSON介绍 TopoJSON是一种几何拓扑结构的地理数据格式,它使用拓扑结构来表示地理对象,可以更有效地压缩和转移数据,从而加快数据加载速度。 TopoJSON格式构成 TopoJSON文件由三部分组成,transform、objects和arcs组成。transform描述了变换参数; objects描述地理实体…

NCV7721D2R2G一款完全保护的双半桥驱动器 专为汽车工业运动控制解决方案

NCV7721D2R2G是一款完全保护的双半桥驱动器&#xff0c;专为汽车和工业运动控制应用而设计。两个半桥驱动器具有独立控制。这允许高侧、低侧和H桥控制。H桥控制提供正向、反向、制动和高阻抗状态。驱动器通过逻辑电平输入进行控制。 特性&#xff1a; 1.睡眠模式下的超低静态电…

生成无损压缩png和有损压缩png的做法

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> png是一种常用的图像格式。png一般为无损压缩,但是可以是有损压缩的。 下图都是100x100的png图像,一个是无损压缩,一个是有损压缩。 看着效果基本一样,但是它们的大小相差很大,无损…

WPF布局与控件分类

Refer&#xff1a;WPF从假入门到真的入门 - 知乎 (zhihu.com) Refer&#xff1a;WPF从假入门到真的入门 - 知乎 (zhihu.com) https://www.zhihu.com/column/c_1397867519101755392 https://blog.csdn.net/qq_44034384/article/details/106154954 https://www.cnblogs.com/mq0…

k8s之service五种负载均衡byte的区别

1&#xff0c;什么是Service&#xff1f; 1.1 Service的概念​ 在k8s中&#xff0c;service 是一个固定接入层&#xff0c;客户端可以通过访问 service 的 ip 和端口访问到 service 关联的后端pod&#xff0c;这个 service 工作依赖于在 kubernetes 集群之上部署的一个附件&a…

【黑马程序员】SpringCloud——Eureka

文章目录 前言一、提供者与消费者1. 服务调用关系 二、远程调用的问题三、eureka 原理分析1. eureka 的作用 四、Eureka 案例1. 搭建 eureka 服务1. 服务注册1.1 注册 user-service1.2 启动 user-service3. order-service 完成服务注册 3. 服务发现1. 在 order-service 完成服务…

把枯燥的PDF文档转换为翻页电子书,一键上传搞定

PDF是我们工作生活中比较常用的文档格式之一&#xff0c;由于PDF文件可以离线观看&#xff0c;所以通常都是静态的&#xff0c;有时候密密麻麻的文字看得很是头晕眼花&#xff0c;这使得阅读体验变得单调乏味。 为了解决这个问题 &#xff0c; 我们推荐使用FLBOOK &#xff0c…

JS逆向爬虫---响应结果加密⑤【token参数加密与DES解密】

https://spa7.scrape.center/ 文本数据 数据内嵌在js内,普通合理请求即可获取 图片 位于固定接口 类似https://spa7.scrape.center/img/durant.png 固定url名称 Token 参数确定 base64Name > base64编码后的中文名称 nodejs 代码 //导入crypto-js模块 var CryptoJS…

【AntDesign】Docker部署

docker部署是主流的部署方式&#xff0c;极大的方便了开发部署环境&#xff0c;保持了环境的统一&#xff0c;也是实现自动化部署的前提。 1 项目的目录结构 dist: 使用build打包命令&#xff0c;生成的打包目录 npm run build : 打包项目命令 docker: 存放docker容器需要修改…

Elasticsearch:ES|QL 中的数据丰富

在之前的文章 “Elasticsearch&#xff1a;ES|QL 查询语言简介”&#xff0c;我有介绍 ES|QL 的 ENRICH 处理命令。ES|QL ENRICH 处理命令在查询时将来自一个或多个源索引的数据与 Elasticsearch 丰富索引中找到的字段值组合相结合。这个有点类似于关系数据库查询中所使用的 jo…

【Proteus仿真】【Arduino单片机】OLED液晶显示

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用IIC OLED液晶等。 主要功能&#xff1a; 系统运行后&#xff0c;OLED液晶显示各种图形、字符、图像。 二、软件设计 /* 作者&#xff1a;嗨小…

6个机器学习可解释性框架

1、SHAP SHapley Additive explanation (SHAP)是一种解释任何机器学习模型输出的博弈论方法。它利用博弈论中的经典Shapley值及其相关扩展将最优信贷分配与局部解释联系起来. 举例&#xff1a;基于随机森林模型的心脏病患者预测分类 数据集中每个特征对模型预测的贡献由Shap…

工业CT 三维重建 及分割

目录 工业CT介绍 工业CT主要应用于以下领域&#xff1a; CT三维重建软件&#xff1a; 效果&#xff1a; 工业CT介绍 工业CT设备是基于线阵探测器的断层扫描技术&#xff0c;是一种常用的无损检测技术&#xff0c;用于获取物体内部的准确三维结构信息。它通过X射线的投射和接…

计算机网络学习笔记(五):运输层(待更新)

5.1 概述 5.1.1 TCP协议的应用场景 TCP为应用层协议提供可靠传输&#xff0c;发送端按顺序发送&#xff0c;接收端按顺序接收&#xff0c;其间发送丢包、乱序&#xff0c;TCP负责重传和排序。下面是TCP的应用场景。 多次交互&#xff1a;客户端程序和服务端程序需要多次交互才…

SQL必知会(二)-SQL查询篇(2)-排序检索数据

第3课、排序检索数据 排序数据 OEDER BY&#xff1a;排序 进行排序 1&#xff09;按单个列排序 需求&#xff1a; 以 prod_name 字段按照字母顺序排序 SELECT prod_name FROM Products ORDER BY prod_name; -- 以 prod_name 列按照字母顺序排序输出结果&#xff1a; 2&…

高等数学教材重难点题型总结(一)函数与极限

强化阶段的另一个专题&#xff0c;本专题主要总结高数课本上的经典例题与课后题&#xff0c;尤其一部分加*标的题目&#xff0c;对于冲击高分的同学来说&#xff0c;必须熟练掌握。 &#xff08;蓝色代表难点&#xff0c;红色代表重点&#xff0c;紫色代表重难点&#xff09; …