是否可以在Ansible Playbook中操纵日期

Ric*_*ard 2 ansible

我在其中一部剧本中使用ansible_date_time.houransible_date_time.minute

但是我需要在这些事实上(或在变量中)添加时间。即,如果ansible_date_time.hour返回16-我想增加几个小时,或者如果ansible_date_time.minute返回40-我希望它是50。

当然,小时和分钟的上限是23和59 ...正如我想到的,从以下位置注册变量:

- name: Register HH  
  shell: date '+%H'
  register: HP_HH
- debug: msg="{{ HP_HH.stdout | int + 3 }}"
Run Code Online (Sandbox Code Playgroud)

但是很明显,如果我的剧本在21:00之后运行,那我就不走运了。

有人有建议或解决方法吗?

Kon*_*rov 5

AFAIK,在Ansible中无法直接添加/减去时间单位。

您可以datetime使用to_datetime过滤器(Ansible 2.2+)将字符串转换为对象。
您可以计算日期差。看到这个答案。

但是,如果您不介意使用简单的过滤器插件,则可以执行以下操作:

将此代码./filter_plugins/add_time.py放在您的剧本附近:

import datetime

def add_time(dt, **kwargs):
    return dt + datetime.timedelta(**kwargs)

class FilterModule(object):

    def filters(self):
        return {
            'add_time': add_time
        }
Run Code Online (Sandbox Code Playgroud)

您可以add_time如下使用自己的过滤器:

- hosts: localhost
  gather_facts: yes
  tasks:
    - debug:
        msg: "Current datetime is {{ ansible_date_time.iso8601 }}"
    - debug:
        msg: "Current time +20 mins {{ ansible_date_time.iso8601[:19] | to_datetime(fmt) | add_time(minutes=20) }}"
      vars:
        fmt: "%Y-%m-%dT%H:%M:%S"
Run Code Online (Sandbox Code Playgroud)

add_time与Python中的timedelta具有相同的参数。