【Ansible】Ansible自动化运维工具之playbook剧本

playbook

  • 一、playbook 的概述
    • 1. playbook 的概念
    • 2. playbook 的构成
  • 二、playbook 的应用
    • 1. 安装 httpd 并启动
    • 2. 定义、引用变量
    • 3. 指定远程主机 sudo 切换用户
    • 4. when条件判断
    • 5. 迭代
    • 6. Templates 模块
      • 6.1 添加模板文件
      • 6.2 修改主机清单文件
      • 6.3 编写 playbook
    • 7. tags 模块
  • 总结
    • 1. playbook 剧本


一、playbook 的概述

1. playbook 的概念

  简单来说,playbooks是一种简单的配置管理系统与多机器部署系统的基础。与现有的其他系统有不同之处,且非常适合复杂应用的部署。

  Playbooks 可用于声明配置,更强大的地方在于,playbooks可以编排有序的去执行过程,甚至做到多组机器间来回有序的执行特别指定的步骤,并且可以同步或异步的发起任务。

2. playbook 的构成

  playbooks 本身由以下各部分组成:

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

二、playbook 的应用

1. 安装 httpd 并启动

#创建一个目录用来存放 playbooks 的文件
cd /etc/ansible/
mkdir playbooks

在这里插入图片描述

#编写 playbooks 文件
vim test1.yaml
---     #yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: first play     #定义一个play的名称,可省略
  gather_facts: false    #设置不进行facts信息收集,这可以加快执行速度,可省略
  hosts: webservers    #指定要执行任务的被管理主机组,如多个主机组用冒号分隔
  remote_user: root    #指定被管理主机上执行任务的用户
  tasks:     #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行
   - name: test connection    #自定义任务名称
     ping:     #使用 module: [options] 格式来定义一个任务
   - name: disable selinux
     command: '/sbin/setenforce 0'    #command模块和shell模块无需使用key=value格式
     ignore_errors: True     #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务
   - name: disable firewalld
     service: name=firewalld state=stopped    #使用 module: options 格式来定义任务,option使用key=value格式
   - name: install httpd
     yum: name=httpd state=latest
   - name: install configuration file for httpd
     copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf    #这里需要一个事先准备好的/opt/httpd.conf文件
     notify: "restart httpd"    #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
   - name: start httpd service
     service: enabled=true name=httpd state=started
  handlers:     #handlers中定义的就是任务,此处handlers中的任务使用的是service模块
   - name: restart httpd    #notify和handlers中任务的名称必须一致
     service: name=httpd state=restarted
##Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。

在这里插入图片描述

#运行playbook
ansible-playbook test1.yaml

-------------------------------------------------
#补充参数:
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
-------------------------------------------------

ansible-playbook test1.yaml --syntax-check    #检查yaml文件的语法是否正确
ansible-playbook test1.yaml --list-task       #检查tasks任务
ansible-playbook test1.yaml --list-hosts      #检查生效的主机
ansible-playbook test1.yaml --start-at-task='install httpd'     #指定从某个task开始运行

在这里插入图片描述

2. 定义、引用变量

- name: second play
  hosts: dbservers
  remote_user: root
  vars:                 #定义变量
   - groupname: mysql   #格式为 key: value
   - 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}}" dest=/opt/vars.txt    #在setup模块中可以获取facts变量信息

在这里插入图片描述

ansible-playbook test2.yaml -e "username=nginx"     #在命令行里定义变量

在这里插入图片描述

3. 指定远程主机 sudo 切换用户

- name: third play
  hosts: dbservers
  remote_user: nginx            
  become: yes	                 #2.6版本以后的参数,之前是sudo,意思为切换用户运行
  become_user: root              #指定sudo用户为root

在这里插入图片描述

#目标主机添加用户并提权
vim /etc/sudoers
nginx   ALL=ALL

在这里插入图片描述

#运行playbook
ansible-playbook test3.yml -k -K 

在这里插入图片描述

4. when条件判断

  在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。

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

vim test4.yaml
---
- hosts: all
  remote_user: root
  tasks:
   - name: shutdown host 
     command: /sbin/shutdown -r now
     when: ansible_default_ipv4.address == "192.168.145.30"      #when指令中的变量名不需要手动加上 {{}}when: inventory_hostname == "<主机名>

在这里插入图片描述

#运行playbook
ansible-playbook test4.yaml

在这里插入图片描述

5. 迭代

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

vim test5.yaml
---
- name: play1
  hosts: dbservers
  gather_facts: false
  tasks: 
    - name: create file
      file:
        path: "{{item}}"
        state: touch
      with_items: [ /opt/a, /opt/b, /opt/c, /opt/d ]

在这里插入图片描述

#运行playbook
ansible-playbook test5.yaml

在这里插入图片描述

- name: play2
  hosts: dbservers
  gather_facts: false		
  vars:
    test:
    - /tmp/test1
    - /tmp/test2
    - /tmp/test3
    - /tmp/test4
  tasks: 
    - name: create directories
      file:
        path: "{{item}}"
        state: directory
      with_items: "{{test}}"

在这里插入图片描述

#运行playbook
ansible-playbook test5.yaml

在这里插入图片描述

6. Templates 模块

  Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。

6.1 添加模板文件

#先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量。
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2

vim /opt/httpd.conf.j2
Listen {{http_port}}				#42行,修改
ServerName {{server_name}}			#95行,修改
DocumentRoot "{{root_dir}}"          #119行,修改

在这里插入图片描述

6.2 修改主机清单文件

#修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量
vim /etc/ansible/hosts       
[webservers]
192.168.145.30 http_port=192.168.145.30:80 server_name=www.accp.com:80 root_dir=/etc/httpd/htdocs

[dbservers]
192.168.145.45 http_port=192.168.145.45:80 server_name=www.benet.com:80 root_dir=/etc/httpd/htdocs

在这里插入图片描述

6.3 编写 playbook

vim apache.yaml
---
- hosts: all
  remote_user: root
  vars:
    - package: httpd
    - service: httpd
  tasks:
    - name: install httpd package
      yum: name={{package}} state=latest
    - name: install configure file
      template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf     #使用template模板
      notify:
        - restart httpd
    - name: create root dir
	  file: path=/etc/httpd/htdocs state=directory
    - name: start httpd server
      service: name={{service}} enabled=true state=started
  handlers:
    - name: restart httpd
      service: name={{service}} state=restarted

在这里插入图片描述

#运行playbook
ansible-playbook apache.yaml

在这里插入图片描述

7. tags 模块

  可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用–tags选项能实现仅运行指定的tasks。

  playbook还提供了一个特殊的tags为always。作用就是当使用always作为tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。

vim webhosts.yaml
---
- hosts: webservers
  remote_user: root
  tasks:
    - name: Copy hosts file
      copy: src=/etc/hosts dest=/opt/hosts
      tags:
      - only     #可自定义
    - name: touch file
      file: path=/opt/testhost state=touch
	  tags:
	  - always    #表示始终要运行的代码

在这里插入图片描述

#运行playbook
ansible-playbook webhosts.yaml --tags="only"

在这里插入图片描述

vim dbhosts.yaml
---
- hosts: dbservers
  remote_user: root
  tasks:
    - name: Copy hosts file
      copy: src=/etc/hosts dest=/opt/hosts
      tags:
        - only
    - name: touch file
      file: path=/opt/testhost state=touch

在这里插入图片描述

#运行playbook
ansible-playbook dbhosts.yaml --tags="only"

在这里插入图片描述

#分别去两台被管理主机上去查看文件创建情况

在这里插入图片描述

总结

1. playbook 剧本

vim xxx.ymal
- name: 					#指定play名称
  hosts: 					#指定主机组
  remote_user:				#执行用户
  gather_facts: treu/false	#是否收集远程主机facts信息
  vars:						#定义变量
  tasks:					#定义任务列表
  - name:					#定义任务名称
    模块:					   #定义任务使用的模块和参数
    with_items:				#定义循环
    when:					#定义判断条件(== != >= <= <),true则执行任务,否则不执行任务
    ignore_errors: true		#忽略任务失败
    notify:					#定义task任务changed状态时触发的任务名
    tags: 					#指定标签,ansible-playbook --tags 仅执行拥有指定tags标签的任务(always标签总会执行)
  handlers:					#定义notify触发的任务列表
task任务 模块语法格式:

#横向格式:
模块名:参数选项1=值 参数选项2={{变量名}}  ...

#纵向格式
模块名:
  参数选项1: 值
  参数选项2: "{{变量名}}"
  ...
with_items 和 变量 的语法格式
#横向格式:
with_items: ["值1","值2","值3"]
#纵向格式:
with_items:
-1
-2
-3
----------------------------------------------
值为对象(键值对字段)时:
#横向格式:
with_items :
- { key1 : value1, key2 : value2, ... }
- { key1 : value3, key2 : value4, ... }
#纵向格式:
with_items:
- key1: value1
  key2: value2
- key1: value3
  key2: value4

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

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

相关文章

谈一谈缓存穿透,击穿,雪崩

缓存穿透 缓存穿透是指在使用缓存系统时&#xff0c;频繁查询一个不存在于缓存中的数据&#xff0c;导致这个查询每次都要通过缓存层去查询数据源&#xff0c;无法从缓存中获得结果。这种情况下&#xff0c;大量的请求会直接穿透缓存层&#xff0c;直接访问数据源&#xff0c;…

GLM模型介绍

paper: 《GLM: General Language Model Pretraining with Autoregressive Blank Infilling》 摘要&#xff1a; 我们提出了一个基于自回归空白填充的通用语言模型&#xff08;GLM&#xff09;来解决这一挑战。GLM通过添加2D位置编码和允许任意顺序预测跨度来改进空白填充预训…

视频媒体有哪些?视频媒体采访服务怎么做?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 一&#xff0c;在国内&#xff0c;主流的视频媒体包括&#xff1a; 1. 电视台&#xff1a;包括国家级、地方性和专业性电视频道&#xff0c;涵盖各类新闻、综艺、娱乐、体育等节目。 2…

Linux下 Docker容器引擎基础(2)

目录 创建私有仓库 将修改过的nginx镜像做标记封装&#xff0c;准备上传到私有仓库 将镜像上传到私有仓库 从私有仓库中下载镜像到本地 CPU使用率 CPU共享比例 CPU周期限制 CPU 配额控制参数的混合案例 内存限制 Block IO 的限制 限制bps 和iops 创建私有仓库 仓库&a…

数据结构--基础知识

数据结构是什么&#xff1f; 数据结构是计算机科学中研究数据组织、存储和管理的方法和原则。它涉及存储和操作数据的方式&#xff0c;以便能够高效地使用和访问数据。 相关内容 基本组成 数组&#xff08;Array&#xff09;&#xff1a;数组是一种线性数据结构&#xff0c;…

为什么需要智能工业自动化网络?如何搭建?

在当今快节奏的社会中&#xff0c;工业自动化变得越来越重要。传统的手动操作和生产方式已经不能满足现代工业的需求。因此&#xff0c;建设工业自动化已成为一个必然趋势。通过不断进步的新技术创建更高效、更可靠、更安全的智能工业自动化网络。在本文中&#xff0c;我们将讨…

RS232转Profinet网关怎么设置

关于如何使用RS232转Profinet网关将首昌的EDI-800A称重仪表接入到西门子PLC的Profinet网络中。这个故事不仅涉及到一些科技知识&#xff0c;还有实际操作的过程&#xff0c;希望大家能认真听哦。 我们都知道&#xff0c;工业自动化领域中&#xff0c;称重仪表是非常重要的一部…

springboot通过springdata整合es7.x

首先要明确通过springdata操作es必须要将版本号和es的版本号对应上&#xff0c;否则会报错&#xff08;倒不用完全一一对应&#xff0c;但版本号最好不要相差太多&#xff09;。springdata引入的版本号由springboot的版本号决定&#xff0c;对应关系如下&#xff1a; 这里我用…

这篇文章算是讲清楚了 弹性布局(display:flex;)属性详解

Flexbox 是 flexible box 的简称&#xff08;注&#xff1a;意思是“灵活的盒子容器”&#xff09;&#xff0c;是 CSS3 引入的新的布局模式。它决定了元素如何在页面上排列&#xff0c;使它们能在不同的屏幕尺寸和设备下可预测地展现出来。 它之所以被称为 Flexbox &#xff0…

