首页 > 其他分享 >六、Playbook基本使用

六、Playbook基本使用

时间:2023-12-13 17:58:50浏览次数:28  
标签:基本 httpd task name section playbook 使用 home Playbook

六、Playbook基本使用

6.1 Playbook介绍

​ ansbile-playbook是一系列ansible命令的集合,利用yaml语言编写。playbook命令根据自上而下的顺序依次执行。同时,playbok开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制,这是Ansible adhoc是无法实现的。

adhoc与Playbook的区别?

​ adhoc是通过命令的方式执行ansible的任务,它一次只能执行一个任务,并且不能处理复杂的逻辑,如判断、循环。而playbook则是通过事先编写好的yaml文件来执行任务,它可以一次执行多个任务,并且可以对任务进行复杂的处理。简单的说,adhco与playbook的关系就像,Linux命令与shell脚本的关系。

6.2 YAML文件

6.2.1 YAML介绍

​ YAML是专门用来写配置文件的语言,非常简洁和强大,远比JSON格式方便。YAML 语言的设计目标,就是方便人类读写。
YAML Ain't Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。它的基本语法规则如下:

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • #表示注释,从#号一直到行尾。

6.2.2 YAML数据类型

  1. 纯量:纯量是最基本的,不可再分的值,包括
    • 字符串
    • 布尔值
    • 整数
    • 浮点数
    • Null
    • 时间
    • 日期
boolean: 
    - TRUE  #true,True都可以
    - FALSE  #false,False都可以
float:
    - 3.14
    - 6.8523015e+5  #可以使用科学计数法
int:
    - 123
    - 0b1010_0111_0100_1010_1110    #二进制表示
null:
    nodeName: 'node'
    parent: ~  #使用~表示null
string:
    - 哈哈
    - 'Hello world'  #可以使用双引号或者单引号包裹特殊字符
    - newline
      newline2    #字符串可以拆成多行,每一行会被转化成一个空格
date:
    - 2018-02-17    #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime: 
    -  2018-02-17T15:02:31+08:00    #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
  1. 数组:一组数据有序的排列,类似于python的列表。用-表示数组中的一个元素。
names:
  - zhangsan
  - lisi
  - wangwu

也可以写成python风格

names: ['zhangsan','lisi','wangwu']
  1. 对象:键和对的集合,用:分割键和对,类似于python的字典。
user1:
  name: zhangsan
  age: 25
  sex: man

也可以写成python风格。

user1: {'name': 'zhangsan','age': 25,'sex': 'man'}
  1. 嵌套结构:对象和数组嵌套使用。
users:
    - zhangsan:
         uid: 2000
         home: /home/zhangsan
         shell: /bin/bash
    - lisi:
         uid: 2001
         home: /home/lisi
         shell: /sbin/nologin
    - wangwu:
         uid: 2002
         home: /home/wangwu
         shell: /bin/bash

也可以写成python风格。

users: ['zhangsan': {'uid': 2000,'home': '/home/zhangsan','shell': '/bin/bash'},
        'lisi': {'uid': 2001,'home': '/home/lisi','shell': '/sbin/nologin'},
        'wangwu': {'uid': 2002,'home': '/home/wangwu','shell': '/bin/bash'}]

6.3 Playbook结构

​ playbook是由一个或多个play组成的列表。play的主要功能就是对一组主机应用play中定义好的task。从根本上来讲一个task就是对ansible一个module的调用。而将多个play按照一定的顺序组织到一个playbook中,我们称之为编排。

playbook主要有以下四部分构成:

  • Target section:用于定义将要执行playbook的远程主机组及远程主机组上的用户,还包括定义通过什么样的方式连接远程主机 (默认ssh)
  • Variable section:定义playbook运行时需要使用的变量
  • Task section:定义将要在远程主机上执行的任务列表
  • Handler section:定义task执行完成以后需要调用的任务

大概结构如下:

- name: play1			# play的描述
  hosts: webservers		# Target section
  vars:					# Variable section
		var xxx
  tasks:				# Task section
     	task xxx
  handlers:				# Handler section
    	handlers xxx
- name: play2			# 一个playbook可以写多个play
  hosts: dbservers
  vars:
		var xxx
  tasks:
     	task xxx
  handlers:
    	handlers xxx      

6.3.1 Target section

​ 在目标区域,我们可以通过hosts定义该play在哪些主机和主机组中执行,选择主机与组的方法与adhoc一致。

- name: install package
  hosts: dbservers,node1
  tasks:
         - name: install httpd
           yum:
                name: httpd
                state: present

​ 我们也可以指定远程的用户、以及远程的方式和端口,ansible.cfg中的配置均可在此定义,如指定远程的用户为root。

- name: install package
  hosts: dbservers,node1
  remote_user: root
  tasks:
         - name: install httpd
           yum:
                name: httpd
                state: present

6.3.2 Variable section

​ 在变量区域,我们可以使用两种方式定义变量,当然,ansible还有更多的方法定义变量,我们后边再讲。

  • vars:直接在playbook中定义变量
- name: test play
  hosts: all
  vars:
       username: root
       password: 123456
  • vars_files:使用变量文件,需要注意变量文件也要是yaml文件格式
[root@master ansible]# cat userinfo.yml 
username: root
password: 123456

调用变量文件

- name: test play
  hosts: all
  vars_files:
           - userinfo.yml

6.3.3 Task section

​ 任务区域是play的主体部分,他必须是一个任务列表,任务列表中的各任务按次序逐个在hosts中指定的所有主机上执行,在所有主机上完成第一个任务后再开始第二个。在自上而下运行某playbook时,如果中途发生错误,则整个playbook会停止执行,由于playbook的幂等性,playbook可以被反复执行,所以即使发生了错误,在修复错误后,再执行一次即可。

执行多个任务

 httpd
  hosts: all
  tasks:
          - name: install httpd
            yum:
                    name: httpd
                    state: present
          - name: start and enabled httpd
            systemd:
                    name: httpd
                    state: started
                    enabled: yes

​ 当有task执行过程中报错,整个playbook会立即停止运行,如果我们不想让错误终止playbook运行,我们可以在task中加入ignore_errors: yes来忽略报错。

- name: install httpd
  hosts: all
  tasks:
          - name: skip error
            shell: ls /var/www/html/index.html
            ignore_errors: yes
          - name: install httpd
            yum:
                    name: httpd
                    state: present

image-20230917214522272

6.3.4 Handler section

​ 在Ansible Playbook中,handler事实上也是个task,只不过这个task默认并不执行,只有在被触发时才执行。handler通过notify来监视某个或者某几个task,一但task执行成功,则触发handler执行相应操作。

​ handler会在所有的play都执行完毕之后才会执行,这样可以避免当handler监视的多个task执行结果都发生了变化之后而导致handler的重复执行 (handler只需要在最后执行一次即可)

- name: install httpd
  hosts: all
  tasks:
          - name: install httpd
            yum:
                    name: httpd
                    state: present
            notify: get_status
  handlers:
          - name: get_status
            debug:
                    msg: "This is handlers"

注意:handlers的name必须和notify定义的名称一致才行。

6.4 ansible-playbook常用选项

  1. 打印详细信息

    • -v:打印任务运行结果
    • -vv:打印任务运行结果以及任务的配置信息
    • -vvv:包含了远程连接的一些信息
    • -vvvv:v越多,输出的信息越详细,最多4个v
  2. playbook语法检测

ansible-playbook --syntax-check test.yml
  1. 测试运行playbook
ansible-playbook -C test.yml

测试运行,不会真的运行,可以用来检测playbook。

标签:基本,httpd,task,name,section,playbook,使用,home,Playbook
From: https://www.cnblogs.com/xxth/p/17899603.html

相关文章

  • 简单使用
    publicclassStateListenerimplementsApplicationListener<ContextRefreshedEvent>{@ResourceprivateConnectionFactoryconnectionFactory;@BeanpublicQueueserviceQueue(){returnnewQueue(SERVICE_QUEUE);}/**......
  • 除了Promise.all(),使用Promise.allSettled()方式请求,避免使用循环请求
    constgetFilePromises:Promise<any>[]=[];fileIds.forEach((item)=>{getFilePromises.push(getFileInfoApi({id:item}));});Promise.allSettled(getFilePromises).then((res)=>{this.fileList=res.map((item,index)=>......
  • VSCode 中使用 AI智能编程工具的几个小妙招
    可能你已经在IDE中安装了CodeGeeX,也了解到CodeGeeX能够帮助你编写代码、调试问题、创建文档,生成单元测试等。但是总有些“Wow!”时刻,还在等你发现。今天就介绍几个CodeGeeX插件在VSCode中的使用技巧和小窍门。一、侧边栏放右边,效率倍增默认情况下,CodeGeeX插件在VSCode中成功安装......
  • websocket使用
    WEBSocket(客户端和服务器能够双向同时传输数据):应用层协议,客户端和服务器建立连接时采用http握手方式,建立连接后利用http协议的Upgrade属性将协议变更为WebSocket协议(通过TCP协议来传输数据)http和websocket相同点:1都是建立在TCP之上,通过TCP协议来传输数据;2都是可靠性传输协议......
  • Asp.net core Net6.0 Webapi 项目如何优雅地使用内存缓存
    前言缓存是提升程序性能必不可少的方法,Asp.netcore支持多级缓存配置,主要有客户端缓存、服务器端缓存,内存缓存和分布式缓存等。其中客户端缓和服务器端缓存在使用上都有比较大的限制,而内存缓和分布式缓存则比较灵活。内存缓存就是一种把缓存数据放到应用程序内存中的机制。本......
  • 使用element 2.14 实现表格虚拟滚动组件
    下述代码为组件实现代码复制即可食用,默认只展示一屏数据加两条全选存在些许问题,使用row-key时,如果行过多滚动时会不会很流畅特别需要注意的是行高必须要保持一致<template><divclass="t-table":id="TTableId"><el-tableref="el-table":tooltip-......
  • 大数据企业怎样使用IP代理进行数据抓取
    前言大数据企业通常需要从各种网站和在线平台上进行数据抓取和数据挖掘。然而,许多网站限制了对其内容的访问,使用IP代理是一种常见的解决方案。在本文中,我将介绍大数据企业如何使用IP代理进行数据抓取,并提供相应的代码示例。一、什么是IP代理IP代理是一种允许用户通过第三方服务器......
  • SQLite的下载和配置使用
    特性SQLite的设计目的是嵌入式SQL数据库引擎,它基于纯C语言代码,已经应用于非常广泛的领域内。SQLite在需要长时间存储时可以直接读取硬盘上的数据文件(.db),在无须长时间存储时也可以将整个数据库置于内存中,两者均不需要额外的服务器端进程,即SQLite是无须独立运行的数据库引......
  • Linux系统中curl命令使用笔记
    在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,用来请求Web服务器,它的名字就是客户端(client)的URL工具的意思,可以说是一款很强大的http命令行工具,它支持文件的上传和下载,是综合传输工具。可以看出它的参数非常多,a-z的字母,几乎都用到了,参数这么说,功能肯定很强大......
  • 项目使用第三方jar包SDK
    方式一、使用IDEA程序引入jar包1、首先,点他! 2、然后,点他! 3、再然后,点他! 4、最后,在这里选择自己需要上传的Jar包,收工结束!方式二、通过Maven添加到本地仓库,然后在运用依赖导入项1、首先,找到自己所在jar包的目录并输入cmd唤出控制台  2、然后,根据实际情况在控制台......