我正在使用 Ansible (V2.8) 构建两个不同的服务器环境,它们恰好支持 Drupal。它们在操作系统、RDBMS、gluster、memcached 等设置方面非常相似。但在 Drupal 的使用方面却有很大不同(不同版本、不同数量的 drupal 实例等)。因此,虽然几乎所有的剧本、var 文件等都是通用的,但我有针对 Drupal 平台的剧本。
我有单独的库存文件,但有一个通用的 site.yml 文件,其中只包含一堆 import_playbook:语句。
我正在努力寻找选择正确的 drupal 剧本的最佳方法。
目前我在命令行上使用以下命令:
-i /vagrant/inventories/inventory-env1.ini --extra-vars environment_name=env1
这使得以下语句在 site.yml 中起作用
- import_playbook: playbooks/drupal/drupal_{{environment_name}}.yml
但这意味着我在同一命令行上指定了两次环境,一次是选择清单文件,一次是设置变量。我通常发现重复是编程不佳的证据,这让我认为我错过了更好的方法。
理想情况下,我只想在清单文件中指定“environment_name”。但我不能这样做,因为它不适用于 site.yml,原因如下所述: https://github.com/ansible/ansible/issues/33659。
那么,是我遗漏了什么吗,还是事实就是这样?
答案1
如果我理解正确的话,您在两个服务器之间运行了一个大部分共享的 ansible,但每个服务器都需要应用不同的 drupal playbook。
针对特定比赛确定主持人的最佳方式是里面剧本。虽然认为import_playbook
顶层操作应该针对特定主机是合乎逻辑的,但这并不是 ansible 真正看待它的方式。Ansible 构建一个包含任务和角色(它们本身包含任务)的剧本列表,每个剧本都针对一个或多个主机或组,然后从 ansible 控制器主机运行所有剧本,仅在其目标主机上运行每个特定任务。因此,您在这里要做的是为每个站点定义单独的 drupal 主机组,然后将两个剧本添加到主站点,每个剧本都针对一个特定组。
这是一个简化的例子:
站点.yaml:
- import_playbook: shared.yaml
- import_playbook: drupal_1.yaml
- import_playbook: drupal_2.yaml
shared.yaml 具有您所引用的操作系统设置等,并且不需要进行任何更改。
drupal_1.yaml 如下所示:
- hosts: drupal_site_1
- tasks:
[ ... set up drupal site 1 ... ]
drupal_2.yaml 如下所示:
- hosts: drupal_site_2
- tasks:
[ ... set up drupal site 2 ... ]
现在我们只需确保在清单中定义了组,并且应该获取第一个站点的主机在 中drupal_site_1
,而应该获取第二个站点的主机在 中drupal_site_2
。您甚至可以让服务器同时位于两个组中以服务两个站点(但当然,剧本必须精心制作以免干扰)。请参阅https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html了解有关如何对主机进行分组的信息。
使用主机组可将定位逻辑排除在播放之外,因此它是在不同播放中定位不同主机的理想方式。您可以将播放限制到那些单个主机,也可以运行包含所有主机设置的更全局的站点。每个播放仍然仅适用于其定位的主机/组。
答案2
嗯,有几种方法可以解决您的问题。首先,我建议您创建两个角色和一个剧本。在该剧本中,您可以创建两个任务,每个角色一个,并指定要运行该角色的主机组(或者,如果您以特定方式命名了主机,则创建正则表达式)。如果您只想为特定主机运行该剧本,可以使用标志调用 ansible-playbook --limit
。
一开始它会给你带来一点工作,但随着你通过 Ansible 管理的基础设施的增长,以有组织的方式增加和扩展你的 Ansible 文件会变得更容易。
希望有所帮助。