lookup - template

lookup 是很方便的查詢函式,第一個參數是 ’template’ 的時候,可以把範本檔案放到第二個參數,然後 lookup 會把範本內容替換變數以後,再傳回字串。

一樣,舉個例子會比較容易理解。

現在有一個範本檔案:index.html.j2

<h1>Greeting</h1>
<p>Hello! {{ name }}</p>
<p>The date is {{ ansible_date_time.iso8601 }}</p>
<p>Hostname: {{ ansible_hostname }} {{ inventory_hostname }}</p>

然後撰寫 playbook 如下

# 檔名:test-lookup-template.yml
---
- name: lookup - template 的範例
  hosts: all

  tasks:
    - name: 使用 lookup('template') 來處理範本檔案
      vars:
        name: John Doe
      debug:
        msg: "{{ lookup('template', 'index.html.j2') }}"

然後試著執行看看

ansible-playbook -i localhost, -c local test-lookup-template.yml

執行結果如下

PLAY [lookup - template 的範例] *************************************************************

TASK [Gathering Facts] *******************************************************************
ok: [localhost]

TASK [使用 lookup('template') 來處理範本檔案] *****************************************************
ok: [localhost] => {
    "msg": "<h1>Greeting</h1>\n<p>Hello! John Doe</p>\n<p>The date is 2021-03-08T21:54:49Z</p>\n<p>Hostname: my-demo-host localhost</p>\n"
}

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

看看 msg ,你可以看到範本裡的變數 {{ name }}、{{ ansible_date_time.iso8601 }}、{{ ansible_hostname }}、{{ inventory_hostname }} 都已經替換掉。

  • name 被替換為指定的 John Doe
  • ansible_date_time.iso8601 被替換為 iso8601 格式的日期時間
  • ansible_hostname 被替換為主機名稱,因為是連線到本機,這邊會看到本機的主機名稱。
  • inventory_hostname 被替換為 inventory 裡所指定的主機名稱,指令裡是用 -i localhost,,所以這邊會看到 localhost

lookup(’template’) 的作用跟 template 模組是一樣的,主要差別在於 lookup(’template’) 是處理過後,放到變數傳回來;而 template 模組是輸出到檔案。