はじめに
AnsibleのPlaybookを作成する際にファイルのバックアップなどで、現在の日時が必要となることがあるかと思います。
この記事では、Ansibleで現在日時を取得する方法を紹介します。
strftimeフィルターで取得
strftimeフィルターを引数なしで利用することで現在日時を取得できます。
- name: 日時の取得
ansible.builtin.set_fact:
date_time_now: "{{ '%Y%m%d%H%M' | strftime }}"
# 202606061401
lookupプライグインで取得
lookupプラグインのpipeを利用して日時情報を取得できます。
pipeでは任意のコマンドを実行できるため、dateコマンドを実行することで現在日時を取得します。
- name: 日時の取得
ansible.builtin.set_fact:
date_time_now: "{{ lookup('pipe', 'date +%Y%m%d%H%M') }}"
# 202606061401
上記2つの方法はコントロールノードで実行されるため、タイムゾーンもコントロールノードの設定に依存します。
ターゲットノードの設定に合わせた日時が必要な場合は後述の方法で取得しましょう。
setupモジュールで取得
setupモジュールでシステム情報を取得することができますが、こちらには日付の情報も含まれています。
この方法ではタイムゾーンもターゲットノードの値が取得できます。
以下のようなタスクで現在の日時を変数に格納できます。
- name: 時刻取得
ansible.builtin.setup:
gather_subset:
- "!all"
- "!min"
- "date_time"
- name: 変数格納
ansible.builtin.set_fact:
date_time_now: "{{ ansible_facts['date_time']['year'] }}{{ ansible_facts['date_time']['month'] }}{{ ansible_facts['date_time']['day'] }}{{ ansible_facts['date_time']['hour'] }}{{ ansible_facts['date_time']['minute'] }}" # noqa yaml[line-length]
# 202606062301
見てわかる通り、1行が長くなってしまうので、視認性は低下します。
また、ansible_factsに含まれる値を組み合わせる形になるため、フォーマットのカスタマイズをしにくいのがデメリットかなと思います。
さいごに
今回はAnsibleで現在日時を取得する方法を紹介しました。
それぞれの要件にあった方法で実装いただければと思います。