Ansible

如何把 block 放在回圈裡?

因為之前寫程式的經驗,很直覺的想可以在 block 加上 loop,像這樣

- set_fact:
    user_list:
    - John
    - Mary
    - Jane
- block:
  - debug:
      msg: "start of loop"
  - debug:
      msg: "Hello {{ item }}"
  - debug:
      msg: "end of loop"
  loop: "{{ user_list }}"

序列

之前想要產生一堆使用者,例如 user01, user02, user03… ,那時候在想用 with_items 或 loop 要怎麼做?好像沒有好的方法,找了好一會,才在 Ansible 文件裡找到,原來 Ansible 已經有內建序列可以這樣用了。

AnsibleFest-2022

2022 年 10 月 18 日 ~ 2022 年 10 月 19 日,Red Hat 將在 Chicago 舉辦 AnsibleFest 2022,有多項議程也有可以實作的工作坊,有興趣的人可以透過這個連結報名:http://ansiblefest.com/

取得所有 SATA 的磁碟

最近要使用 smartmontools 套件裡的 smartctl 來查閱硬碟的 S.M.A.R.T. 狀態,做定期檢查,以免來不及去備份跟更換。這邊打算寫 ansible playbook 來作,所以就需要先取得主機上的所有硬碟。 好在 Ansible 本身在收集資訊時,就已經收集了,只是,這裏面還包含有 CD-ROM、Loop 等的裝置,我只想要 SATA 類型的啊~

小技巧 - 如何在迴圈裡註冊變數

單一個模組執行結果,可以使用 register 把結果放到變數裡。

如果這模組要搭配迴圈執行多次,又要把結果放到變數裡時,要怎麼寫呢?因為之前沒有用過,腦袋不禁打結了,心裡開始在盤算該怎麼處理比較好?但好在,早有人提出解答。

如何在 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,就是這樣寫

postgresql_user

使用 postgresql_xxx 的模組存取 Postgresql 資料庫時,一般會需要切換為 postgres 使用者來進行操作。在 Ansible 可以怎麼去做呢?