RHCE8.0讲义:实施多个PLAYBOOK

来自CloudWiki
跳转至: 导航搜索

培训目标

  • 编写一个使用多个play和各play特权升级的playbook。
  • 有效使用ansible-doc学习如何使用新模块来实施play任务。

编写多个PLAY

Playbook是一个YAML文件,含有由一个或多个play组成的列表。记住一个play按顺序列出了要 对清单中的选定主机执行的任务。因此,如果一个playbook中含有多个play,每个play可以将其 任务应用到单独的一组主机。

在编排可能涉及对不同主机执行不同任务的复杂部署时,这会大有帮助。您可以这样编写 playbook:对一组主机运行一个play,完成后再对另一组主机运行另一个play。

编写包含多个play的playbook非常简单。Playbook中的各个play编写为playbook中的顶级列表 项。各个play是含有常用play关键字的列表项。

以下示例显示了含有两个play的简单playbook。

# This is a simple playbook with two plays
- name: first play
  hosts: slave
  tasks:
    - name: first task
      yum:
        name: httpd
        state: present
    - name: second task
      service:
        name: httpd
        enabled: true
- name: second play
  hosts: slave
  tasks:
    - name: first task
      service:
        name: mariadb
        enabled: true

PLAY中的远程用户和特权升级

Play可以将不同的远程用户或特权升级设置用于play,取代配置文件中指定的默认设置。这些都在 play本身中与hosts或tasks关键字相同的级别上设置。

用户属性

Playbook中的任务通常通过与受管主机的网络连接来执行。与临时命令相同,用于任务执行的用户 怅户取决于Ansible配置文件/etc/ansible/ansible. cfg中的不同关键字。运行任务的用户可 以通过remote_user关键字来定义。不过,如果启用了特权升级,become_user等其他关键字 也会发生作用。

如果用于任务执行的Ansible配置中定义的远程用户不合适,可以通过在play中使用 remote_user关键字来覆盖。

remote_user: remoteuser

特权升级属性

也提供额外的关键字,从而在playbook内定义特权升级参数。become布尔值关键字可用于启用或 禁用特权升级,无论它在Ansible配置文件中的定义为何。它可以取yes或true值来启用特权升 级,或者取no或false值来禁用它。

become: true

如果启用了特权升级,则可以使用become_method关键字来定义特定play期间要使用的特权升级 方法。以下示例中指定sudo用于特权升级。

become_method: sudo

此外,启用了特权升级时,become_user关键字可定义特定play上下文内要用于特权升级的用户 帐户。

become_user: privileged_user

以下示例演示了如何在play中使用这些关键字:

- name: /etc/hosts is up to date
  hosts: datacenter-west
  remote_user: automation
  become: yes
  become_method: sudo
  tasks:
    - name: server.example.com in /etc/hosts
      lineinfile:
        path: /etc/hosts
        line: '192.0.2.42 server.example.com server'
        state: present

补充:

  • become:设置为yes激活权限提升。
  • become_user :设置为具有所需权限的用户 - 您成为的用户,而不是您登录的用户。并不意味着,允许将其设置为主机级别。必须跟become: yes 一起使用。
  • become_method :在播放或任务级别)覆盖ansible.cfg中设置的默认方法,设置为sudo / su / pbrun / pfexec / doas / dzdo / ksu / runas / machinectl

使用前提:在hosts中配置的登录账号在受控端机器上需要有sudo的权限

在/etc/sudoers    
ubuntu ALL=(ALL) NOPASSWD:ALL

————————————————

原文链接:https://blog.csdn.net/icanflyingg/article/details/123138117

查找用于任务的模块

模块文档

官网查询模块

Ansible随附打包的大量模块为管理员提供了许多用于常见管理任务的工具。本课程前面介绍了 Ansible文档网站http://docs.ansible.com通过该网站上的模块索引,可以轻松浏览Ansible随附 的模块列表。例如,适于用户和服务管理的模块可以在Systems Modules T找到,而适合数据库管 理的模块则可在Database Modules下找到。

对于每一个模块,Ansible文档网站提供了其功能摘要,以及关于如何通过模块的选项来调用各项具 体功能的说明。文档还提供了实用的示例,演示各个模块的用法,以及任务中关键字的设置方法。

本地查询模块

您已使用过ansible-doc命令来查找关于本地系统上安装的模块的信息。作为复习,要査看控制 节点上可用模块的列表,可运行ansible-doc -1命令。这将显示模块名称列表以及其功能的概 要。

 ansible-doc -l

