试图在 ansible playbook 中动态引用 jinja 模板
attempting to dynamically reference jinja templates in ansible playbook
我正在尝试动态引用从 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"
因错误而失败:
failed: [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-1457719702.84-279730849155325/source", "validate": null}}, "item": "/tmp/tardis/forecast.j2", "msg": "Destination directory /path/tardis/tardis/sqoopgen_jobs//tmp/tardis does not exist"}
我正在阅读此作为 ansible 不在变量内扩展变量的情况:
在这种情况下最好的方法是什么?我想让剧本尽可能通用。
ansible 2.0.1.0
谢谢
你不能像这样嵌套 Jinja 表达式:
{{ item|replace("/tmp/{{ FEED_NAME }}/", "") }}
你想要的是连接字符串。
{{ item|replace("/tmp/" ~ FEED_NAME ~ "/", "") }}
参见"Other Operators" in the Jinja2 docs:
~
Converts all operands into strings and concatenates them.
{{ "Hello " ~ name ~ "!" }}
would return (assuming name is set to '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"
我正在尝试动态引用从 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"
因错误而失败:
failed: [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-1457719702.84-279730849155325/source", "validate": null}}, "item": "/tmp/tardis/forecast.j2", "msg": "Destination directory /path/tardis/tardis/sqoopgen_jobs//tmp/tardis does not exist"}
我正在阅读此作为 ansible 不在变量内扩展变量的情况:
在这种情况下最好的方法是什么?我想让剧本尽可能通用。
ansible 2.0.1.0
谢谢
你不能像这样嵌套 Jinja 表达式:
{{ item|replace("/tmp/{{ FEED_NAME }}/", "") }}
你想要的是连接字符串。
{{ item|replace("/tmp/" ~ FEED_NAME ~ "/", "") }}
参见"Other Operators" in the Jinja2 docs:
~
Converts all operands into strings and concatenates them.
{{ "Hello " ~ name ~ "!" }}
would return (assuming name is set to'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"