Ansible 是否可以在模板 src 中使用变量

Ansible 是否可以在模板 src 中使用变量

在 ansible 中,我们尝试根据变量访问不同的模板。

我们有以下模板文件,例如:

templates
    app1.conf.j2
    app2.conf.j2
    app3.conf.j2

taks
    app.yml

在任务中,我们需要根据应用程序名称复制模板文件。例如:我们将为 app1 或 app2 或 app3 指定一个名为“instance_name”的变量。

现在根据变量我们需要将应用程序文件复制到 /opt/(( instance_name }}/conf.d/。

我们创建了如下的 ansbile 任务但它不起作用。

- name: 'Copy {{ instance_name }} file to /opt/conf.d/ Directory'
    template:
      src: "{{ instance_name }}.conf.j2"
      dest: "/opt/{{ instance_name }}/conf.d/"
      owner: root
      group: root
      mode: 0644

     

当我们将“src”硬编码到app1.conf.j2时,它适用于app1。

来自此网址https://docs.ansible.com/ansible/latest/modules/template_module.html#parameter-src它指定的值可以是相对路径或绝对路径。

请让我们知道这种方法是否可行?我们有大约 20 个应用程序,简化 ansible playbook 以仅指定变量的最佳方法是什么。

答案1

没有最佳实践,只有关于某个特定问题的解决方案有多优雅的意见。对于 Ansible 来说尤其如此,因为它具有灵活性,可以让你按照自己想要的方式做事。


角色很棒。可以为每个应用程序组创建一个角色,每个角色都包含所需的配置模板,例如 roles/app1/templates/app1.conf.j2 它可能有多个任务和模板,例如如果应用程序通过服务管理器启动某个进程,确保主机防火墙允许它,并且还通过某个服务网格连接起来。

app1defaults/main.yml可能包含

instance_name: app1

然后可以使用tasks/main.yml(为了简洁起见,省略了一些参数,也许它们被移动到了模块默认值在一个街区上。

- name: 'Copy config to /opt/conf.d/'
    template:
      src: "{{ instance_name }}.conf.j2"
      dest: "/opt/{{ instance_name }}/conf.d/"

如果所有这些都和你的剧本一起放在一棵树上(不是必需的,特别是角色可以存储在其他地方),它可能看起来像文档中的内容组织示例

playbook.yml
roles/
  app1/
    tasks/
      main.yml
    templates/
      app1.conf.j2
  app2/
    tasks/
      main.yml
    templates/
      app2.conf.j2 

然后剧本只需列出它们:

roles:
- app1
- app2

此类角色的实现可能会重复,因为每个角色都需要做同样的事情。如果角色仅在几个变量上有所不同,请创建一个通用角色并使用不同的角色参数多次调用它。

roles:
- role: appgeneric
  vars:
    instance_name: app1 
- role: appgeneric
  vars:
    instance_name: app2

模块参数的变量很棒,你的问题的答案是肯定的。然而, 变量任务名称实际上不起作用。任务名称是全局的并且已提前解析,因此可能是--extra-varscli 参数但不是循环迭代或主机特定变量。

那么,如果您有一个通用命名角色和一个通用命名任务,需要进行 20 次应用部署,该怎么办?错误应该是有用的,如果模板无法加载文件,它会告诉您哪个文件名。稍微增加详细程度有助于 ansible-playbook -vv了解发生了什么,但很混乱和冗长。考虑在 Ansible 之上使用剧本日志记录软件,如 ARA 或 AWX/Tower。这些报告显示了哪些执行加载了哪些变量,可以提供上下文。

相关内容