HCIP中期考试实验

考试需求 1、该拓扑为公司网络&#xff0c;其中包括公司总部、公司分部以及公司骨干网&#xff0c;不包含运营商公网部分。 2、设备名称均使用拓扑上名称改名&#xff0c;并且区分大小写。 3、整张拓扑均使用私网地址进行配置。 4、整张网络中&#xff0c;运行OSPF协议或者BGP…

[MAUI 项目实战] 手势控制音乐播放器:圆形进度条

我们将绘制一个圆形的音乐播放控件&#xff0c;它包含一个圆形的进度条、专辑页面和播放按钮。 关于图形绘制 使用MAUI的绘制功能&#xff0c;需要Microsoft.Maui.Graphics库。 Microsoft.Maui.Graphics 是一个实验性的跨平台图形库&#xff0c;它可以在 .NET MAUI 中使用。它…

用html+javascript打造公文一键排版系统9:主送机关排版

一、主送机关的规定 公文一般在标题和正文之间还有主送机关&#xff0c;相关规定为&#xff1a; 主送机关 编排于标题下空一行位置&#xff0c;居左顶格&#xff0c;回行时仍顶格&#xff0c;最后一个机关名称后标全角冒号。如主送机关名称过多导致公文首页不能显示正文时&…

使用elementplus实现文本框的粘贴复制

需求&#xff1a; 文本框仅用于显示展示数据并且用户可以进行复制&#xff0c;并不会进行修改和编辑&#xff0c; 注意点&#xff1a; 1.首先且文本为多行。所以不能使用普通的el-input&#xff0c;这种一行超出就会隐藏了&#xff0c;如果多行超出行数也会隐藏&#xff08;…

uniApp 对接安卓平板刷卡器, 读取串口数据

背景: 设备: 鸿合 电子班牌 刷卡对接 WS-B22CS, 安卓11; 需求: 将刷卡器的数据传递到自己的App中, 作为上下岗信息使用, 以完成业务; 对接方式: 1. 厂家技术首先推荐使用 接收自定义广播的方式来获取, 参考代码如下 对应到uniApp 中的实现如下 <template><view c…

【AltWalker】模型驱动:轻松实现自动化测试用例的生成和组织执行

目录 模型驱动的自动化测试 优势 操作步骤 什么是AltWalker&#xff1f; 安装AltWalker 检查是否安装了正确的版本 牛刀小试 创建一个测试项目 运行测试 运行效果 在线模型编辑器 VScode扩展 本地部署 包含登录、选择产品、支付、退出登录的模型编写 模型效果 1…

SVN代码迁移到Git方法

1.在SVN上新增一个项目 一、点击新建项目 二、创建空白项目 三、填入项目信息 四、myProject项目模板创建成功 2.将代码提交到Git 一、新建一个文件夹myProject&#xff0c;将从SVN下载过来的代码复制一份拷贝到该文件夹下&#xff0c;注意&#xff1a;不要把.SVN文件拷…

2023年第四届“华数杯”数学建模思路 - 案例:感知机原理剖析及实现

# 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法&#xff0c;其原理可以看下图&#xff1a; 比如说我们有一个坐标轴&#xff08;图中的…

【python爬虫】获取某一个网址下面抓取所有的a 超链接下面的内容

import requests as rq from bs4 import BeautifulSoup as bs import re# rooturl是传的是我需要查询和抓取的一个网址&#xff0c;可以是html js 等 def gethtml(rooturl, encoding"utf-8"):#默认解码方式utf-8response rq.get(rooturl)response.encoding encodin…

解决Mysql报错2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)

1.找到mysql文件夹&#xff0c;将my,ini文件放入bin文件夹 2.管理员模式打开cmd 3.输入netstat -ano查看端口占用情况&#xff0c;这里我已经开启mysql应用&#xff0c;所以会有3306&#xff0c;如果没有开启是不会有的 4.输入sc delete mysql&#xff0c;删除mysql服务 5.将…

redis的安装和配置

一、nosql 二、redis的安装和配置 redis的安装&#xff1a; redis常见配置&#xff1a; 配置文件redis.conf