星期三, 10月 23, 2019

Ansible – 版本判斷條件句

執行之前寫好的 Ansible 腳本,卻有錯誤,奇怪,明明之前是好的啊?看了錯誤訊息,發現是找不到 /proc/sys/net/ipv4/tcp_tw_recycle 這個檔案的關係。怎麼會沒有這個檔案呢?使用 SSH 連上主機去看,還真的是沒有,上網找了之後,發現是 Linux Kernel 在 4.12 以後移除掉這檔案了(連結)。
好吧,因為腳本還有機會在較低版本的 Linux kernel 使用,必須得使用條件式來處理。在 Ansible 腳本裡,可以用 when 來做條件判斷,但是要怎麼取得 Linux kernel 版本以及做條件判斷呢?在 StackOverflow 上看到這篇:How to compare kernel (or other) version numbers in Ansible
從這篇得知:
  1. 可以使用 ansible_kernel 就可以取得 Linux kernel 版本
  2. 可以使用 version_compare 來比較版本
所以下面的腳本就可以在 Linux kernel 是 4.12 以後的版本印出 “foo”
tasks:
  - name: Display "foo" if kernel > 4.12
    debug:
      msg: "foo"
      when: ansible_kernel | version_compare('4.12', '>')
太好了。可是再仔細看,執行時有 deprecated 的警告耶,說在之後會把 version_compare 拿掉。上 Ansible 網站看了 Ansible 的文件之後,做了調整,新的語法要使用 “is” 來判斷,然後用 version() 來取代 version_compare。
tasks:
  - name: Display "foo" if kernel > 4.12
    debug:
      msg: "foo"
      when: ansible_kernel is version('4.12', '>')
好,收工。

沒有留言: