代码之家  ›  专栏  ›  技术社区  ›  edesz

Ansible用jinja2模板连接2个文件

  •  2
  • edesz  · 技术社区  · 6 年前

    我试图垂直连接两个文件

    第一个文件是 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" %}
    

    此任务给出错误消息(与第二个 包括 报表来自 角色/myrolename/templates/requirements.dat.j2 )

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

    这似乎表明Ansible正在期待 /home/wr/myprojects/myprojectname/requirements.txt 是模板而不是文件。然而,第一个 包括 行不抛出错误。这让我很困惑。

    我能用什么方法 包括 将这两个文件与 jinja2 模板,还是有其他方法连接这两个文件?

    编辑1:

    我补充说 {# a comment #} 到第1行 requirements.txt . 这是新的 ~/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来处理上面的问题 需求.txt (与 {评论} 在第1行)作为 金贾2 通过重新命名文件来创建模板。我重新命名了文件 需求.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"
    }
    

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Vladimir Botka    6 年前

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

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