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.hqwc.cn/news/164277.html

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

相关文章

持续集成交付CICD:Jenkins Pipeline与远程构建触发器

目录 一、实验 1.Jenkins Pipeline本地构建触发器 2.Jenkins Pipeline与远程构建触发器&#xff08;第一种方式&#xff09; 3.Jenkins Pipeline与远程构建触发器&#xff08;第二种方式&#xff09; 4.Jenkins Pipeline与远程构建触发器&#xff08;第三种方式&#xff0…

基于Skywalking的全链路跟踪实现

在前文“分布式应用全链路跟踪实现”中介绍了分布式应用全链路跟踪的几种实现方法&#xff0c;本文将重点介绍基于Skywalking的全链路实现&#xff0c;包括Skywalking的整体架构和基本概念原理、Skywalking环境部署、SpringBoot和Python集成Skywalking监控实现等。 1、Skywalki…

ubuntu 20.04 server安装

ubuntu 20.04 server安装 ubuntu-20.04.6-live-server-amd64.iso 安装 安装ubuntu20.04 TLS系统后&#xff0c;开机卡在“A start job is running for wait for network to be Configured”等待连接两分多钟。 cd /etc/systemd/system/network-online.target.wants/在[Servi…

MF-SuP-pKa

子图层面的图网络预测pKa&#xff0c;使用了数据增强和迁移学习&#xff0c;原文&#xff1a;MF-SuP-pKa: Multi-fidelity modeling with subgraph pooling mechanism for pKa prediction&#xff0c;代码 MF-SuP-pKa&#xff0c;原文框架如下&#xff1a;

Python TCP服务端多线程接收RFID网络读卡器上传数据

本示例使用设备介绍&#xff1a;WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) #python通过缩进来表示代码块&#xff0c;不可以随意更改每行前面的空白&#xff0c;否则程序会运行错误&#xff01;&#xff01;&#xff01;如果缩进不…

Vue2基础-Vue对象介绍

文章目录 一、概念特点举例 二、模板语法插值语法指令语法v-bind数据绑定 三、组件el和data的两种写法 四、MVVM模型五、数据代理六、事件处理基本使用事件修饰符键盘按键 七、计算属性八、监听属性普通监视深度监视监视简写 九、监听与计算总结 一、概念 一套用于构建用户界面…

VMware17安装教程

1、双击安装包 2、等待进度条走满 3、点击下一步 4、点击我接受 下一步 5、修改安装目录 添加path路径 下一步 6、取消用户体验设置 下一步 7、点击下一步 8、 点击安装 9、等待进度条走满 10、点击许可证 输入秘钥 11、 点击输入秘钥 12、 点击完成 完成安装 此时已经完成了安…

CUDA学习笔记7——CUDA内存组织

CUDA内存组织 CUDA设备内存的分类与特征 内存类型物理位置访问权限可见范围生命周期1全局内存芯片外可读写所有线程和主机端由主机分配与释放2常量内存芯片外只读所有线程和主机端由主机分配与释放3纹理和表面内存芯片外一般只读所有线程和主机端由主机分配与释放4寄存器内存…

技术分享 | app自动化测试(Android)-- 特殊控件 Toast 识别

Toast 是 Android 系统中的一种消息框类型&#xff0c;它属于一种轻量级的消息提示&#xff0c;常常以小弹框的形式出现&#xff0c;一般出现 1 到 2 秒会自动消失&#xff0c;可以出现在屏幕上中下任意位置。它不同于 Dialog&#xff0c;它没有焦点。Toast 的设计思想是尽可能…

Java进击框架:Spring-数据存取(七)

Java进击框架&#xff1a;Spring-数据存取&#xff08;七&#xff09; 前言事务管理声明式事务管理 DAO支持JDBC的数据访问使用JdbcTemplate控制数据库连接JDBC批处理操作封装 SQL 语句中的参数 使用R2DBC进行数据访问对象关系映射(ORM)数据访问HibernateJPA XML模式 前言 参考…

渗透测试学习day2

文章目录 连接靶机靶机&#xff1a;Fawn 解题过程Task 1Task 2Task 3Task 4Task 5Task 6Task 7Task 8Task 9Task 10Task 11Task 12 总结 连接靶机 详细过程可参考day1 靶机&#xff1a;Fawn 难度&#xff1a;very easy &#xff08;ftp服务的靶机&#xff09; 解题过程 T…

23个优秀开源免费BI仪表盘

BI也称为商业智能&#xff0c;是收集、分析和展示数据以支持决策者做出明智的业务决策的过程。BI帮助组织将其原始的生产数据转化为有意义的见解或者知识&#xff0c;以推动其业务战略。BI能够为组织改善决策、提高效率和提升资源利用率。 BI仪表盘是BI系统的重要组成部分&…