playbook介绍

来源:互联网 发布:windows basic配色方案 编辑:程序博客网 时间:2024/05/18 12:40

本文介绍了YAML,playbook的概念,特点,元素,组件,以及运行playbook。


简介

playbook — 跑剧本

playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。


YAML

YAML是一个可读性高的用来资料序列的格式。YAML参考了多种编程语言,包括:XML,C,Python,Perl等。

YAML的特点

可读性好和脚本语言的交互性好使用实现语言的数据类型易于实现可基于流来处理表达能力强,扩展性好

YAML的用途


由于实现简单,解析成本低,YAML适合作为脚本语言使用


YAML比较适合做序列化。因为它是宿主语言数据类型直转的。


写YAML要比写XML快得多(无需关注标签或引号),并且比ini文档功能更强。


其很强的阅读性,用于调试过程中dump出信息供分析也是一种比较方便的做法。

YAML的缺陷

YAML没有定义自己的数据类型,而是使用实现语言的数据类型,所以一个YAML文件,在不同的语言中解析后得到的数据类型可能不同,导致出现不同语言间数据流转出现兼容性问题。

YAML的格式

YAML的结构通过空格以类似大纲的缩进排列方式展示,序列中的连续项用 - 加空格代表,map中的键值对用 : 分隔。

下面是一个结构示例:

- hosts:172.25.254.251          //定义主机vars:           //定义变量    var1:value    var2:valuetasks:         //定义任务    - name:     //后面输入任务名称,并且可使用模块来执行具体任务handlers:       //定义触发通知所做的操作。和tasks一样,用模块定义任务    - name:remote_user:    //远程主机执行任务时的用于(一般无需指定,默认为root)

YAML的扩展名为.yaml.yml,例如test.yaml

YAML示例

- name:test.yaml  hosts:test        //定义主机组  vars:    worker_processes:4      //进程数为4    max_open_file:65535     //最多打开65535个文件    remote_user:root        //远程主机以root身份执行任务(可以不定义)  tasks:        //定义任务    - name:ensure apache is the latest version. //任务名称        yum:pkg=httpd state=latest  //调用yum模块检测apache是否为最新,否则安装为最新。    - name:create apache config file.        template:src=/usr/local/amsible/template/apache.j2 dest=/etc/httpd/http.conf        notify:     //调用handlers中的内容            - restart apache    //handlers中定义的名字    - name:ensure apache is running        service:name=httpd state=started  handlers:     //也是一些task的列表,通过名字来引用,它们和一般的task并没有什么区别。    - name:restart apache        service:name=httpd state=restart

1、notify这个action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作

2、handlers 由通知者进行 notify, 如果没有被 notify,handlers 不会执行。不管有多少个通知者进行了 notify,等到play中的所有task执行完成之后,handlers 也只会被执行一次。handlers 最佳应用场景是用来重启服务,或者触发系统重启操作。除此以外很少用到了。

个人觉得这个yaml的写法让我想起了puppet中的site.pp文件的写法,两者真的十分相似,基本上就是定义一个任务名,然后下边就是调用具体模块完成任务。可以将两者对比着看吧


Playbook

核心元素

Tasks:任务,由模板定义的操作列表

Variables:变量

Templates:模板,即使用模板语法的文件

Handlers:由特定条件触发的Tasks

Roles:角色

组成

Target section: 定义将要执行 playbook 的远程主机组

Variable section:定义 playbook 运行时需要使用的变量

Task section :定义将要在远程主机上执行的任务列表

Handler section:定义 task 执行完成以后需要调用的任务

主机和用户

在playbook中的每一个play都可以选择在哪些服务器和以什么用户完成,hosts一行可以是一个主机组、主机、多个主机,中间以冒号分隔,可使用通配模式。其中remote_user表示执行的用户账号。

– hosts: mysqldb  remote_user: root

每一个tasks都可以定义自己的用户

– hosts: mysqldb  remote_user: root  tasks:  – name: test connection    ping:    remote_user: dbroot

使用sudo

– hosts: web  remote_user: deploy  sudo: yes
– hosts: web  remote_user: deploy  tasks:  – name:start nginx    service: name=nginx state=started    sudo: yes

在一个任务中使用sudo

– hosts: web  remote_user: deploy  sudo: yes  sudo_user: root

登陆后 sudo 到其他用户执行

在使用 sudo_user 切换到非 root 用户时,Ansible 会将模块参数(非密码选项参数)记录到/tmp 下的一个临时随机文件,命令执行完后会删除;当 sudo 到 root 或者普通用户登陆时并不记录

任务列表

Playbook将按照定义的yaml中的tasks条目的顺序向下依次执行,定义的主机都会执行相同的任务。建议:在tasks中每一个任务都写一个name条目,便于了解运行的位置以及增加可读性。task的写法请参考上边yaml的格式,模块参数请参考Ansiable命令、配置文件及模块

tasks:  – name: ensure nginx is running    service: name=nginx state=started

这一个tasks就是调用service模块,使nginx启动。两个参数namestate是这个模块的两个key,表示服务名称和状态。

tasks:  – name: test connection     ping:

有些模块本身是不带key的,例如ping,command,shell等

tasks:  – name: disable selinux    command: setenforce 0
tasks:  – name: Copy ansible inventory file     copy: src=/etc/ansible/hosts dest=/tmp/hosts          owner=root group=root mode=0644

参数过长可以回车使用空格缩进


运行Playbook

首先写一个简单的yaml文件作为测试,测试的两台客户端先装好了apache程序并且处于running状态。

yaml文件

想要运行playbook,则使用ansible-playbook命令。

检测语法

ansible-playbook -syntax-check /path/to/test.yaml

检测语法

这里我也不知道为什么会有这个error,但是不影响后面的运行。

测试运行

ansible-playbook -C /path/to/test.yaml

测试运行

测试状态

由于是测试运行,所以不会改变主机的状态,但是可以从测试结果中看出,test.yaml是可以完成其所写的功能的。

也可以使用–list查看对应文件中的内容

这里写图片描述

运行

ansible-playbook /path/to/test.yaml

这里写图片描述

这里写图片描述

可以从结果看出,第一个task检测连通性,两个测试机都可以ping同;第二个task也成功将两个测试机的httpd服务关闭,状态都转变为stopped。

标签

在运行平playbook跑剧本的时候,可以使用-t TAGS来指定一个YAML文件中的标签位置,playbook会只运行标签处的内容,而忽略之前和之后的步骤。

这里写图片描述

这里可以看到,我在第二个task处添加了targs标签,箭头表示运行顺序。

这里写图片描述

可以看到,命令使用-t 指定标签名称,从运行结果来看,只运行了包含tags的tasks内容,剩余的内容没有它运行。之所以运行了notified,是因为指定了notify

一定注意,yaml文件一定注意文件格式,尤其是对齐的问题,这可能会引起报错。这也是我常遇到的问题(例如冒号后加一个空格)

0 0