试图在ansible playbook

时间:2016-03-11 18:57:29

标签: ansible jinja2

我正在尝试动态引用从artifactory中提取的j2模板。 以下代码有效:

  - name: Confiure the sqoop templates
    template: src="{{ item }}" dest="{{ local_root }}/{{ FEED_NAME }}/{{ FEED_SCHEMA }}/sqoopgen_jobs/{{ item|replace(\"/tmp/tardis/\", \"\") }}" mode=0744
    with_fileglob:
    - "/tmp/{{ FEED_NAME }}/*.j2"

以下内容不是:

  - name: Confiure the sqoop templates
    template: src="{{ item }}" dest="{{ local_root }}/{{ FEED_NAME }}/{{ FEED_SCHEMA }}/sqoopgen_jobs/{{ item|replace(\"/tmp/{{ FEED_NAME }}/\", \"\") }}" mode=0744
    with_fileglob:
    - "/tmp/{{ FEED_NAME }}/*.j2"

失败错误:

  

失败:[host_ip] => (item = / tmp / tardis / forecast.j2)=> {“changed”:true,“failed”:true,“invocation”:{“module_args”:{“backup”:false,“content”:null,“delimiter”:null,“dest”:“/ path / tardis /tardis/sqoopgen_jobs//tmp/tardis/forecast.j2“,”directory_mode“:null,”follow“:true,”force“:true,”group“:null,”mode“:”0744“,”original_basename“ :“forecast.j2”,“owner”:null,“regexp”:null,“remote_src”:null,“selevel”:null,“serole”:null,“setype”:null,“seuser”:null,“ src“:”/ home / jenkins / .ansible / tmp / ansible-tmp-457719702.84-279730849155325 / sources“,”validate“:null}},”item“:”/ tt /tardis / forecast.j2“,”msg “:”目的地目录/路径/ tardis / tardis / sqoopgen_jobs // tmp / tardis不存在“}

我正在读这个作为ansible不在变量中扩展变量的情况:such as here

在这种情况下,最好的方法是什么?我想让剧本尽可能保持通用。

ansible 2.0.1.0

感谢

1 个答案:

答案 0 :(得分:1)

你不能像这样嵌套Jinja表达式:

{{ item|replace("/tmp/{{ FEED_NAME }}/", "") }}

你想要的是连接字符串。

{{ item|replace("/tmp/" ~ FEED_NAME ~ "/", "") }}

请参阅"Other Operators" in the Jinja2 docs

  

     

将所有操作数转换为字符串并连接它们。

     

{{ "Hello " ~ name ~ "!" }}会返回(假设名称设置为'John'Hello John!

  - name: Configure the sqoop templates
    template:
      src: "{{ item }}"
      dest: "{{ local_root }}/{{ FEED_NAME }}/{{ FEED_SCHEMA }}/sqoopgen_jobs/{{ item|replace('/tmp/' ~ FEED_NAME ~ '/', '') }}"
      mode: 0744
    with_fileglob:
      - "/tmp/{{ FEED_NAME }}/*.j2"