playbook介绍

本文详述了Ansible Playbook的概念及其重要性,解释了YAML的特点、用途、缺陷和格式,并提供了YAML示例。Playbook的核心元素包括Tasks、Variables、Templates和Handlers,以及如何定义目标、变量、任务和处理程序。文中还阐述了如何在Playbook中使用sudo、定义任务列表,以及如何运行和测试Playbook。通过示例展示了如何在主机和用户上下文中使用Playbook,以及如何利用标签进行定向执行。

本文介绍了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:value
tasks:         //定义任务
    - 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文件一定注意文件格式,尤其是对齐的问题,这可能会引起报错。这也是我常遇到的问题(例如冒号后加一个空格)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值