如何从字符串中提取日期时间值然后相加

问题描述 投票:0回答:1

我有一个包含查询的 URL,其中一个查询键/值是日期时间,另一个键/值是到期前的秒数。我想提取这些值并将它们加在一起以获得到期日期时间。

这是字符串的示例:

s3_objects:
  - item: "path/to/file.txt"
    url: "https://my-bucket.s3.us-west-2.amazonaws.com/path/to/file.txt?X-Amz-Date=20240206T235117Z&X-Amz-Expires=600"

还有更多疑问我没有包含在这里。

我想获取

X-Amz-Date
值(
20240206T235117Z
)并添加
X-Amz-Expires
值(
600
秒)。这是我到目前为止所拥有的:

s3_object[0].url | urlsplit('query') | split('&') | regex_search('X-Amz-(Date|Expires)=[^&]+')

这应该给我一个清单:

[ "X-Amz-Date=20240206T235117Z", "X-Amz-Expires=600" ]

我不知道从这里该去哪里。要单独分割每个字符串,然后从日期时间字符串进行转换并添加秒数,然后转换回日期时间。

最终,我想返回一个如下所示的对象:

- file: "path/to/file.txt"
  created: "{{ '%m/%d/%Y %T' | strftime('20240206T235117Z') }}"
  expires: "{{ '%m/%d/%Y %T' | strftime('20240207T000117Z') }}"
  url: "https://my-bucket.s3.us-west-2.amazonaws.com/path/to/file.txt?X-Amz-Date=20240206T235117Z&X-Amz-Expires=600"

这将循环遍历列表以获取许多相同的对象。

ansible jinja2
1个回答
0
投票

我认为你的第一个问题是……

s3_object[0].url | urlsplit('query') | split('&') | regex_search('X-Amz-(Date|Expires)=[^&]+')

...不会给你一个清单。

regex_search
过滤器对strings进行操作,而
split('%')
的输出是一个list,所以从上面的表达式中得到的结果是一团糟(它是Python列表数据结构的字符串化版本)。

要获取列表,请使用

select
过滤器和
match
测试:

s3_object[0].url | urlsplit('query') | split('&') | select('match', 'X-Amz-(Date|Expires)=[^&]+')

但说实话,我认为如果你沿着这条路走下去,事情就会开始变得棘手。相反,将自定义过滤器放入

filter_plugins/filters.py
中,如下所示:

import datetime
from urllib.parse import urlparse, parse_qs


def extract_s3_times(url, fmt):
    parts = urlparse(url)
    query = parse_qs(parts.query)
    created_at = datetime.datetime.fromisoformat(query["X-Amz-Date"][0])
    lifetime = int(query["X-Amz-Expires"][0])
    expires_at = created_at + datetime.timedelta(seconds=lifetime)
    return {
        "created_at": created_at.strftime(fmt),
        "expires_at": expires_at.strftime(fmt),
        "lifetime": lifetime,
    }


class FilterModule:
    def filters(self):
        return {"extract_s3_times": extract_s3_times}

然后你可以写一个这样的剧本:

- hosts: localhost
  gather_facts: false
  vars:
    s3_objects:
      - item: "path/to/file.txt"
        url: "https://my-bucket.s3.us-west-2.amazonaws.com/path/to/file.txt?X-Amz-Date=20240206T235117Z&X-Amz-Expires=600"
  tasks:
    - debug:
        msg:
          - "file: {{ item.item }}"
          - "created: {{ s3_times.created_at }}"
          - "expires: {{ s3_times.expires_at }}"
          - "url: {{ item.url }}"
      vars:
        s3_times: >
          {{ item.url | extract_s3_times("%m/%d/%Y %T") }}
      loop: "{{ s3_objects }}"

这将产生如下输出:

TASK [debug] ********************************************************************************************************************************************************************************
ok: [localhost] => (item={'item': 'path/to/file.txt', 'url': 'https://my-bucket.s3.us-west-2.amazonaws.com/path/to/file.txt?X-Amz-Date=20240206T235117Z&X-Amz-Expires=600'}) => {
    "msg": [
        "file: path/to/file.txt",
        "created: 02/06/2024 23:51:17",
        "expires: 02/07/2024 00:01:17",
        "url: https://my-bucket.s3.us-west-2.amazonaws.com/path/to/file.txt?X-Amz-Date=20240206T235117Z&X-Amz-Expires=600"
    ]
}
© www.soinside.com 2019 - 2024. All rights reserved.