Tips

為 List 裡的每個元素加字串

想為 List 裡的每個元素加字串,也就是原本是這樣的 List

my_list:
  - apple
  - banana
  - watermelon

要讓輸出結果變為

new_list:
  - "fruit: apple"
  - "fruit: banana"
  - "fruit: watermelon"

那該怎麼做呢?有好幾種方式可以作

解壓縮只取第二層目錄以下的檔案與目錄

Angular/Vue 這類的前端框架,在執行 npm run build 建置以後,會產生 dist 的資料夾,裏面就是要佈署的檔案。一般會使用 tar czf dist.tar.gz dist 將該資料夾裡的檔案打包為 tarball。

使用 Ansible 佈署時,需要使用 unarchive 模組解壓縮,這時會直接解壓縮出 dist 目錄。

通常解法會有兩種,第一種是在打包時,先進入 dist 資料夾,再進行打包。

第二種方法就是本文要介紹的小技巧。

如何在 list 裡新增內容或合併兩個 list?

使用場景

寫作 Playbook 若遇到這兩種情況時,可以怎麼做呢?

  1. 新增內容到 list 裡
  2. 合併兩個 list

方法

方法相當簡單,使用 + 就可以。

新增內容到 list 時,可以這樣寫

- name: 配置 list
  set_fact:
    result_list: []

- name: 取得時間
  shell: date +%T
  register: shell_result

- name: 附加內容到 result_list
  set_fact:
    result_list: "{{ result_list + [ shell_result.stdout ]}}"
  
- name: 再次取得時間
  shell: sleep 3 && date +%T
  register: shell_result

- name: 附加內容到 result_list
  set_fact:
    result_list: "{{ result_list + [ shell_result.stdout ]}}"

若是要合併兩個 list,就是這樣寫

小技巧 - Inventory 格式的轉換

Inventory 就是主機清單,裏面描述主機的連線資訊,一般文件常用的是 ini 格式。

但在 DO447 的第二章有提到 inventory 格式的轉換,我自己是比較熟悉 ini 格式的 inventory,所以對於要轉換為 YAML 格式的地方就覺得比較卡頓。

那該怎麼克服呢?我臨機一動,想到 ansible 有提供 ansible-inventory 指令,用這個就可以解決我的問題。

祕訣 - 關於 ansible.cfg

這是我在前兩天在寫 DO447 練習題時所發現的一個小技巧,覺得非常實用,特別是在無法上網查詢的時候。

ansible.cfg 是 ansible 預設會去讀取的設定檔,裏面可以設定很多,例如:

祕訣 - 關於 lookup

你可以使用 ansible-doc -t lookup -l 列出所有可用的 lookup plugins。

找到以後,就可以用 ansible-doc -t lookup <the_plugin> 來看它的用法。