Ansible: использование ansible_date_time для получения даты/времени

Автор: | 12/07/2018

Имеется задача по созданию архива, в имени которого хочется добавлять дату и время его создания.

Для получения даты-времени можно использовать ansible_date_time.

Проверяем.

Добавлем задачу, которая выведет всё содержимое:

- name: Test date
  debug:
    msg: "{{ ansible_date_time }}"

Запускаем:

[simterm]

$ ansible-playbook -i hosts.ini --tags test --limit mobilebackend-dev mobilebackend.yml --extra-vars "ansible_connection=local"

PLAY [all] ****

TASK [Gathering Facts] ****
ok: [dev.mobilebackend.domain.world]

TASK [test : Test date] ****
ok: [dev.mobilebackend.domain.world] => {
    "msg": {
        "date": "2018-07-11",
        "day": "11",
        "epoch": "1531319553",
        "hour": "17",
        "iso8601": "2018-07-11T14:32:33Z",
        "iso8601_basic": "20180711T173233946920",
        "iso8601_basic_short": "20180711T173233",
        "iso8601_micro": "2018-07-11T14:32:33.946988Z",
        "minute": "32",
        "month": "07",
        "second": "33",
        "time": "17:32:33",
        "tz": "EEST",
        "tz_offset": "+0300",
        "weekday": "Wednesday",
        "weekday_number": "3",
        "weeknumber": "28",
        "year": "2018"
    }
}

[/simterm]

Теперь – попробуем получить отдельные значения, например date:

- name: Test date
  debug:
    msg: "{{ ansible_date_time.date }}"

Запускаем:

[simterm]

...
TASK [test : Test date] ****
ok: [dev.mobilebackend.domain.world] => {
    "msg": "2018-07-11"
}
...

[/simterm]

Попробуем скомибинировать:

- name: Test date
  debug:
    msg: "Filename will be: backupname-{{ ansible_date_time.date }}-{{ ansible_date_time.hour }}-{{ ansible_date_time.minute }}.tar"

Проверяем:

[simterm]

...
TASK [test : Test date] ****
ok: [dev.mobilebackend.domain.world] => {
    "msg": "Filename will be: backupname-2018-07-11-17-36.tar"
}
...

[/simterm]

Можно вынести дату-время в отдельную переменную, используя set_fact:

- set_fact:
    bkp_date_time: "{{ ansible_date_time.date }}-{{ ansible_date_time.hour }}-{{ ansible_date_time.minute }}"

- name: Test date
  debug:
    msg: "Filename will be: backupname-{{ bkp_date_time }}.tar"

Запускаем:

[simterm]

...
TASK [test : set_fact] ****
ok: [dev.mobilebackend.domain.world]

TASK [test : Test date] ****
ok: [dev.mobilebackend.domain.world] => {
    "msg": "Filename will be: backupname-2018-07-11-17-39.tar"
}
...

[/simterm]

И ещё один вариант – это получить дату-время через pipe из шела:

...
- name: Date from $(date) execution via pipe
  debug:
    msg: "Date-time: {{ lookup('pipe','date +%Y-%m-%d-%H-%M-%S') }}"

Результат:

[simterm]

...
TASK [test : Date from $(date) execution via pipe] ****
ok: [dev.mobilebackend.domain.world] => {
    "msg": "Date-time: 2018-07-11-17-40-58"
}
...

[/simterm]

Готово.