AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 984389
Accepted
P Burke
P Burke
Asked: 2019-09-17 04:24:50 +0800 CST2019-09-17 04:24:50 +0800 CST 2019-09-17 04:24:50 +0800 CST

Ansible 变量定义以从库存文件中选择 import_playbook

  • 772

我正在使用 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 。

那么,我是否遗漏了什么,或者就是这样?

ansible
  • 2 2 个回答
  • 1123 Views

2 个回答

  • Voted
  1. Stefano Martins
    2019-09-17T10:39:53+08:002019-09-17T10:39:53+08:00

    好吧,有几种方法可以解决您的问题。首先,我建议您创建两个角色和一个剧本。在该剧本中,您可以创建两个任务,每个角色一个,并指定您将运行该角色的主机组(或者,如果您以特定方式命名主机,则创建一个正则表达式)。如果您只想为特定主机运行该剧本,则可以使用--limit标志调用 ansible-playbook。

    一开始它会给你一些工作,但是随着你通过 Ansible 管理的基础设施的增长,以有组织的方式增长和扩展你的 Ansible 文件会变得更加容易。

    希望有帮助。

    • 1
  2. Best Answer
    Daniel Farrell
    2019-09-17T08:33:34+08:002019-09-17T08:33:34+08:00

    如果我理解正确,您在两台服务器之间主要共享 ansible 运行,但每台服务器都需要应用不同的 drupal 剧本。

    为特定游戏定位主机的最佳方式是在剧本中。尽管认为import_playbook顶级操作应该针对特定主机是合乎逻辑的,但这并不是 ansible 真正看待它的方式。Ansible 构建一个包含任务和角色(它们本身包含任务)的剧本列表,每个任务和角色都针对一个或多个主机或组,然后从 ansible 控制器主机运行所有剧本,仅在它所针对的主机上运行每个特定任务. 因此,您在这里要做的是为每个站点定义单独的 drupal 主机组,然后将两个 playbook 添加到主站点,每个都针对特定的组。

    这是一个简化的示例:

    站点.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 。

    使用主机组将目标逻辑排除在戏剧之外,因此它是在不同戏剧中瞄准不同主机的理想方式。您可以将播放限制为这些单独的主机,或者您可以运行一个包含所有主机设置的更全局的站点。每场比赛仍然只适用于它所针对的主机/组。

    • 0

相关问题

  • 重复的 Ansible 任务

  • 无法形成站点中的文件的链接,该链接可用于使用 ansible 在远程服务器中启用的目录站点?

  • 如何执行 ansible 的特定角色?

  • Ansible 和 rbash

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve