我有一个包含查询的 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"
这将循环遍历列表以获取许多相同的对象。
我认为你的第一个问题是……
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"
]
}