我正在尝试动态引用从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
感谢
答案 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"