如何在ansible中传递今天的日期和时间作为参数

问题描述 投票:0回答:3

我正在使用 ansible 运行 python 脚本。

这是我的剧本 -

- name: Run python script 
  command: python Test.py -StartDate 2020-10-01T00:00:00 -EndDate 2020-11-05T00:00:00
  register: result
- debug: msg="{{result.stdout}}"

我希望此剧本在运行脚本时使用 EndDate 作为今天的日期。如何使用每次运行脚本时编写的相同格式的最新日期和时间,而不必每天手动更改?

ansible ansible-2.x
3个回答
7
投票

问:“如何使用最新的日期和时间...?”

A:给出下面的脚本

shell> cat test.sh
#!/bin/sh
echo $1

如果以秒为单位的粒度足够,最有效的方法是使用函数 strftime

    - name: Run script
      command: >
        {{ playbook_dir }}/test.sh '{{ "%Y-%m-%d %H:%M:%S"|strftime }}'
      register: result
    - debug:
        var: result.stdout

给予

  result.stdout: '2023-05-09 00:09:29'

如果您需要微秒,请使用 Ansible 事实变量 ansible_date_time

    - setup:
        gather_subset: date_time
    - name: Run script
      command: "{{ playbook_dir }}/test.sh {{ ansible_date_time.iso8601_micro }}"
      register: result
    - debug:
        var: result.stdout

给予

  result.stdout: '2023-05-08T22:09:29.023295Z'

备注:

  • 字典 ansible_date_time 也将在剧本启动时由 'gather_facts: true' 创建。

  • 如果需要的话字典里还有其他属性

  ansible_date_time:
    date: '2023-05-09'
    day: 09
    epoch: '1683583769'
    epoch_int: '1683583769'
    hour: '00'
    iso8601: '2023-05-08T22:09:29Z'
    iso8601_basic: 20230509T000929023295
    iso8601_basic_short: 20230509T000929
    iso8601_micro: '2023-05-08T22:09:29.023295Z'
    minute: 09
    month: '05'
    second: '29'
    time: 00:09:29
    tz: CEST
    tz_dst: CEST
    tz_offset: '+0200'
    weekday: Tuesday
    weekday_number: '2'
    weeknumber: '19'
    year: '2023'
  • 当 playbook 运行时,变量 ansible_date_time 不会自动更新。例如,
    - debug:
        var: ansible_date_time.iso8601_micro
    - debug:
        var: ansible_date_time.iso8601_micro
    - debug:
        var: ansible_date_time.iso8601_micro

给予(删节)

  ansible_date_time.iso8601_micro: '2023-05-08T22:09:29.023295Z'
  ansible_date_time.iso8601_micro: '2023-05-08T22:09:29.023295Z'
  ansible_date_time.iso8601_micro: '2023-05-08T22:09:29.023295Z'
  • 运行模块setup以更新变量ansible_date_time。例如,
    - setup:
        gather_subset: date_time
    - debug:
        var: ansible_date_time.iso8601_micro
    - setup:
        gather_subset: date_time
    - debug:
        var: ansible_date_time.iso8601_micro
    - setup:
        gather_subset: date_time
    - debug:
        var: ansible_date_time.iso8601_micro

给予(删节)

  ansible_date_time.iso8601_micro: '2023-05-08T22:09:29.845384Z'
  ansible_date_time.iso8601_micro: '2023-05-08T22:09:30.390135Z'
  ansible_date_time.iso8601_micro: '2023-05-08T22:09:31.059892Z'
  • 功能stftime自动更新日期和时间
    - debug:
        msg: "{{ '%Y-%m-%d %H:%M:%S'|strftime }}"
    - wait_for:
        timeout: 1
    - debug:
        msg: "{{ '%Y-%m-%d %H:%M:%S'|strftime }}"
    - wait_for:
        timeout: 1
    - debug:
        msg: "{{ '%Y-%m-%d %H:%M:%S'|strftime }}"

给予(删节)

  msg: '2023-05-09 00:26:58'
  msg: '2023-05-09 00:27:00'
  msg: '2023-05-09 00:27:01'

1
投票

假设

T00:00:00
始终固定,您可以使用查找插件声明一个变量,请参阅
exec_date
变量和修改后的
command
任务下面的示例:

---
- hosts: localhost
  gather_facts: false
  vars:
    exec_date: "{{ lookup('pipe', 'date +%Y-%m-%d') }}T00:00:00"

  tasks:
  - name: print
    debug: var=exec_date

  - name: Run python script 
    command: "python Test.py -StartDate 2020-10-01T00:00:00 -EndDate {{ exec_date }}"
    register: result
  - debug: msg="{{result.stdout}}"

如果您也想传递当前时间而不是固定的

T00:00:00
,您可以使用以下内容:

  vars:
    exec_date: "{{ lookup('pipe', 'date +%Y-%m-%dT%H:%M:%S') }}"

干杯


0
投票

您可以使用接受 strftime 字符串的 fmt 参数调用

now() 函数

---
- hosts: localhost
  vars:
    exec_date: "{{ now(fmt='%Y-%m-%d') }}T00:00:00"
© www.soinside.com 2019 - 2024. All rights reserved.