小技巧 - 遇到需要兩個大括號該怎麼辦?

最近在使用 openshift 的指令 - oc,oc 可以使用 template 來輸出所需要的結果,可是 oc 的 template 裡剛巧也是用 {{,這就導致了 Ansible 以為這是自己要處理的而導致處理錯誤。

那麼該怎麼辦呢?

這時候可以用兩種方式解決:

第一種方式是使用 {% raw %} ... {% endraw %}

舉個例子:

---
- name: Escape double braces - using raw
  hosts: localhost

  tasks:
    - name: Run openshift command
      shell: oc get pods -o go-template='Hello, World! {% raw %}{{ {% endraw %}"\n"{% raw %} }}{% endraw %}'
      register: shell_result

這樣子就可以讓 oc 能使用 {{ }} 了。 如果覺得在 {{ }} 前後加上 {% raw %}...{% endraw %} 很麻煩的話,可以直接加前後,例如

- name: Run openshift command
  shell: "{% raw %}oc get pods -o go-template='Hello, World! {{ \"\n\" }}'{% endraw %}"
  register: shell_result

第二種方式是使用 !unsafe

例如:

---
- name: Escape double braces - using unsafe
  hosts: localhost

  tasks:
    - name: Test
      vars:
        cmd_string: !unsafe docker inspect --format '{{ .NetworkSettings.IPAddress }}' silly_lovelace
      shell: "{{ cmd_string }}"
      register: shell_result

    - debug:
        msg: "{{ shell_result.stdout }}"

這裡有點不一樣的是,預先宣告字串在 vars 裡,然後才帶入到 shell ,這是使用 !unsafe 時要注意的地方。

參考資料: