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: 值2tasks: #定义任务列表,默认从上往下依次执行- name: #定义任务的名称模块名: 模块参数        ignore errors: true  #忽略任务的失败- name: #可以定义多个任务模块名: 模块参数  notify: 任务名  #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作##条件判断##- name:模块名: 模块参数when: #定义条件表达式(== != > < >= <=),条件成立时执行此task任务,否则不执行任务##循环##- name:模块名: 模块参数={{item}}with_items: #定义循环列表##tags模块,标签## - name: 模块名: 模块参数 tags:- 标签1- 标签2handlers: - name: 任务名  #和notify中的任务名相同模块名: 模块参数#无注释版
---
- name: hosts: remote_user:grather_facts: ture|fales vars:- 变量1: 值1- 变量2: 值2tasks:- 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 playhosts: webservers  #指定执行脚本的目标remote_user: rootgather_facts: falsetasks:- name: firewalldservice: name=firewalld state=stopped enabled=no- name: selinuxcommand: '/usr/sbin/setenforce 0 'ignore_errors: true- name: mountmount: src=/dev/sr0 path=/mnt state=mounted fstype=iso9660- name: nginx.repo filecopy: src=/etc/yum.repos.d/nginx.repo dest=/etc/yum.repos.d/nginx.repo  #需要提前准备好源- name: epel.repocopy: src=/etc/yum.repos.d/epel.repo dest=/etc/yum.repos.d/- name: nginx installyum: name=nginx state=latest- name: configuration filecopy: src=/opt/nginx.conf dest=/etc/nginx/nginx.conf            #需要提前准备好配置文件notify: "reload nginx"- name: start nginxservice: name=nginx state=started enabled=yeshandlers:- name: reload nginxservice: name=nginx state=reloaded

在这里插入图片描述

3.1.3 运行剧本

ansible-playbook test.yaml

在这里插入图片描述

3.1.4 查看web服务器组的主机

systemctl status firewalld
getenforcesystemctl 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: 值2tasks:  #在任务列表中引用变量-name:module: {{变量1}}

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

vim test2.yml---- name: second playhosts: webserversremote_user: rootgather_facts: truevars: - groupname: mysql - username: nginxtasks:- name: create groupgroup: name={{groupname}} system=yes gid=306    #使用 {{key}} 引用变量的值- name: create useruser: name={{username}} uid=306 group={{groupname}} - name: copy filecopy: 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: webserversremote_user: test           become: yes	                 #2.6版本以后的参数,之前是sudo,意思为切换用户运行become_user: root              #指定sudo用户为roottasks: - name: tscommand: 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 playhosts: allremote_user: rootvars:- dirname: /var/www/htmltasks:- name: create dirfile: path={{dirname}} state=directorywhen: 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 playhosts: dbserversremote_user: roottasks:- name: create filefile: path={{item}} state=touchwith_items: ["/opt/a", "/opt/b", "/opt/c", "/opt/d"]
ansible-playbook test5.yml

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

#循环创建目录与文件
vim test6.yml---
- name: diedai playhosts: webserversremote_user: rootvars:- myfiles: ["/opt/a", "/opt/b", "/opt/c", "/opt/d"]- mydirs:- /opt/aaa- /opt/bbb- /opt/ccc- /opt/dddtasks:- name: create filefile: path={{item}} state=touchwith_items: "{{myfiles}}"- name: create dirfile: path={{item}} state=directorywith_items: "{{mydirs}}"
ansible-playbook test6.yml

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

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

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

相关文章

【Linux】服务器与磁盘补充知识,硬raid操作指南

服务器硬件 cpu 主板 内存 硬盘 网卡 电源 raid卡 风扇 远程管理卡 1.硬盘尺寸: 目前生产环境中主流的两种类型硬盘 3.5寸 和2.5寸硬盘 2.5寸硬盘可以通过使用硬盘托架后适用于3.5寸硬盘的服务器 但是3.5寸没法转换成2.5寸 2.如何在服务器上制作raid 华为服务器为例子做…

Python中通过socketserver库创建服务端

socketserver库是Python的标准库&#xff0c;提供了套接字服务端的框架&#xff0c;通过该框架可以简化服务端的创建流程。 1 socketserver库的导入 通过如图1显示的代码导入socketserver库。 图1 导入socketserver库 2 通过socketserver库创建TCP服务端 通过socketserver库…

二维码智慧门牌管理系统升级解决方案:轻松实现辖区范围门址统计

文章目录 前言一、系统功能与优势 前言 在这个数字化时代&#xff0c;传统的门牌管理系统已经无法满足现代管理的需求。为了满足辖区内门址的统计需求&#xff0c;我们引入了全新的二维码智慧门牌管理系统升级解决方案。这一升级将让您轻松实现辖区范围门址的统计&#xff0c;…

20.7 OpenSSL 套接字SSL加密传输

OpenSSL 中的 SSL 加密是通过 SSL/TLS 协议来实现的。SSL/TLS 是一种安全通信协议&#xff0c;可以保障通信双方之间的通信安全性和数据完整性。在 SSL/TLS 协议中&#xff0c;加密算法是其中最核心的组成部分之一&#xff0c;SSL可以使用各类加密算法进行密钥协商&#xff0c;…

【嵌入式开发工具】STM32+Keil实现软件工程搭建与开发调试

本篇文章介绍了使用Keil来对STM32F103C8芯片进行初始工程搭建&#xff0c;以及开发与工程调试的完整过程&#xff0c;帮助读者能够在实战中体会到Keil这个开发环境的使用方法&#xff0c;了解一个嵌入式工程从无到有的过程&#xff0c;并且具备快速搭建一个全新芯片对应最小软件…

