【问题标题】:Ansible: customizable template filenamesAnsible:可自定义的模板文件名
【发布时间】:2018-12-10 16:21:00
【问题描述】:

我正在编写一个 Ansible 角色,其中我有一些模板必须在单个目标目录中以不同的名称多次出现。为了不必分别处理这些文件中的每一个,我需要能够将模板或其他形式的占位符替换也应用于它们的名称。举一个具体的例子,我可能有一个名为

的文件
{{ Client }}DataSourceContext.xml

我需要改成,比如说,

AcmeDataSourceContext.xml

我有许多此类文件必须安装在不同的目录中,但单个文件的所有副本都位于同一目录中。如果我不需要更改他们的名字或复制他们,我可以处理一大堆这样的文件,比如

- name: Process a whole subtree of templates
  template:
    src: "{{ item.src }}"
    dest: "/path/to/{{ item.path }}"
  with_filetree: ../templates/my-templates/
  when: item.state == 'file'

我想我想要一个打开文件名预处理的神奇consider_filenames_as_templates 切换开关。有没有办法近似这种行为?

【问题讨论】:

    标签: ansible jinja2 ansible-template


    【解决方案1】:

    几乎可以在 Ansible 中放置文字值的任何地方,您都可以替换为 a 变量的值。因此,例如,您可以执行以下操作:

    - template:
        src: sometemplate.xml
        dest: "/path/to/{{ item }}DataSourceContext.xml"
      loop:
        - client1
        - client2
    

    这最终会创建模板 /path/to/client1DataSourceContext.xml/path/to/client2DataSourceContext.xml.

    更新 1

    对于您在更新中提出的问题:

    我想我想要一个打开文件名预处理的神奇的 think_filenames_as_templates 切换。有没有办法近似这种行为?

    看来你可以这样做:

    - name: Process a whole subtree of templates
      template:
        src: "{{ item.src }}"
        dest: "/path/to/{{ item.path.replace('__client__', client_name) }}"
      with_filetree: ../templates/my-templates/
      when: item.state == 'file'
    

    也就是说,将文件名中的字符串 __client__ 替换为 client_name 变量的值。

    【讨论】:

    • 是的,这行得通,这很可能是我最终会做的事情。我希望有一种方法可以使用“with_fileglob”或“with_filetree”,而不必显式处理每个文件
    • 我扩展了我的问题描述
    • 确实如此。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多