可以在Ansible剧本中操纵日期吗

可以在Ansible剧本中操纵日期吗,ansible,Ansible,我在我的一本剧本中使用了ansible\u date\u time.hour和ansible\u date\u time.minute 但我需要在这些事实(或变量)上加上时间。。i、 e.如果ansible\u date\u time.hour返回16-我想添加几个小时,或者如果ansible\u date\u time.minute返回40-我想它是50 当然,小时和分钟的上限是23和59。。。当我考虑从以下位置注册变量时: - name: Register HH shell: dat

我在我的一本剧本中使用了
ansible\u date\u time.hour
ansible\u date\u time.minute

但我需要在这些事实(或变量)上加上时间。。i、 e.如果
ansible\u date\u time.hour
返回16-我想添加几个小时,或者如果
ansible\u date\u time.minute
返回40-我想它是50

当然,小时和分钟的上限是23和59。。。当我考虑从以下位置注册变量时:

- name: Register HH  
  shell: date '+%H'
  register: HP_HH
- debug: msg="{{ HP_HH.stdout | int + 3 }}"
但很明显,如果我的剧本在21:00之后运行,我就不走运了


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

好的,在Ansible中没有现成的方法来添加/减去时间单位

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

但是如果您不介意使用一个简单的过滤器插件,那么您可以:

将此代码作为
/filter\u plugins/add\u 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
        }
您可以使用自己的
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"

add\u time
的参数与Python中的参数相同。

我在搜索时遇到了这个问题,我的解决方案(在ansible 2.9中)要简单得多

---
- name: test date math playbook
  hosts: localhost

  tasks: 
    - name: today
      debug:
        msg: "today is {{ '%Y-%m-%dT%H:%M:%S'|strftime(ansible_date_time.epoch) }}"

    - name: one year ago
      debug:
        msg: "one-year-ago-today is {{ '%Y-%m-%dT%H:%M:%S'|strftime( (ansible_date_time.epoch|int) - (60*60*24*365)) }}"

通过转换为整数,您可以进行日期数学内联运算(使用内置过滤器)

抱歉-我不想含糊其辞。我需要事实/变量返回当前时间(小时)加2小时或当前时间(分钟)加10分钟。我确实看过过滤器文档,但我没有看到任何可以实现这一点的东西。再次感谢请在这里看到我的答案:Hi Konstantin,非常感谢您的回复。。我想我快到了。。但是,我需要将其分为两个变量..+%Y-%m-%d,然后+%H:%m我确实尝试过,但失败了(我的Python技能不存在):>-debug:>msg:“当前时间+25分钟{{ansible_date_time.iso8601[:19]|>to_datetime(fmt)| add_time(minutes=25)}”>vars:>fmt:“%H:%m”“字段'args'的值无效,无法转换为dict”再次感谢您在此提供的帮助:)用于
to_datetime
筛选器的格式字符串应与参数字符串匹配。如果您只想要
%H:%M
,您应该从iso8610中删除该部分,如
ansible\u date\u time.iso8601[11:16]
–从11到16个字符。您好,再次感谢您的回复。。我快到了。。你能告诉我这是否只适用于ansible_date_time.iso8601吗?当我对ansible_date_time.date运行它时,它返回“2017-05-08 00:10:00”。不仅仅是日期,它还包括增加的分钟数。ansible_date_time.date返回1900-01-01和模糊的时间/结果。再次感谢您的帮助,请阅读文档以了解字符串如何转换为日期对象以及每个格式指令的含义。