Ubuntu网络IP地址一直显示127.0.0.1

问题描述&#xff1a; 终端输入ip a显示127.0.0.1&#xff0c;原来类似192.168.231.1的地址不见了。 ip a 点击网络配置&#xff08;ubuntu桌面版&#xff09;&#xff0c;发现无线网络模块看不见了 正常情况应该有wired 模块&#xff0c;就是下面标红的 解决方案&#xff1a…

【有源码】基于uniapp的农场管理小程序springboot基于微信小程序的农场检测系统(源码 调试 lw 开题报告ppt)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

Flutter的专属Skia引擎解析+用法原理

Skia是一款跨平台的2D图形库&#xff0c;是Google公司开发的&#xff0c;可以用于开发各种应用程序&#xff0c;如浏览器、游戏、移动应用程序等。Skia引擎的主要特点是速度快、可移植性强、占用的内存少、稳定性佳&#xff0c;适用于多种硬件平台。 Skia的目标是提供快速、高…

JavaWeb课程复习资料——idea创建JDBC

1、创建空的Java Project 输入项目名称 空项目 2、引入jar包步骤 依次点击 File -> Project Structure&#xff08;快捷键 Ctrl Alt Shift s&#xff09;&#xff0c;点击Project Structure界面左侧的“Modules”如图&#xff1a; 在 【Dependencies】 标签界面下&…

深度学习中的“钩子“(Hook):基于pytorch实现了简单例子

目录 基本概念一个详细的示例 基于resnet50的一个hook应用例子前向传播示例反向传播示例 基本概念 在深度学习中&#xff0c;“钩子”&#xff08;Hook&#xff09;是一种机制&#xff0c;可以在神经网络的不同层或模块中插入自定义的代码&#xff0c;以便在网络的前向传播或反…

wsl2 ubuntu22.04安装docker

1. 安装 docker 官网的步骤一步一步安装即可 Install Docker Engine on Ubuntu | Docker Docs 2. 安装完毕之后&#xff0c;不出意外的话当你运行docker version或者其他命令的时候你会报如下错误&#xff1a; Cannot connect to the Docker daemon at unix:///var/run/docke…

IDEA项目下不显示target目录或者target目录不完整没有新添加的资源,idea隐藏target目录

文章目录 一、前言二、idea隐藏target目录2.1、idea隐藏target目录2.2、git提交时隐藏target目录 三、idea下显示target目录3.1、解决idea下不显示target目录问题3.2、target显示目录不完整 一、前言 在idea-2020.1.4版本下讲解idea怎么显示或隐藏target目录。 需要知道:如果…

【获奖论文】2023年数学建模国赛优秀获奖论文

论文篇幅过长&#xff0c;本文仅展示少部分&#xff1b;共计14篇完整PDF获奖论文。 关注在微信公众号&#xff1a;数学建模BOOM&#xff0c;回复“2023国赛”获取。 注意&#xff01;是在公众号回复&#xff0c;不是在b站。 优秀论文部分内容展示&#xff1a; 更多A~E题的完…

第19章_体系结构

文章目录 1. 逻辑架构剖析1.1 服务器处理客户端请求1.2 Connectors1.3 第1层&#xff1a;连接层1.4 第2层&#xff1a;服务层1.4.1 SQL Interface: SQL接口1.4.2 Parser: 解析器1.4.3 Optimizer: 查询优化器1.4.4 Caches & Buffers&#xff1a; 查询缓存组件 1.5 第3层&…

Xshell如何下载文件到本地

法一&#xff1a;命令下载 1、连接到远程服务器并登录 2、使用cd命令进入要下载文件的目录 3、使用以下命令下载文件&#xff1a; scp usernameremote:/path/to/file /path/to/local/directoryusername 远程服务器的用户名 remote 远程服务器的IP地址或主机名 /path/to/file …

SpringCloud之Seata基本介绍与安装

目录 基本介绍 概述 核心组件 四种方案 部署TC服务&#xff08;安装&#xff09; 下载 修改registry.conf nacos添加配置 建表(仅db) 启动 基本介绍 概述 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将…

IOS渲染流程之提交图层数据至RenderThread进程

大致链路 UIView/CALayer---->CoreAnimation./Core Graphics/Core Image---->GPU Drive-->GPU 图层树/视图树 一个UIView&#xff08;视图&#xff09;对应一个CALayer&#xff08;图层&#xff09;&#xff0c;CALayer对应显示的数据其有个content代表Bitamp&#…

【第2章 Node.js基础】2.2 Node.js回调函数

学习目标 &#xff08;1&#xff09;理解Node.js的回调函数&#xff1b; &#xff08;2&#xff09;掌握回调函数的使用。 什么是回调函数 回调函数是一种特殊的函数&#xff0c;它作为参数传递给另一个函数&#xff0c;并在特定的事件或条件发生时被调用。回调函数通常用于异…

Jekyll框架编译GithubPages,提示没有docs

Jekyll Converters::Scss build issue: No such file or directory dir_chdir - /github/workspace/docs Error: No such file or directory dir_chdir - /github/workspace/docs 解决方案&#xff1a; 修改github page仓库中–> 设置—> pages 把里面的\docs&#xf…

Microsoft Edge浏览器不兼容解决办法

找到 Edge 的安装位置&#xff0c;一般在 C:\Program Files (x86)Microsoft Edge\Application\ 这个目录&#xff0c;把 edge.exe 或msedge.exe 修改为 chrome.exe 再重启电脑。