Ansible 示例设置

您已经了解了 Playbook、清单、角色和变量。本节将所有这些元素组合在一起,并概述一个用于自动化 Web 服务的示例设置。

示例设置按功能组织 Playbook、角色、清单和带有变量的文件。Play 和任务级别的标签提供了更高的粒度和控制。这是一种强大且灵活的方法,但还有其他组织 Ansible 内容的方法。您对 Ansible 的使用应符合您的需求,因此可以随意修改此方法并相应地组织您的内容。

示例目录布局

此布局将大多数任务组织在角色中,每个环境使用一个清单文件,并在顶级目录中使用一些 Playbook

production                # inventory file for production servers
staging                   # inventory file for staging environment

group_vars/
   group1.yml             # here we assign variables to particular groups
   group2.yml
host_vars/
   hostname1.yml          # here we assign variables to particular systems
   hostname2.yml

library/                  # if any custom modules, put them here (optional)
module_utils/             # if any custom module_utils to support modules, put them here (optional)
filter_plugins/           # if any custom filter plugins, put them here (optional)

site.yml                  # main playbook
webservers.yml            # playbook for webserver tier
dbservers.yml             # playbook for dbserver tier
tasks/                    # task files included from playbooks
    webservers-extra.yml  # <-- avoids confusing playbook with task files
roles/
    common/               # this hierarchy represents a "role"
        tasks/            #
            main.yml      #  <-- tasks file can include smaller files if warranted
        handlers/         #
            main.yml      #  <-- handlers file
        templates/        #  <-- files for use with the template resource
            ntp.conf.j2   #  <------- templates end in .j2
        files/            #
            bar.txt       #  <-- files for use with the copy resource
            foo.sh        #  <-- script files for use with the script resource
        vars/             #
            main.yml      #  <-- variables associated with this role
        defaults/         #
            main.yml      #  <-- default lower priority variables for this role
        meta/             #
            main.yml      #  <-- role dependencies and optional Galaxy info
        library/          # roles can also include custom modules
        module_utils/     # roles can also include custom module_utils
        lookup_plugins/   # or other types of plugins, like lookup in this case

    webtier/              # same kind of structure as "common" was above, done for the webtier role
    monitoring/           # ""
    fooapp/               # ""

注意

默认情况下,Ansible 假设您的 Playbook 存储在一个目录中,而角色存储在一个名为 roles/ 的子目录中。随着需要自动化的任务越来越多,您可以考虑将您的 Playbook 移动到一个名为 playbooks/ 的子目录中。如果您这样做,则必须使用 ansible.cfg 文件中的 roles_path 设置配置 roles/ 目录的路径。

备选目录布局

您还可以将每个清单文件及其 group_vars/host_vars 放在单独的目录中。如果您的 group_vars/host_vars 在不同环境中没有太多共同之处,则此方法特别有用。布局可能如下例所示

inventories/
   production/
      hosts               # inventory file for production servers
      group_vars/
         group1.yml       # here we assign variables to particular groups
         group2.yml
      host_vars/
         hostname1.yml    # here we assign variables to particular systems
         hostname2.yml

   staging/
      hosts               # inventory file for staging environment
      group_vars/
         group1.yml       # here we assign variables to particular groups
         group2.yml
      host_vars/
         stagehost1.yml   # here we assign variables to particular systems
         stagehost2.yml

library/
module_utils/
filter_plugins/

site.yml
webservers.yml
dbservers.yml

roles/
    common/
    webtier/
    monitoring/
    fooapp/

此布局为更大的环境提供了更大的灵活性,并且可以在不同环境之间完全分离清单变量。但是,这种方法更难维护,因为文件更多。有关组织组和主机变量的更多信息,请参阅组织主机和组变量

示例组和主机变量

这些带有变量的示例组和主机文件包含适用于每台机器或一组机器的值。例如,亚特兰大的数据中心有自己的 NTP 服务器。因此,在设置 ntp.conf 文件时,可以使用与此示例中类似的代码

---
# file: group_vars/atlanta
ntp: ntp-atlanta.example.com
backup: backup-atlanta.example.com

同样,webservers 组中的主机具有一些不适用于数据库服务器的配置

---
# file: group_vars/webservers
apacheMaxRequestsPerChild: 3000
apacheMaxClients: 900

默认值或普遍为真的值放在一个名为 group_vars/all 的文件中

---
# file: group_vars/all
ntp: ntp-boston.example.com
backup: backup-boston.example.com

如有必要,您可以在 host_vars 目录中定义系统中特定的硬件差异

---
# file: host_vars/db-bos-1.example.com
foo_agent_port: 86
bar_agent_port: 99

