【playbook】

2024-03-16 03:44
文章标签 playbook

本文主要是介绍【playbook】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

playbook 特点

  • playbook 剧本是由一个或多个"play"组成的列表

  • play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作

  • Playbook 文件是采用YAML语言编写

YAML 语言介绍

YAML:YAML Ain't Markup Language,即YAML不是标记语言。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)

YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者,目前很多最新的软件比较流行采用此格式的文件存放配置信息,如:ubuntu,anisble,docker,kubernetes等

YAML 官方网站:The Official YAML Web Site

ansible 官网: YAML Syntax — Ansible Documentation

YAML 语言特性

- YAML的可读性好
- YAML和脚本语言的交互性好
- YAML使用实现语言的数据类型
- YAML有一个一致的信息模型
- YAML易于实现
- YAML可以基于流来处理
- YAML表达能力强,扩展性好

YAML语法简介

  • 在单一文件第一行,用连续三个连字号"-" 开始,还有选择性的连续三个点号( ... )用来表示文件的结尾

  • 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能

  • 使用#号注释代码

  • 缩进必须是统一的,不能空格和tab混用

  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的

  • YAML文件内容是区别大小写的,key/value的值均需大小写敏感

  • 多个key/value可同行写也可换行写,同行使用,分隔

  • key后面冒号要加一个空格 比如: key: value

  • value可是个字符串,也可是另一个列表

  • YAML文件扩展名通常为yml或yaml

支持的数据类型

- YAML 支持以下常用几种数据类型:
- 标量:单个的、不可再分的值
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

Playbook 核心组件

一个playbook 中由多个组件组成,其中所用到的常见组件类型如下:

  • Hosts 执行的远程主机列表

  • Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最少元素需包括 name 和 task,一个name只能包括一个task

  • Variables 内置变量或自定义变量在playbook中调用

  • Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件

  • Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行

  • tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断

tips
#查看模块 用ansible-doc  加上 模块名  可以查看模块的使用方法和例子
ansible-doc yum
host 组件

Hosts: playbook 中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用 于指定要执行指定任务的主机,须事先定义在主机清单中

one.example.com one.example.com:two.example.com 192.168.1.50
192.168.1.*
Websrvs:dbsrvs	#或者,两个组的并集W
ebsrvs:&dbsrvs	#与,两个组的交集
webservers:!dbsrvs	#在websrvs组,但不在dbsrvs组

remote_user 组件

remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户

- hosts: websrvs remote_user: roottasks:- name: test connection ping:remote_user: wangsudo: yes#默认sudo为rootsudo_user:wang#sudo为wang
task列表和action组件

play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task

task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。 如果未提供name,则action的结果将用于输出。

task两种格式:
action: module arguments	
#示例: action: shell wall hellomodule: arguments	
#示例: shell: wall hello注意:shell和command模块后面跟命令,而非key=value 
案例(yml文件)
---
# first yaml file
- hosts: webremote_user: rootgather_facts: no	#不收集系统信息,提高执行效率tasks:- name: test network connection ping:- name: excute command command: wall "hello world!"
案例1 新建mysql用户
---
- hosts: webtasks:- name: create useruser: name=test uid=2000  shell=/sbin/nologin  system=yes create_home=no
案例2 安装httpd并启动
---
- hosts: websrvs remote_user: rootgather_facts: notasks:-name: install httpd yum: name=httpd-name: start httpdservice: name=httpd state=started enabled=yes
案例3安装nginx并启动
---
- hosts: webtasks:- name: Add repositoryyum_repository:name: epeldescription: EPEL YUM repobaseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/gpgcheck: no- name: install nginxyum: name=nginx  state=present- name: config filecopy: src=/data/nginx.conf   dest=/etc/nginx/nginx.conf- name: web pagecopy: src=/data/index.html  dest=/usr/share/nginx/html/index.html- name: start nginxservice: name=nginx state=started enabled=yes
案例4 停止服务,并卸载nginx
---
- hosts: webtasks:- name: stop nginxservice: name=nginx state=stopped- name: remove nginxyum: name=nginx  state=absent
Handlers notify

Handlers本质是task list ,类似于MySQL中的触发器触发的行为,其中的task与前述的task并没有本质上的不同,主要用于当关注的资源发生变化时,才会采取一定的操作。而Notify对应的action可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作

注意:

  • 如果多个task通知了相同的handlers, 此handlers仅会在所有tasks结束后运行一 次。

  • 只有notify对应的task发生改变了才会通知handlers, 没有改变则不会触发handlers

  • handlers 是在所有前面的tasks都成功执行才会执行,如果前面任何一个task失败,会导致handler跳过执行,可以使用force_handlers: yes 强制执行handler

例子:

