ansible之playbook剧本使用

  1. ansible-playbook简单使用

    ansible-playbook是一系列Ansible 命令的集合, 其利用YAML语言编写。 在运行过程中, ansible-playbook命令按照自上而下的顺序依次执行。 同时, ansible-playbook具备很多特性,它允许你将某个命令的状态传输到后面的指令。例如,你可以从机器的文件中抓取内容并将其作为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制, 这是Ansible命令无法实现的。

     

  2. 剧本介绍

    现实中演员按照剧本(playbook)表演, 在Ansible中,计算机进行演示, 计算机来安装、部署应用,提供对外服务,并调用资源处理各种各样的事情。

    为什么要使用剧本呢?

    若执行一些简单的任务,那么使用Ad-Hoc命令可以很方便地解决。 但是有时一个任务过于复杂, 需要大量的操作, 执行Ad-Hoc命令是不适合的 ,这时最好使用剧本,就像执行shell命令与写shell脚本一样。剧本也可以理解为批处理任务,不过剧本有自己的语法格式。

     

  3. 剧本文件的格式

    剧本文件由YMAL语言编写。YMAL格式类似于JSON,便于读者理解、阅读和书写。了解YMAL的格式,对后面使用剧本很有帮助。以下为剧本常用到的YMAL格式规则。

  • 文件的第一行应该以 " -" (3个连字符)开始, 表明YMAL文件的开始。
  • 在同一行中, #之后的内容表示注释, 类似于Shell、 Python和Ruby 。
  • YMAL 中的列表元素 以 " -"开头然后紧跟着一个空格, 后面为元素内容。
  • 同一个列表中的元素应该保持相同的缩进, 否则会被当作错误处理。
  • 剧本中的hosts、variables、roles、tasks等对象的表示方法都是键值中间以 " : " 分隔,":"后面还要增加一个空格。

 

首先看下面的这个例子

-apple

-banana

-orange

它等价于下面这个json格式

[

"apple",

"banana",

"orange"

]

剧本文件是通过ansible-playbook命令进行解析,ansible-plybook命令会按照自上而下的顺序依次执行剧本文件中的内容。

 

  1. 剧本的构成

    剧本是由一个或者多个"play"组成的列表。play的主要功能在于,将合并为一组的主机组合成事先通过ansible定义好的角色。将多个play组织在一个剧本中就可以让它们联同起来按事先编排的机制完成一系列复杂的任务。

    剧本主要由以下4部分构成。

     

    target部分:定义将要执行剧本的远程主机组。

    variable部分:定义剧本运行时需要使用的变量。

    task部分:定义将要在远程主机上执行的任务列表。

    handler部分:定义 task 执行完成以后需要调用的任务。

    而其对应的目录层为5个(视情况可变化〉, 具体如下。

    vars: 变量层。

    tasks:任务层

    handlers:触发任务。

    files:文件

    template:模板

     

    下面介绍构成剧本的4个组成部分的重要组成。

    1. target部分:hosts和users。

    剧本中的每 一步的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。

    hosts: 用于指定要执行指定任务的主机, 每个剧本都必须指定hosts, hosts也可以使用通配符格式。 主机或主机组在清单中指定, 可以使用系统默认的/etc/ ansible/hosts, 也可以自己编辑, 在运行的时候加上-i选项,可指定自定义主机清单的位置。在运行清单文件的时候,

    --list-hosts选项会显示那些主机将会参与执行任务的过程中。

    remote_user:用于指定在远程主机上执行任务的用户。可以指定任意用户,也可以使用sudo,但是用户必须要有执行相应任务的权限。

     

    1. variable部分:任务列表tasklist

    play的主体部分是task list。

    task list中的各任务按次序逐个在hosts中指定的 所有主机上执行,llll在所有主机上完成第 一个任务后再开始第二个。在运行自上而下某剧本时,如果中途发生错误,则所有己执行任务都将回滚,因此在更正剧本 后需要重新执行一次。

    task 的目的是使用指定的参数 执行 模块,而在模块参数中可以使用变量。模块执行是幕等的(幕等性; 即一个命令,即使执行一次或多次,其结果也一样),这意味着多次执行是安全 的,因为其结果均一致。task包含 name和要执行的模块,name是可选的,只是为了便于用户阅读,建议加上去, 模块是必需的,同时也要给予模块相应的参数 。

     

    1. task部分:tags。

    tags 用于让用户选择运行或II白过剧本中的部分代码。Ansible具有某等性,因此会自动跳过没有变化的部分:但是当一个剧本任务比较多时,一个一个的判断 每个部分是否发生了变 化,也需要很长时间。因此,如果确定某些部分没有发生变化,就可以通过tags跳过这些代码片断。

    1. handler部分:handlers。

    用于当关注的资源发生变化时采取一定的操作。handlers是和 " notify " 配合使用的。

    "notify " 这个动作可用于在每个 play 的最后被触发,这样可以避免多次有改变发生时,每次都执行指定的操作。通过 " notify ",我们可以仅在所有的变化发生完成后一次性地执行指定操作。

    在notify中列出的操作称为handlers, 也就是说notify用来调用handlers中定义的操作。

    注意,在notify中定义的内容一定要和handlers中定义的 " -name " 内容一样,这样才能达到触发的效果,否则会不生效。

     

  2. 剧本执行结果解析

    使用ansible-playbook 运行剧本文件,输出的内容为JSON格式。文件由不同颜色组成,便于识别。 输出内容中每个颜色表示的含义如下。

    绿色代表执行成功,但系统保持原样。

    黄色代表系统状态发生改变,即执行的操作生效。

    红色代表执行失败,会显示错误信息。

    下面举个简单例子

    上面的代码实现功能是新增一个用户,参数含义如下:

    name:对剧本的实现做一个概述,在执行的时候会输出name的值

    hosts:指定主机

    user:指定专门的用户登录到远程主机

    gather_facts:参数指定了后面的任务执行前,是否执行setup模块获取主机信息,这在后面的task使用setup获取的信息时会用到。

    vars参数指定了变量,这里指定了一个user1变量,值为testuser。需要注意的是,变量值一定要用引号括起来。

    tasks指定了一个任务,下面的name参数是对任务的描述,执行的时候会打印,user是一个模块,user后面的name是user模块里的一个参数,增加的用户名字调用了user1变量的值。

     

  3. ansible-playbook收集facts信息案例

    facts组件用于ansible采集被管理机器的设备信息。我们可以使用setup模块查找机器的所有facts信息。facts信息包括远端主机发行版,IP,CPU核数,系统架构,主机名等,我们可以使用filter来查看指定信息。整个facts信息被包装在一个json格式的数据结构中。

    如下

    所有数据格式都是json格式,facts还支持查看指定信息,如下所示:

    在执行剧本的时候, 默认的第一个任务就是收集远端被管主机的facts信息。如果后面的任务不会使用setup获取的信息,那么可以禁止Ansible 收集facts,并在剧本的 hosts指令下面设置gather_facts:false。gather_facts的默认值为true。

    facts经常被用在条件语句和模板当中, 也可以根据指定的标准创建动态主机组。下面是一个例子:执行剧本命令为ansible-playbook

    yaml剧本如下:对远程主机判断其系统版本然后安装对应的bash版本

    结果,centos7安装bash成功。

     

  4. 批量安装jdk软件的ansible-playbook剧本

    下面是一个在远程主机上安装jdk软件的ansible-playbook案例

    下面几个步骤是把java传送到远程目录并解压,然后设置环境变量,然后source一下环境。然后检查java版本,如果没有任何报错,说明成功了,不需要其返回显示结果。with_items是循环模块,可以通过{{ item }}获取每次迭代的值。

     

    有的人觉得使用java-version不行吗,用路径太low了,注意了远程的话默认会到/bin下面找你的java安装的指令,但是默认安装是不在其下面的,就是说ansible远程执行是找不到java命令的,简单的一个办法是把安装Java的bin下面的java链接到/usr/bin下面来,办法可能不止一个但这个是比较简单好用的,注意要使用绝对路径,重新改造一下剧本,如下:

     

    ansible是一个非常强大的工具,但是不要依赖于工具,要灵活思维。用shell,python等脚本也是可以实现的。

     

posted @ 2021-12-16 15:38  头发重要  阅读(529)  评论(0)    收藏  举报