【问题标题】:Is there a way to override a template defined into an ansible galaxy role?有没有办法覆盖定义为 ansible Galaxy 角色的模板?
【发布时间】:2019-04-18 09:18:40
【问题描述】:

我正在尝试使用 ansible 设置服务器,我想使用 this galaxy role

它定义了一个我想自定义的template,但我不知道怎么做。

现在我将角色定义为 requirements.yml 并使用以下方式安装它:

ansible-galaxy install -r requirements.yml

在我的系统某处安装了该角色。

我尝试将文件夹树重新创建到存储我的剧本的存储库中:

roles
  |- ansible-role-passenger
     |- templates
        |- passenger.j2

但它不起作用。当我运行我的剧本时,ansible 使用来自 Galaxy 角色内部的 passenger.j2 文件。

我想我可以在 github 上 fork 银河角色,然后像我想要的那样编​​辑文件 passenger.j2,但我不知道这是否有“更好”的方法:)

【问题讨论】:

    标签: ansible ansible-template ansible-galaxy


    【解决方案1】:

    不幸的是,您的发现是正确的。 除非该角色的作者将其作为一项功能实现,否则无法从调用剧本中覆盖角色中的硬编码模板。请注意,files 目录中的简单文件也是如此。

    到目前为止我发现的最好方法:假设角色在templates/passenger.j2 中包含默认模板,请在default/main.yml 中添加一个变量,例如passenger_config_template: passenger.j2,并在角色中使用该变量。然后,用户可以在其 playbook/inventory 中覆盖该 var,并为模板使用不同的名称,该名称将在其他角色中获取或直接在 playbook 级别的 templates 目录中获取。

    你可以看看similar issuean accepted PR 我曾经在@geerlingguy 在他的ansible-role-gitlab 上。他可能会考虑在他的乘客角色上做同样的事情(或者如果你提议,他可能会接受你的 PR)。

    【讨论】:

    • 我目前正在编写一个角色,如果需要,我希望允许用户覆盖硬编码的模板文件夹。对最好的方法有什么建议吗?
    • 覆盖模板文件夹将很难 IMO,因为这实际上是 ansible 的列表。
    • @Zeitounator - 抱歉,我没有说清楚;我希望允许用户覆盖整个模板文件夹。即,强制搜索templates/ 从任意文件夹开始,而不是{{ role_folder }}。我已经推理出您允许使用单个文件的特定方法,但希望获得更多……我突然想到定义一个 templates_base 事实,默认为 roles_folder 并提供一个完整的路径搜索。没关系。谢谢!
    【解决方案2】:

    上面@Zeitounator的回复是完全合法的。

    但在 Ansible 角色的作者不响应或装傻的情况下,还有另一种更简单的方法。

    步骤:

    1) 像你一样执行角色,不要改变任何东西

    2) 编写一小段 Ansible 代码来简单地自己覆盖任何文件或模板。

    简单的方法,对所有人来说都是不费吹灰之力的。

    干杯

    【讨论】:

    • 我更愿意派生角色并自己进行修改,甚至编写一个新角色。你的方法确实很简单,没有脑子。但它会在每次 playbook 运行时覆盖给定的模板文件两次,消除幂等性,在运行应用程序之间存在所有可能的风险,即使只有几秒钟,配置错误。这对我来说是完全不行的。
    猜你喜欢
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 2021-07-26
    • 2018-10-05
    • 1970-01-01
    相关资源
    最近更新 更多