我一直在疯狂地环顾四周,以找到解决方案,但是到目前为止,我一直没有成功:计算库存变量和Ansible事实之间的天数。
当我手动设置两个变量时,我都没问题,两个变量都被识别为一个日期,我可以像这样从那里开始工作:(这是预期的输出)
在2个手动设置的变量之间工作的任务:
---
- hosts: localhost
vars:
prev_date: 2020-12-01
cur_date: 2020-12-31
tasks:
- name: prev_date debug
debug:
msg:
- "prev_date: {{ prev_date }}"
- "prev_date type: {{ prev_date | type_debug }}"
- name: cur_date debug
debug:
msg:
- "cur_date: {{ cur_date }}"
- "cur_date type: {{ cur_date | type_debug }}"
# This is the output I want to get but I want cur_date from a dynamic source (fact or shell through register)
- name: Calculate number of days between prev_date and cur_date (intended result)
debug:
msg: "Number of days = {{ (cur_date - prev_date).days }}"
工作输出:
TASK [prev_date debug] *************************************************************************************************************************************************
Thursday 31 December 2020 12:55:28 +0100 (0:00:00.227) 0:00:00.227 *****
ok: [localhost] => {
"msg": [
"prev_date: 2020-12-01",
"prev_date type: date"
]
}
TASK [cur_date debug] **************************************************************************************************************************************************
Thursday 31 December 2020 12:55:29 +0100 (0:00:00.249) 0:00:00.476 *****
ok: [localhost] => {
"msg": [
"cur_date: 2020-12-31",
"cur_date type: date"
]
}
TASK [Calculate number of days between prev_date and cur_date (intended result)] ***************************************************************************************
Thursday 31 December 2020 12:55:29 +0100 (0:00:00.144) 0:00:00.621 *****
ok: [localhost] => {
"msg": "Number of days = 30"
}
现在,ansible_date_time.date
由于变量类型,我想使用ansible事实在每次运行()时动态获取当前日期
重现错误的任务样本
- name: Value and type of ansible_date_time.date
debug:
msg:
- "ansible_date_time.date: {{ ansible_date_time.date }}"
- "ansible_date_time.date type: {{ ansible_date_time.date | type_debug }}"
# Failing due to conditional not working with attribute not being date on ansible_date_time.date
- name: Calculate number of days between ansible_date_time.date
debug:
msg:
- "Number of days = {{ (ansible_date_time.date - prev_date).days }}"
我得到以下输出和错误:
TASK [New source ansible fact date] ************************************************************************************************************************************
Thursday 31 December 2020 13:06:41 +0100 (0:00:00.143) 0:00:00.741 *****
ok: [localhost] => {
"msg": [
"ansible_date_time.date: 2020-12-31",
"ansible_date_time.date type: AnsibleUnsafeText"
]
}
TASK [Calculate number of days between ansible_date_time.date] *********************************************************************************************************
Thursday 31 December 2020 13:06:41 +0100 (0:00:00.150) 0:00:00.892 *****
fatal: [localhost]: FAILED! => {"msg": "Unexpected templating type error occurred on (Number of days = {{ (ansible_date_time.date - prev_date).days }}): unsupported operand type(s) for -: 'AnsibleUnsafeText' and 'datetime.date'"}
我试图找到一种方法来创建新变量,ansible_date_time.date
但是datetime.date
即使有可能,我也无法将其转换为。
ansible_date_time.date
是一个字符串,因此您必须将其转换为adate
或a datetime
。
令人惊讶的是,Ansible没有任何方法可以立即将字符串转换为a date
,但是您可以datetime
使用to_datetime
filter将其转换为a 。
然后,由于prev_date
包含adate
而不是a datetime
,您可以通过Python的功能将datetime
刚创建的a转换为a 。date
date()
datetime
因此,剧本将是:
- hosts: all
tasks:
- debug:
msg: "{{ ((ansible_date_time.date | to_datetime('%Y-%m-%d')).date() - prev_date).days }}"
vars:
prev_date: 2020-12-01
这将给:
PLAY [all] *******************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************
ok: [localhost]
TASK [debug] *****************************************************************************************************
ok: [localhost] => {
"msg": "30"
}
PLAY RECAP *******************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句