ansible_date_time

仔細算算,已經查了 ansible_date_time 這個變數的用法超過三次,所以記錄一下,以後查找也方便。

Ansible 在收 facts 時,會把受管主機(遠端機器)的日期時間放到 ansible_date_time 這個變數裡。

ansible_date_time 有以下屬性可以使用:

  • date: 日期,格式為 “年-月-日”,例如: “2021-05-03”
  • day": 日,例如:“03”
  • epoch: 自 1970-01-01 0:0:0 起到現在的總秒數,例如 “1620055364”
  • hour: 時,例如:“11”,
  • iso8601: ISO8601 格式的日期時間,例如:“2021-05-03T15:22:44Z”
  • iso8601_basic: 一樣是 ISO8601 格式的日期時間,沒有分隔符號,時間是"時分秒微秒",例如:“20210503T112244489703”
  • iso8601_basic_short: 一樣是 ISO8601 格式的日期時間,沒有分隔符號,時間是"時分秒",例如:“20210503T112244”
  • iso8601_micro: 一樣是 ISO8601 格式的日期時間,加上微秒,例如:“2021-05-03T15:22:44.489703Z”
  • minute: 分,例如:“22”
  • month": 月,例如:“05”
  • second: 秒,例如:“44”
  • time: 時間,例如:“11:22:44”
  • tz": 時區,例如 “EDT”
  • tz_offset: 時差,例如 “-0400”
  • weekday: 星期幾,例如:“Monday”
  • weekday_number: 星期幾,使用數字表示,例如:“1”
  • weeknumber: 一年的第幾週,例如:“18”
  • year: 年,例如:“2021”

那麼該怎麼使用呢?

---
- name: How to use ansible_date_time
  hosts: all
  gather_facts: true
  
  tasks:
  - name: Display ansible_date_time in ISO8601
    debug:
      msg: "Current date/time is {{ ansible_date_time.iso8601 }}"

這邊要注意的一點是 gather_facts: true

如果沒有這一行或執行 setup 模組的話,ansible_date_time 是會被視為一個未定義的變數的。

---
- name: Test ansible_date_time
  hosts: all
  gather_facts: false

  tasks:
    - debug:
        var: ansible_date_time

    - setup:

    - debug:
        var: ansible_date_time

執行上面的 playbook 以後,輸出結果如下

PLAY [Test ansible_date_time] **********************************************************************************************

TASK [debug] ***************************************************************************************************************
ok: [10.11.12.13] => {
    "ansible_date_time": "VARIABLE IS NOT DEFINED!"
}

TASK [setup] ***************************************************************************************************************
ok: [10.11.12.13]

TASK [debug] ***************************************************************************************************************
ok: [10.11.12.13] => {
    "ansible_date_time": {
        "date": "2021-05-03",
        "day": "03",
        "epoch": "1620055364",
        "hour": "11",
        "iso8601": "2021-05-03T15:22:44Z",
        "iso8601_basic": "20210503T112244489703",
        "iso8601_basic_short": "20210503T112244",
        "iso8601_micro": "2021-05-03T15:22:44.489703Z",
        "minute": "22",
        "month": "05",
        "second": "44",
        "time": "11:22:44",
        "tz": "EDT",
        "tz_offset": "-0400",
        "weekday": "Monday",
        "weekday_number": "1",
        "weeknumber": "18",
        "year": "2021"
    }
}

PLAY RECAP *****************************************************************************************************************
10.11.12.13               : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

所以 ansible_date_time 裡的日期時間是受管主機上的日期時間,那如果想要取得執行 ansible playbook 的主機上的日期時間呢? 這時候可以使用 lookup(‘pipe’) 來取得:

- hosts: all
  tasks:
    - debug:
        msg: "{{ lookup('pipe','date \"+%Y-%m-%d %H:%M:%S\"') }}

好囉,下次要用到 ansible_date_time 時,來看這篇就知道怎麼用了。

參考資料: