我是靠谱客的博主 自信发卡,最近开发中收集的这篇文章主要介绍Chapter3.1 编写PLAYBOOK,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

3.1 编写并执行PLAYBOOK

3.1.1 目标

学完这一章节,学生能去写一个基本的playbook并且执行通过ansible-playbook命令。

3.1.2 PLAYBOOK与AD HOC命令对比

一个ad hoc命令能执行单一,简单的任务针对一组目标主机执行一次性命令。然而,Ansible真正的用途是学习怎么样去用playbook去执行多个复杂的任务针对一组目标主机以一种简单可重复的方式

一个play是一组有序的任务针对选中的主机从你的清单文件中,一个剧本是一个文本文件包含了一个或更多按顺序执行的play的列表。

Play允许您将冗长、复杂的手动管理任务转换为易于重复的例行程序,并获得可预测和成功的结果。你可以将play中的任务序列保存为人类可读和立即运行的形式。 由于编写任务的方式不同,任务本身记录了部署应用程序或基础设施所需的步骤

3.1.3 ansible-playbook的格式

为了帮助你理解playbook的格式,我们复习下ad hoc在上一章节的命令

[sysadmin@ansible security]$ ansible 192.168.160.14 -m user -a 'name=newbie uid=4000 state=present'

这可以被写作为一个单独的任务保存在playbook中,playbook表现为如下:

- name: Configure  important user consistently
  hosts: servera.lab.example.com
  tasks:
    - name: newbie exists with UID 4000
      user:
        name: newbie
        uid: 4000
        state: present

playbook是一个YAML格式的文本文件,正常被保存为yml结尾。playbook使用空格缩进去表示数据的结构。YAML没有提出严格的要求使用多少个空格作为缩进,但有两个基本的原则:

  • 层次结构中相同级别的数据元素必须有相同的缩进
  • 作为另一项的子项必须比其父项缩进得多

可以增加空行提升playbook的可读性

仅仅空格能被用于缩进,tab制表符不被允许
如果你使用vi编辑器,你可以应用一些设置,使得它更容易编辑你的playbook。例如,你能增加如下行到你的$HOME/.vimrc文件,当vi监测到你正在编辑YAML文件,它执行2个空格缩进当你按tab键并且在随后的行自动缩进。
auto FileType yaml setlocal ai ts=2 sw=2 et

一个playbook以三个破折号(—)作为文档开始的标志。它可能以三个句点(…)作为文档结束的标志,尽管实践中经常被忽略。

在开始和结束标识之间,playbook定义了plays列表,YAML的项目以一个破折号跟随一个空格开始,如下例:

- apple
- orange
- grape

play本身是键值对的集合,同一play中的键值应该有相同的缩进,下面的例子展示了一个有三个键值的片段,前面两个keys有简单的值,第三个key有一个包含三项的列表作为值。

name: just an example
hosts: webservers
tasks:
  - first
  - second
  - third

第一个key开始于一个破折号和一个空格,第一个key是name属性,name 是可选的,但它是推荐选项,因为它帮助记录你的playbook,这尤其是有用的,当playbook包含多个plays。

- name: Configure important user consistently

play的第二个key是hosts属性,hosts指定了play任务在哪些主机上执行。hosts后面写的是定义在inventory中的主机或主机组。

hosts: servera.lab.example.com

最后一个key是tasks属性,tasks值指定了这个play要运行的任务列表。本例中展示的是一个单独的任务,任务执行了user模块附加了指定的参数。

tasks:
  - name: newbie exists with UID 4000
    user:
      name: newbie
      uid: 4000
      state: present

下面看到的是另一个例子,一个tasks属性附加了多个任务,service模块确保几个网络服务在主机启动时自动运行。

tasks:
  - name: web server is enabled
    service:
      name: httpd
      enabled: true
      
  - name: NTP server is enabled
    service:
      name: chronyd
      enabled: true

play和tasks在playbook中列出的顺序很重要,因为Ansible是按照相同的顺序运行它们的.

playbook你目前为止看到的都是基本的例子。随着课程的继续,您将看到关于如何使用play和tasks的更复杂的例子。

3.1.4 执行playbooks

ansible-playbook命令用来执行playbooks,命令被执行在控制节点,playbook的名字被传递作为一个参数

[student@workstation ~]$ ansible-playbook site.yml

下例中展示了playbook的内容和输出

[sysadmin@ansible security]$ cat useradd.yml
---
- name: add a user
  hosts: 192.168.160.14
  tasks:
  - name: create a test user
    user:
      name: test
      uid: 2000
      state: present
      
[sysadmin@ansible security]$ ansible-playbook useradd.yml

PLAY [add a user] **************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************************************************************************************
ok: [192.168.160.14]

TASK [create a test user] ******************************************************************************************************************************************************************************************
changed: [192.168.160.14]

PLAY RECAP *********************************************************************************************************************************************************************************************************
192.168.160.14             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

上述的输出注意到name的键值被展示当playbook被执行的时候,Gathering Facts任务是一个特殊的任务在一个play的开头自动执行setup模块。这部分内容,后面的课程会详述。对于多个play和多个tasks的playbook,name属性使得更容易去监控playbook的执行过程。

3.1.5 增加输出的详细程度

ansible-playbook默认的命令输出不提供详细的任务执行信息,ansible-playbook -v命令提供了附加的信息,总共有四个级别。

选项描述
-v任务的输出结果被展示
-vv任务的输出结果和任务的配置被展示
-vvv包含连接受管主机的连接信息
-vvvv向连接插件添加额外的详细信息选项,包括被管理主机中用于执行脚本的用户,以及执行了哪些脚本

3.1.6 验证语法

执行playbook前,对playbook执行一次语法验证是非常有用的,ansible-playbook提供了–syntax-check选项去验证playbook的语法,下例中展示了语法验证成功的输出

[student@workstation ~]$ ansible-playbook --syntax-check useradd.yml

playbook: useradd.yml

如果语法验证失败了,语法错误将被报告。输出包含了语法错误的大概位置。

[sysadmin@ansible security]$ ansible-playbook --syntax-check webserver.yml

ERROR! Syntax Error while loading YAML.
  could not find expected ':'

The error appears to be in '/security/webserver.yml': line 10, column 1, but may
be elsewhere in the file depending on the exact syntax problem.

(specified line no longer in file, maybe it changed?)

3.1.7 执行预演

可以使用-c选项去执行一次预演,结果报告如果playbook被执行,会发生什么结果,但不会真正执行在目标主机上。

下例中展示了一个playbook预演,包含了一个单独的任务去确保用户在目标主机被创建。

[sysadmin@ansible security]$ ansible-playbook -C useradd.yml
PLAY [add a user] **************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************************************************************************************
ok: [192.168.160.14]

TASK [create a test user] ******************************************************************************************************************************************************************************************
changed: [192.168.160.14]

PLAY RECAP *********************************************************************************************************************************************************************************************************
192.168.160.14             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

最后

以上就是自信发卡为你收集整理的Chapter3.1 编写PLAYBOOK的全部内容,希望文章能够帮你解决Chapter3.1 编写PLAYBOOK所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部