【问题标题】:Ansible concatenate 2 files with jinja2 templateAnsible 使用 jinja2 模板连接 2 个文件
【发布时间】:2018-07-30 23:12:07
【问题描述】:

我正在尝试垂直连接 2 个文件

第一个文件是roles/myrolename/files/requirements.dat

numpy
matplotlib
dask

第二个文件是~/myprojects/myprojectname/requirements.txt

django
pywinrm
scipy

这是我尝试结合这两个文件,基于

这是我正在使用的task

- name: Play to combine 2 files
  hosts: localhost
  connection: local

  vars:
    myprojects_path: myprojects
    my_proj_name: myprojectname

  tasks:
    - name: Concatenate 2 files
      template:
        src: "roles/myrolename/templates/requirements.dat.j2"
        dest: "{{ myprojects_path }}/{{ my_proj_name }}/requirements.dat"

这里是roles/myrolename/templates/requirements.dat.j2

{% include 'roles/myrolename/files/requirements.dat' %}
{% include myprojects_path + "/" + my_proj_name + "/" + "requirements.txt" %}

此任务给出错误消息(与来自roles/myrolename/templates/requirements.dat.j2 的第二条include 语句有关)

fatal: [my_local_machine]: FAILED! => {"changed": false, 
"msg": "TemplateNotFound: /home/wr/myprojects/myprojectname/requirements.txt"}

这似乎表明 Ansible 期望 /home/wr/myprojects/myprojectname/requirements.txt 是一个模板而不是一个文件。但是,第一行 include 不会引发错误。这让我很困惑。

有没有一种方法可以使用include 将这两个文件与jinja2 模板连接起来,或者有其他方法可以连接这两个文件吗?

编辑 1:

我在requirements.txt 的第一行添加了{# a comment #}。这是新的~/myprojects/myprojectname/requirements.txt

{# a comment #}
django
pywinrm
scipy

然后,我重新运行了剧本ansible-playbook test.yml -vvv。这是输出

<127.0.0.1> ESTABLISH LOCAL CONNECTION FOR USER: wr
<127.0.0.1> EXEC /bin/sh -c 'echo ~wr && sleep 0'
<127.0.0.1> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /home/wr/.ansible/tmp/ansible-tmp-1532962816.77-184726406959930 `" && echo ansible-tmp-1532962816.77-184726406959930="` echo /home/wr/.ansible/tmp/ansible-tmp-1532962816.77-184726406959930 `" ) && sleep 0'
<127.0.0.1> EXEC /bin/sh -c 'rm -f -r /home/wr/.ansible/tmp/ansible-tmp-1532962816.77-184726406959930/ > /dev/null 2>&1 && sleep 0'
fatal: [wr-box]: FAILED! => {
    "changed": false, 
    "msg": "TemplateNotFound: /home/wr/myprojects/myprojectname/requirements.txt"
}

编辑 2:

我试图通过重命名文件来要求 Ansible 将上述 requirements.txt(第一行带有 {# a comment #})视为 jinja2 模板。我将文件 requirements.txt 重命名为 requirements.txt.j2 并重新运行剧本。它给出了这个输出

<127.0.0.1> ESTABLISH LOCAL CONNECTION FOR USER: wr
<127.0.0.1> EXEC /bin/sh -c 'echo ~wr && sleep 0'
<127.0.0.1> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /home/wr/.ansible/tmp/ansible-tmp-1532963056.03-76693523230507 `" && echo ansible-tmp-1532963056.03-76693523230507="` echo /home/wr/.ansible/tmp/ansible-tmp-1532963056.03-76693523230507 `" ) && sleep 0'
<127.0.0.1> EXEC /bin/sh -c 'rm -f -r /home/wr/.ansible/tmp/ansible-tmp-1532963056.03-76693523230507/ > /dev/null 2>&1 && sleep 0'
fatal: [wr-box]: FAILED! => {
    "changed": false, 
    "msg": "TemplateNotFound: /home/wr/myprojects/myprojectname/requirements.txt.j2"
}

它似乎仍然找不到模板文件,即使我已经检查过它确实存在于我指定的位置。

【问题讨论】:

  • 您是否尝试过以详细模式运行以查看是否有提示 jinja 如何解决包含问题?您是否尝试过在requirement.txt 中添加模板指令,例如{# a comment #}
  • @techraf 谢谢。我的 requirements.txt 文件位于 playbook 目录之外。正如您的链接所暗示的那样,这是不允许的,因此它没有将 requirements.txt 检测为模板。这回答了我的问题。我将只在templates/ 中创建模板并从那里调用它们。

标签: ansible jinja2


【解决方案1】:

通常include 语句将文件视为模板。此外,您示例中的文件 requirements.txt 通常是一个模板,没有变量,只有文本。

文件/home/wr/myprojects/myprojectname/requirements.txt是否存在?

【讨论】:

  • 是的,该文件确实存在。但是,正如你所说,它是一个没有变量的文本文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
相关资源
最近更新 更多