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

时间:2017-05-03 20:53:03

标签: 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 }}"

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

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

2 个答案:

答案 0 :(得分:3)

AFAIK,无法在Ansible中添加/减去开箱即用的时间单位。

您可以使用datetime过滤器(Ansible 2.2+)将字符串转换为to_datetime对象 您可以计算日期差异。请参阅this回答。

但如果您不介意使用简单的过滤插件,请转到:

将此代码作为./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
        }

您可以按照以下方式使用自己的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_time与Python中的timedelta具有相同的参数。

答案 1 :(得分:0)

我只是在搜索中遇到了这个问题,对我来说(在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)) }}"

通过转换为整数,您可以内联日期数学(内置过滤器)