---
- hosts: webgather_facts: no
​tasks:- name: add groupgroup: name=nginx state=present- name: add useruser: name=nginx state=present group=nginx- name: web pagecopy: src=/etc/yum.repos.d/epel.repo  dest=/etc/yum.repos.d- name: install nginxyum: name=epel-release.noarchyum: name=nginx  state=present- name: config  filecopy: src=/data/nginx.conf  dest=/etc/nginx/notify:- restart nginx- name: web pagecopy: src=/data/index.html  dest=/usr/share/nginx/html- name: start nginxservice: name=nginx state=started  enabled=yes

3.3.5第一个 yml文件
---
#第一个playbook
​
- hosts: webtasks:- name: pingping:- name: wallshell: wall hello
 
######辅助设置################
[root@localhost ~]#vim .vimrc 
set ai ts=2 sw=2
####################################
​
​
##########################检查语法#####################################################
[root@localhost data]#ansible-playbook --help |grep check#检查语法[--skip-tags SKIP_TAGS] [-C] [--syntax-check] [-D]--syntax-check        perform a syntax check on the playbook, but do not-C, --check           don't make any changes; instead, try to predict somedifferences in those files; works great with --check
​
ansible-playbook --syntax-check f.yml 
ansible-playbook -C f.yml 
####################################################################################
​
​
############            运行             #####################
[root@localhost data]#ansible-playbook f.yml
#加playbook ---
#第一个playbook
​
- hosts: webgather_facts: no #收集信息,当不使用时可以不收集加快速度tasks:- name: pingping:- name: wallshell: wall hello
​
​
- hosts: cloud
​tasks:- name: install httpdyum:name: httpd- name: start httpdservice:name: httpdstate: startedenabled: yes
​
playbook 命令

ansible-playbook <filename.yml> ... [options]

--syntax-check      #语法检查,可缩写成--syntax, 相当于bash -n 
-C --check #模拟执行,只检测可能会发生的改变,但不真正执行操作,dry run 
--list-hosts    #列出运行任务的主机
--list-tags #列出tag
--list-tasks #列出task
--limit 主机列表 #只针对主机列表中的特定主机执行
-i INVENTORY        #指定主机清单文件,通常一个项对应一个主机清单文件
--start-at-task START_AT_TASK #从指定task开始执行,而非从头开始,START_AT_TASK为任务的name
-v -vv  -vvv #显示过程

[root@localhost ~]#vim .vimrc 
set ai ts=2 sw=2
其中ai:自动换行;ts:tab的字符长度;sw:空格的长度    1 yum安装httpd   2 service 开启服务   3 copy 传一个 主页文件过去  4能访问
---
# this is a test file
​
- hosts: kg         remote_user: rootgather_facts: no   tasks:- name: pingping:- name: testshell: wall hello
​
#创建用户
- hosts: accpgather_facts: no
​tasks:- name: create useruser:name: mysqlshell: /sbin/nologinsystem: yescreate_home: no
​
​
​
​
​
​
[root@localhost ~]#ansible-playbook --help
[root@localhost ~]#ansible-playbook --syntax-check hello.yml 
#语法检查
​
playbook: hello.yml
[root@localhost ~]#ansible-playbook -C hello.yml
- hosts: accp
​tasks:- name: install httpdyum: name=httpd- name: start httpdservice: name=httpd state=started enabled=yes
​
​
- hosts: webtasks:- name: install httpdyum:name: httpd- name: config filecopy:src: files/index.htmldest: /var/www/html- name: start httpdservice:name: httpdstate: startedenabled: yes- name: stop firewalldservice:name: firewalldstate: stoppedenabled: no
​
​
ansible all -m yum -a 'name=httpd state=absent'
#卸载httpd
​
- hosts: webremote_user: rootgather_facts: no
​tasks:- name: add group nginxgroup:name: nginxstate: present- name: add user nginxuser:name: nginxstate: presentgroup: nginx- name: Install Nginxyum:name: nginxstate: present- name: web pagecopy:src: files/index.htmldest: /usr/share/nginx/html/index.html- name: Start Nginxservice:name: nginxstate: startedenabled: yes

ignore_errors

如果一个task出错,默认将不会继续执行后续的其它task

利用 ignore_errors: yes 可以忽略此task的错误,继续向下执行playbook其它task

[root@ansible ansible]#cat test_ignore.yml
---
- hosts: websrvstasks:- name: errorcommand: /bin/falseignore_errors: yes- name: continuecommand: wall continue

Playbook中使用handlers和notify

Handlers本质是task list ,类似于MySQL中的触发器触发的行为,其中的task与前述的task并没有本质上的不同,主要用于当关注的资源发生变化时,才会采取一定的操作。而Notify对应的action可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作

注意:

  • 如果多个task通知了相同的handlers, 此handlers仅会在所有tasks结束后运行一 次。

  • 只有notify对应的task发生改变了才会通知handlers, 没有改变则不会触发handlers

  • handlers 是在所有前面的tasks都成功执行才会执行,如果前面任何一个task失败,会导致handler跳过执行,可以使用force_handlers: yes 强制执行handler

- hosts: webtasks:- name: install httpdyum:name: httpd- name: config filecopy:src: files/httpd.confdest: /etc/httpd/conf/notify: restart httpd- name: start httpdservice:name: httpdstate: startedenabled: yes- name: stop firewalldservice:name: firewalldstate: stoppedenabled: no
​handlers:- name: restart httpdservice:name: httpdstate: restarted

这篇关于【playbook】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/814182

相关文章

day32(学习playbook-roles+脚本创建数据库和表+mycat读写分离))

一、 1.roles(角色)介绍         roles(⻆⾊): 就是通过分别将variables, tasks及handlers等放置于单独 的⽬录中,并可以便捷地调⽤它们的⼀种机制。          假设我们要写⼀个playbook来安装管理lamp环境,那么这个 playbook就会写很⻓。所以我们希望把这个很⼤的⽂件分成多个功能 拆分, 分成apache管理,php管理,mys

培训第三十二天(学习playbook-roles,脚本创建数据库和表,mycat读写分离)

上午 1、roles(角色)介绍 roles(⻆⾊): 就是通过分别将variables, tasks及handlers等放置于单独 的⽬录中,并可以便捷地调⽤它们的⼀种机制。 假设我们要写⼀个playbook来安装管理lamp环境,那么这个 playbook就会写很⻓。所以我们希望把这个很⼤的⽂件分成多个功能 拆分, 分成apache管理,php管理,mysql管理,然后在需要使⽤的时候

playbook(剧本)基本应用、playbook常见语法、playbook和ansible操作的编排

playbook(剧本): 是ansible⽤于配置,部署,和管理被控节点的剧本。⽤ 于ansible操作的编排。 使⽤的格式为yaml格式 一、YMAL格式 以.yaml或.yml结尾 ⽂件的第⼀⾏以 "---"开始,表明YMAL⽂件的开始(可选的) 以#号开头为注释 列表中的所有成员都开始于相同的缩进级别, 并且使⽤⼀个 "- " 作为开头(⼀个横杠和⼀个空格) ⼀个字典是由⼀个简

8.19-ansible中模块的使用+playbook的应用

一、ansible 1.scripts模块 script模块⽤于在远程机器上执⾏本地脚本。 [root@m0 ~]# vim test000.sh#!/bin/bashmkdir /tmp/threetouch /tmp/three/testecho 'i am echo,at mttt' > /tmp/three/testecho 'well done'[root@m0 ~]#

Ansible自动化运维工具 playbook 剧本

一、Playbooks 1. playbooks 介绍 Playbooks(剧本)是一种用于定义自动化任务的文件,通常与诸如Ansible等工具相关联。它们以YAML格式编写,包含了一系列有组织的任务,这些任务可以在远程计算机上执行。一个Playbook通常包含多个"Plays"(执行步骤),每个"Play"又包含多个"Tasks"(任务)。每个任务指定要执行的操作,例如安装软件包、复制文件或

Ansible03-Ansible Playbook剧本详解

目录 写在前面5. Ansible Playbook 剧本5.1 YAML语法5.1.1 语法规定5.1.2 示例5.1.3 YAML数据类型 5.2 Playbook组件5.3 Playbook 案例5.3.1 Playbook语句5.3.2 Playbook1 分发hosts文件5.3.3 Playbook2 分发软件包,安装软件包,启动服务5.3.3.1 任务拆解5.3.3.2 步骤变

Ansible主机清单与playbook 剧本

一、inventory 主机清单         Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内。 如果是名称类似的主机,可以使用列表的方式标识各个主机。 vim /etc/ansible/hosts[webservers]192.168.80.11:2222 #冒号后定义远程连接端口,默认是 ssh 的 22 端口19

Ansible剧本playbook之--------Templates 模块、roles角色详细解读

目录 一、Templates 模块 1.1准备模板文件并设置引用的变量 1.2修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量 1.3编写 playbook  1.4ansible主机远程查看修改参数 1.5验证 二、tags 模块 always应用 三、Roles 模块 3.1roles 的目录结构 3.2roles 内各目录含义解释 3.2.1fil

Ansible-inventory和playbook

文章目录 一、inventory 主机清单1、列表表示2、inventory 中的变量3、变量3.1 主机变量3.2 组变量3.3 组嵌套 二、playbook剧本1、playbook的组成2、编写剧本2.1 剧本制作2.2 准备nginx.conf2.3 运行剧本2.4 查看webservers服务器2.5 补充参数 3、剧本定义、引用变量3.1 剧本制作3.2 运行剧本3.3 查看db

Ansible——playbook编写

一、简介 1.什么是playbook  Ansible Playbook 是设定自动化任务的一种蓝图,可在无需人工干预或有限干预的前提下执行复杂的 IT 操作。Ansible Playbook 对一组或一类共同构成 Ansible 清单的主机执行。         Ansible Playbook 本质上是一些框架,是一些预先编写的代码,开发人员可以用作临时模板或起始模板。Ansible P