如果您使用 动态清单,Ansible 会自动创建许多动态组。因此,像 class:webserver 这样的标签会自动从文件 group_vars/ec2_tag_class_webserver 加载变量。

注意

您可以使用名为 hostvars 的特殊变量访问主机变量。有关这些变量的列表,请参阅特殊变量hostvars 变量只能访问特定于主机的变量,而不能访问组变量。

按功能组织的示例 Playbook

通过此设置,一个 Playbook 可以定义整个基础结构。site.yml Playbook 导入另外两个 Playbook。一个用于 Web 服务器,另一个用于数据库服务器

---
# file: site.yml
- import_playbook: webservers.yml
- import_playbook: dbservers.yml

同样位于顶级的 webservers.yml Playbook 将 Web 服务器组的配置映射到与 Web 服务器组相关的角色

---
# file: webservers.yml
- hosts: webservers
  roles:
    - common
    - webtier

通过此设置,您可以通过运行 site.yml 来配置整个基础结构。或者,要仅配置部分基础结构,请运行 webservers.yml。这类似于 Ansible 的 --limit 参数,但更加明确

ansible-playbook site.yml --limit webservers
ansible-playbook webservers.yml

基于功能的角色中的示例任务和处理程序文件

Ansible 会加载角色子目录中任何名为 main.yml 的文件。此示例 tasks/main.yml 文件配置 NTP

---
# file: roles/common/tasks/main.yml

- name: be sure ntp is installed
  yum:
    name: ntp
    state: present
  tags: ntp

- name: be sure ntp is configured
  template:
    src: ntp.conf.j2
    dest: /etc/ntp.conf
  notify:
    - restart ntpd
  tags: ntp

- name: be sure ntpd is running and enabled
  ansible.builtin.service:
    name: ntpd
    state: started
    enabled: true
  tags: ntp

这是一个处理程序文件的示例。只有当某些任务报告更改时才会触发处理程序。处理程序在每个 Play 的末尾运行

---
# file: roles/common/handlers/main.yml
- name: restart ntpd
  ansible.builtin.service:
    name: ntpd
    state: restarted

有关更多信息,请参阅角色

示例设置启用的功能

上面描述的基本组织结构启用了许多不同的自动化选项。要重新配置整个基础结构

ansible-playbook -i production site.yml

要重新配置所有内容上的 NTP

ansible-playbook -i production site.yml --tags ntp

要仅重新配置 Web 服务器

ansible-playbook -i production webservers.yml

要仅重新配置波士顿的 Web 服务器

ansible-playbook -i production webservers.yml --limit boston

要仅重新配置波士顿的前 10 个 Web 服务器,然后再重新配置接下来的 10 个

ansible-playbook -i production webservers.yml --limit boston[0:9]
ansible-playbook -i production webservers.yml --limit boston[10:19]

示例设置还支持基本的临时命令

ansible boston -i production -m ping
ansible boston -i production -m command -a '/sbin/reboot'

要发现哪些任务会运行或哪些主机名会受到特定 Ansible 命令的影响

# confirm what task names would be run if I ran this command and said "just ntp tasks"
ansible-playbook -i production webservers.yml --tags ntp --list-tasks

# confirm what hostnames might be communicated with if I said "limit to boston"
ansible-playbook -i production webservers.yml --limit boston --list-hosts

为部署或配置组织

示例设置说明了典型的配置拓扑。当您执行多层部署时,您可能需要一些额外的 Playbook,这些 Playbook 会在层之间跳转以推出应用程序。在这种情况下,您可以使用 deploy_exampledotcom.yml 等 Playbook 来增强 site.yml。但是,一般概念仍然适用。使用 Ansible,您可以使用相同的实用程序进行部署和配置。因此,您可能会重用组,并将 OS 配置与应用程序部署中的单独 Playbook 或角色分开。

将“Playbook”视为一种体育比喻 – 您可以使用一套 Play 来对抗您的所有基础结构。然后,您可以在不同的时间和出于不同的目的使用情境性 Play。

使用本地 Ansible 模块

如果 Playbook 有一个相对于其 YAML 文件的 ./library 目录,则可以使用此目录将 Ansible 模块自动添加到模块路径。这会将模块与 Playbook 组织在一起。例如,请参阅本节开头的目录结构。

另请参阅

YAML 语法

了解 YAML 语法

使用 Playbook

查看基本的 Playbook 功能

集合索引

浏览现有集合、模块和插件

您应该开发模块吗?

了解如何通过编写自己的模块来扩展 Ansible

模式:定位主机和组

了解如何选择主机

沟通

有问题?需要帮助?想分享您的想法?请访问 Ansible 通信指南