我在其中一个剧本中使用了ansible_date_time.hour
和ansible_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之后运行,那我就不走运了。
有没有人有建议或解决方法?
答案 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)) }}"
通过转换为整数,您可以内联日期数学(内置过滤器)