在使用AWS Systems Manager进行Ansible执行的前提下,我们需要考虑Playbook的结构

首先

在我现在负责的系统中,我们使用AWS身份中心进行运维,无需拥有密钥对。然而,如果要在EC2实例上运行Ansible,由于Ansible的机制,必须进行SSH连接,所以我认为必须拥有密钥对才能使用Ansible。

然而,通过使用AWS系统管理器运行命令,我们可以在不使用密钥对的情况下在目标EC2实例上运行Ansible。因此,我们打算通过使用AWS系统管理器运行命令来讨论在无需密钥对的情况下执行Ansible时的最佳目录布局。

使用 AWS 系统管理器 “运行命令” 功能来执行 Ansible.

之前在一篇文章中尝试了使用AWS Systems Manager执行Ansible,但是如果要在Systems Manager Run Command中执行Ansible,由于需要在Run Command中指定目标,所以无法通过库存文件进行控制,所有目标都将在本地主机上执行。

因此,即使要执行最佳实践配置的Playbook,也只能选择本地主机作为唯一选项,无法通过group_vars或hosts_vars进行变量切换,仅仅切换执行Playbook并不能轻易地将变量分开为不同的服务器类型。

我想要通过使用具有这些特征的“Run Command”来执行Ansible,并且在不改变最佳实践配置的情况下,尽量少地修改,实现通过“Run Command”执行Playbook以及通过常规的清单文件指定执行Playbook的功能。

以下是之前介绍过的文章。

    AnsibleをAWS Systems Managerから実行するCI/CDを構築する。(その1:Systems ManagerからのAnsible実行)

Ansible的最佳实践配置

在Ansible官方中,作为最佳实践的目录布局如下所示。

    ベストプラクティス
.
├── 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 # master playbook webservers.yml # playbook for webserver tier dbservers.yml # playbook for dbserver tier
└── 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
    │   └── 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/ # “”

在上述例子中,如果按正常方式执行Playbook,需要指定名为production的清单文件,然后执行site.yml。在清单文件中指定的组名(group1)和主机名(hostname1)会被从group_vars和host_vars中调用,并且执行site.yml中所列出的角色(如common和webtier)。

此外,根据最佳实践,site.yml仅用于导入包含每台服务器处理的Playbook,并执行特定的角色Playbook,如webservers.yml或dbservers.yml。

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

如果我考虑使用AWS Systems Manager Run Command来执行的最佳实践配置

以下是一個被大眾稱為”我所想出的最強的○○”的詳細內容將在後面提及。

.
├── group_vars/
│   └── group1.yml
├── ssm_webservers.yml
├── ssm_dbservers.yml
└── roles/
    ├── common/
    │   ├── tasks/
    │   │   └── main.yml
    │   ├── handlers/
    │   │   └── main.yml
    │   ├── templates/
    │   │   └── ntp.conf.j2
    │   ├── files/
    │   │   └── bar.txt
    │   ├── vars/
    │   │   └── main.yml
    │   ├── defaults/
    │   │   └── main.yml
    │   ├── meta/
    │   │   └── main.yml
    │   └── library/
    └── webtier/

不仅仅是在Run Command中执行,即使是普通执行Playbook,也希望保持配置尽可能不变,因此基本的目录结构与最佳实践几乎相同。

由于在Run Command中无法使用Inventory文件,因此将其排除在外。而对于使用Run Command执行site.yml的情况,导入没有意义,因此也被排除在外。由于Run Command不允许在主机级别指定host_vars变量,所以也被排除在外。

由于group_vars默认只会读取all.yml文件,而与host_vars类似,它的意义并不太大。但是通过在Playbook中指定路径并加载它,我们发现可以重复使用现有的group_vars变量文件,因此我们将继续使用它。

如果要在Run Command中运行,请准备好文件。

我们将在上述目录布局中查看准备用于在Run Command中执行的文件。

为了替代site.yml文件的缺失,我们将为每个服务器类型准备适用于Run Command的Playbook,这些Playbook将从site.yml中加载。

在Playbook中,只能指定localhost作为hosts,因此我们可以将localhost固定下来,通过vars_files指令,在Ansible目录中使用相对路径指定读取存在于group_vars中的组变量。

通过这样做,可以继续使用group_vars中的变量文件,因此只需要准备运行命令所需的Playbook文件ssm_webserver.yml和ssm_dbserver.yml。

---
- become: true
  hosts: localhost
  vars_files:
    - group_vars/group1.yml
  roles:
    - common

用系统管理员运行命令来执行Ansible。

如果使用系统管理器运行命令,可以从运行命令界面上指定目标,并在Playbook文件中指定”ssm_webserver.yml”或”ssm_dbserver.yml”来执行。

即使可以指定多个目标,但不能将用于执行的Playbook文件根据每个目标进行分开,所以如果想要分开执行Playbook文件,请分别执行。

注意事项

使用Run Command执行Ansible会每次执行时下载Ansible的Playbook等内容。

因此,最好不要将安装包放置在roles的文件中,而是通过S3等方式进行下载,然后在执行roles时使用条件语句等来确保不会每次都下载安装包。

    • インストール用パッケージ等のサイズが大きいファイルはAnsibleのディレクトリには置かずに別のストレージに置く

 

    Playbookの条件式や実行rolesで制御してサイズの大きいファイルがダウンロードされないようにする

最后

通过在Playbook文件中使用vars_files指定变量文件,无需对已有的Ansible进行太多修改,就可以重复使用。

如果为每台设备准备不同的Playbook文件,当然可以在host_vars中调用主机变量,并且在Playbook文件中编写条件表达式等来将处理限制为一台设备,我认为现有的Ansible也可以在操作体验没有改变的情况下执行。

只为运行Ansible而使用密钥对的人,不妨根据本文的建议尝试去除密钥对。