【问题标题】:Subtract date from Jinja expression从 Jinja 表达式中减去日期
【发布时间】:2020-01-14 14:22:46
【问题描述】:

我想在 Ansible 任务中从 current_date_operation 中删除 1 个月。这是我尝试过的:

vars:
  # for example current
  current_date_operation: "{{ ansible_date_time.date }}" 
  previous_date_operation : "{{ '%Y-%m-%d'|strftime(current_date_operation.epoch|int - 2592000) }}"

不幸的是,上面的代码给出了以下错误:

"msg": "任务包含一个带有未定义变量的选项。错误是:'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'epoch'

有什么想法吗?

谢谢

【问题讨论】:

  • 去掉一个月是什么意思?你的意思是如果日期是 14/01/2020,你需要它作为 14/12/2019?还是从当前日期减去 30 天?
  • 欢迎来到 SO @jumpman。 it's not working 永远不能准确描述您的问题。请编辑您的问题,显示您当前任务的结果或错误,并描述预期的行为。花一些时间通过阅读网站的帮助部分来习惯该网站及其工作方式。一个好的入口点是How to ask
  • 是的,我只想从 current_date_operation 中减去 1 个月 请在“msg”下面找到错误:“任务包含一个带有未定义变量的选项。错误是:'ansible.utils.unsafe_proxy。 AnsibleUnsafeText 对象'没有属性'epoch'

标签: date ansible jinja2 subtraction


【解决方案1】:

在您的vars 声明中,您首先从对象ansible_date_time 获取date 键。

在下一行,您正在使用该 set 变量(它是一个字符串)并在其上调用不存在的键 epoch,因为它是父对象的属性(即 ansible_date_time)。由于您的 var 声明无法正确解析,因此 var 本身是未定义的。

以下剧本展示了您可以通过修复 vars 定义来获得预期结果:

---
- hosts: localhost
 
  vars:
    current_date_operation: "{{ ansible_date_time.date }}"
    previous_date_operation : "{{ '%Y-%m-%d' | strftime(ansible_date_time.epoch | int - 2592000) }}"
 
  tasks:
    - debug:
        var: current_date_operation
    - debug:
        var: previous_date_operation

试运行:

$ ansible-playbook playbook.yml 

PLAY [localhost] **************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ******************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "current_date_operation": "2020-01-14"
}

TASK [debug] ******************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "previous_date_operation": "2019-12-15"
}

PLAY RECAP ********************************************************************************************************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

【讨论】:

  • 非常感谢您的回答,但如果您想从 ansible 计算 previous_date_operation。我们之前需要将字符串转换为日期吗?如果是怎么办?
  • 我根据您在 ansible 中的要求计算了上述 POC 中的日期,没有进行任何转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2017-01-26
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
相关资源
最近更新 更多