我正在使用 Ansible (V2.8) 构建两个恰好支持 Drupal 的不同服务器环境。它们在 OS、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 。
那么,我是否遗漏了什么,或者就是这样?
好吧,有几种方法可以解决您的问题。首先,我建议您创建两个角色和一个剧本。在该剧本中,您可以创建两个任务,每个角色一个,并指定您将运行该角色的主机组(或者,如果您以特定方式命名主机,则创建一个正则表达式)。如果您只想为特定主机运行该剧本,则可以使用
--limit
标志调用 ansible-playbook。一开始它会给你一些工作,但是随着你通过 Ansible 管理的基础设施的增长,以有组织的方式增长和扩展你的 Ansible 文件会变得更加容易。
希望有帮助。
如果我理解正确,您在两台服务器之间主要共享 ansible 运行,但每台服务器都需要应用不同的 drupal 剧本。
为特定游戏定位主机的最佳方式是在剧本中。尽管认为
import_playbook
顶级操作应该针对特定主机是合乎逻辑的,但这并不是 ansible 真正看待它的方式。Ansible 构建一个包含任务和角色(它们本身包含任务)的剧本列表,每个任务和角色都针对一个或多个主机或组,然后从 ansible 控制器主机运行所有剧本,仅在它所针对的主机上运行每个特定任务. 因此,您在这里要做的是为每个站点定义单独的 drupal 主机组,然后将两个 playbook 添加到主站点,每个都针对特定的组。这是一个简化的示例:
站点.yaml:
shared.yaml 具有您所指的操作系统设置等,无需更改。
drupal_1.yaml 看起来像这样:
drupal_2.yaml 看起来像这样:
现在我们只需要确保在您的清单中定义了组,并且应该获得第一个站点的主机在 中
drupal_site_1
,应该获得第二个站点的主机在drupal_site_2
. 您甚至可以在两个组中都设置一个服务器来为两个站点提供服务(当然,剧本必须精心设计以免干扰)。有关如何对主机进行分组的信息,请参阅https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html 。使用主机组将目标逻辑排除在戏剧之外,因此它是在不同戏剧中瞄准不同主机的理想方式。您可以将播放限制为这些单独的主机,或者您可以运行一个包含所有主机设置的更全局的站点。每场比赛仍然只适用于它所针对的主机/组。