使用ansible-doc [module name]命令来显示模块的详细文档。与Ansible文档网站一样,该 命令提供模块功能的概要、其不同选项的详细信息,以及示例。以下示例演示了为yum模块显示的 文档。

[root@localhost ~]# ansible-doc yum

> ANSIBLE.BUILTIN.YUM    (/usr/local/Python3/lib/python3.7/site-packages/ansible/modules/yum.py)

        Installs, upgrade, downgrades, removes, and lists packages and groups
        with the `yum' package manager. This module only works on Python 2.
        If you require Python 3 support see the [ansible.builtin.dnf] module.

  * note: This module has a corresponding action plugin.

OPTIONS (= is mandatory):

模块示例输出

ansible-doc命令还提供-s选项,它会生成示例输出,可以充当如何在playbook中使用特定模块的示范。此输出可以作为起步模板,包含在实施该模块以执行任务的playbook中。输出中包含的 注释,提醒管理员各个选项的用法。下例演示了 yum模块的这种输出。

[root@localhost ~]# ansible-doc -s yum

- name: Manages packages with the `yum' package manager
  yum:
      allow_downgrade:       # Specify if the named package and version is allowed to downgrade
                               a maybe already installed higher
                               version of that package. Note that
                               setting allow_downgrade=True can
                               make this module behave in a non-
                               idempotent way. The task could end
                               up with a set of packages that
                               does not match the complete list
                               of specified packages to install
                               (because dependencies between the
                               downgraded package and others can
                               cause changes to the package

模块维护

Ansible随附了大量模块,它们可用于执行许多任务。上游社区非常活跃,这些模块也可能处于不同 的幵发阶段。模块的ansible-doc文档应该会指定上游Ansible社区中维护该模块的人,以及该 模块的幵发状态。这在该模块的ansible-doc输出末尾的METADATA部分中指明。

模块开发状态

status字段记录模块的幵发状态:

  • stableinterface:模块的关键字稳定,将尽力确保不删除关键字或更改其含义。
  • preview:模块处于技术预览阶段,可能不稳定,其关键字可能会更改,或者它可能需要本身会 受到不兼容更改的库或Web服务。
  • deprecated:模块已被弃用,未来某一发行版中将不再提供。
  • removed:模块已从发行版中移除,但因文档需要存在存根,以帮助之前的用户迁移到新的模 块。

注意: stableinterface状态仅表明模块界面稳定,并不评价模块的代码质量。

模块维护人

supported_by字段记录上游Ansible社区中维护该模块的人。可能的值包括:

  • core:由上游“核心” Ansible开发人员维护,始终随Ansible提供。
  • curated:模块由社区中的合作伙伴或公司提交并维护。这些模块的维护者必须留意报告的任何 问题,或者调取针对该模块提出的请求。在社区维护人员批准了更改后,上游“核心”开发人员 审核对策划模块提岀的更改。核心提交者也确保因为Ansible引擎中的变化而对这些模块造成的 任何问题得到修正。这些模块目前随Ansible提供,但是可能会在未来某个时候另外打包。
  • community:模块不受到核心上游开发人员、合作伙伴或公司的支持,完全由一般开源社区维 护。此类别中的模块仍然完全可用,但对问题的响应速度完全取决于社区。这些模块目前也随 Ansible提供,但是可能会在未来某个时候另外打包。

上游Ansible社区有用于Ansible的问题跟踪器及其集成模块,网址为:https://github.com/ansible/ ansible/issueso

编写自定义模块

有时候,没有现成的模块可以用于达成您的目标。作为最终用户,您也可以自己编写私有的模块, 或者从第三方获取模块。Ansible会在ANSIBLE_LIBRARY环境变量指定的位置査找自定义模块; 或者,如果未设置此变量,则由当前Ansible配置文件中的library关键字指定。Ansible也在相 对于当前运行的playbook的./library目录中搜索自定义模块。

library = /usr/share/my_modules

与编写模块相关的信息已超出本课程的范畴。有关编写方法的文档位于https://docs.ansible.com/ ansible/latest/dev_guide/developing_modules.html

幂等地使用模块

使用ansible-doc命令可以查找和了解如何为您的任务使用模块。

尽管command, shell和raw模块的用法可能看似简单,但在可能时,应尽量避免 在playbook中使用它们因为它们可以取用任意命令,因此使用这些模块时很容易写 出非幂等的playbook。

例如,以下使用shell模块的任务为非幂等。每次运行play时,它都会重写/etc/ resolv.conf,即使它已经包含了行 nameserver 192.0.2.1。

- name: Non-idempotent approach with shell module
  shell: echo "nameserver 192.0.2.1" > /etc/resolv.conf

可以通过多种方式编写以幕等方式使用shell模块的任务,而且有时候进行这些更 改并使用shell是最佳的做法。但更快的方案或许是使用ansible-doc发现copy 模块,再使用它获得所需的效果。

在以下示例中,如果/etc/resolv.conf文件已包含正确的内容,则不会重写该文 件:

- name: Idempotent approach with copy module
  copy:
    dest: /etc/resolv.conf
    content: "nameserver 192.0.2.l\n"

copy模块可以测试来了解是否达到了需要的状态,如果已达到,则不进行任何更 改。shell模块容许非常大的灵活性,但需要格外小心,从而确保它以幂等方式运 行。

幂等的playbook可以重复运行,确保系统处于特定的状态,而不会破坏状态已经正 确的系统。

PLAYBOOK语法变化

本章的最后一个部分将探讨您可能遇到的YAML或Ansible Playbook语法的一些变化。

YAML注释

注释也可以用于提高可读性。在YAML中,编号或#号符号右侧的所有内容都是注释。如果注释 的左侧有内容,请在该编号符号的前面加一个空格。

# This is a YAML comment
some data # This is also a YAML comment

YAML字符串

YAML中的字符串通常不需要放在引号里,即使字符串中包含空格。字符串可以用双引号或单引号括 起。

this is a string
'this is another string'
"this is yet another a string"

编写多行字符串有两种方式。可以使用竖线(I)字符表示要保留字符串中的换行字符。

      include_newlines: |
                 Example Company
                 123 Main Street
                 Atlanta, GA 30303

要编写多行字符串,您也可以使用大于号(>)字符来表示换行字符转换成空格并且行内的引导空白将 被删除。这种方法通常用于将很长的字符串在空格字符处断行,使它们跨占多行来提高可读性。

fold_newlines: >
        This is an example
        of a long string,
        that will become
        a single sentence once folded.

YAML字典

您已看到过以缩进块的形式编写的键值对集合,如下方所示:

name: svcrole
svcservice: httpd
svcport: 80

字典也可以使用以花括号括起的内联块格式编写,如下方所示:

(name: svcrole, svcservice: httpd, svcport: 80)

大多数情形中应避免内联块格式,因为其可读性较差。不过,至少有一种情形中会较常使用它。角 色的使用将在本课程后面进行讨论。当playbook中包含角色列表时,较常使用这种语法,从而更加 容易区分play中包含的角色和传递给角色的变量。

YAML列表

您也已见到过使用普通单破折号语法编写的列表:

hosts:
  - servera
  - serverb
  - serverc

列表也有以方括号括起的内联格式,如下方所示:

 hosts: [servera, serverb, serverc]

您应该避免使用此语法,因为它通常更难阅读。

过时的“键=值” Playbook简写

某些playbook可能使用较旧的简写方法,通过将模块的键值对放在与模块名称相同的行上来定义任 务。例如,您可能会看到这种语法:

tasks:
  - name: shorthand form
    service: name=httpd enabled=true state=started

通常,您会将相同的任务编写为如下所示:

tasks:
  - name: normal form
    service:
      name: httpd
      enabled: true
      state: started


通常您应避免简写形式,而使用普通形式。

普通形式的行数较多,但更容易操作。任务的关键字垂直堆叠,更容易区分。

阅读play时,您的眼 睛直接向下扫视,左右运动较少。而且,普通语法是原生的YAML;简写形式不是。如果您使用普通 格式而非简写格式,现代文本编辑器中的语法突出显示工具可以更有效地为您提供帮助。

您可能会在文档和他人提供的旧playbook中看到这种语法,而且这种语法仍然可以发挥作用。

参考文献

ansible-playbook⑴ 和 ansible-doc⑴帮助手册

Playbook 简介 — Ansible 文档 https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html

Playbook — Ansible 文档 https://docs.ansible.com/ansible/latest/user_guide/playbooks.html

开发模块— Ansible文档 https://docs.ansible.com/ansible/latest/dev_guide/developing_modules.html

模块支持— Ansible文档 https://docs.ansible.com/ansible/latest/user_guide/modules_supporthtml

YAML 语法 — Ansible 文档

https://docs.ansible.com/ansible/latest/reference_appendicesAAMLSyntax.html