有没有办法覆盖定义为 ansible galaxy 角色的模板?

Is there a way to override a template defined into an ansible galaxy role?

我正在尝试使用 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 上分叉 galaxy 角色,然后按我的意愿编辑文件 passenger.j2,但我不知道是否有 "better"方法:)

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

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

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

上面@Zeitounator 的回复完全合法

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

步骤:

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

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

简单的方法,对所有人来说都是显而易见的。

干杯