使用带有 Ansible 的 Jinja2 过滤器格式化字符串列表

Format list of strings using Jinja2 filter with Ansible

我有一个类似于

的列表
my_apps:
  - bootstrap-client
  - theme-client
  - engine-client

我想把这个数组变成类似于

的字符串
$LOCAL_DIR/bootstrap-client-*.war $LOCAL_DIR/theme-client-*.war $LOCAL_DIR/engine-client-*.war

这可以使用 Jinja2 过滤器吗?在 Ansible 模板中?

您可以使用 Ansible 过滤器 regex_replace in combination with the map and join 过滤器来实现这一点。

因此必须使用正则表达式匹配整个列表项 ^(.*)$ 并在替换中使用 \1 反向引用它。

给你:

"{{ my_apps | map('regex_replace', '^(.*)$', '$LOCAL_DIR/\1-*.war' ) | join(' ') }}" 

鉴于剧本:

- hosts: all
  gather_facts: yes

  tasks:
    - debug:
        msg: "{{ my_apps | map('regex_replace', '^(.*)$', '$LOCAL_DIR/\1-*.war' ) | join(' ') }}" 
      vars:
        my_apps:
          - bootstrap-client
          - theme-client
          - engine-client

这产生:

PLAY [all] ********************************************************************************************************

TASK [debug] ******************************************************************************************************
ok: [localhost] => 
  msg: $LOCAL_DIR/bootstrap-client-*.war $LOCAL_DIR/theme-client-*.war $LOCAL_DIR/engine-client-*.war

PLAY RECAP ********************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0