在Ansible 2.9中,有没有办法将十进制字符串转换为十六进制字符串?

在Ansible 2.9中,有没有办法将十进制字符串转换为十六进制字符串?,ansible,jinja2,Ansible,Jinja2,我有一个playbook,可以查询服务器的SystemID,该id可以使用供应商提供的将id映射到模型的表转换为型号。服务器返回十进制值,但表使用十六进制等效值 我要做的是将十进制字符串转换为十六进制字符串,该字符串可以与供应商提供的表中的条目匹配 例如: Server returns: SystemID = 1792 Matching entry in vendor table: 0x0700 我在Ansible文档和Web中搜索了本地Ansible命令或jinja2表达式来进行转换 我只找

我有一个playbook,可以查询服务器的SystemID,该id可以使用供应商提供的将id映射到模型的表转换为型号。服务器返回十进制值,但表使用十六进制等效值

我要做的是将十进制字符串转换为十六进制字符串,该字符串可以与供应商提供的表中的条目匹配

例如:

Server returns: SystemID = 1792
Matching entry in vendor table: 0x0700
我在Ansible文档和Web中搜索了本地Ansible命令或jinja2表达式来进行转换

我只找到了int(value,base=x)jinja2函数,它的作用与我尝试的相反

本机python hex()命令可以实现这一点。但如果可能的话,我希望避免这种情况

以下是playbook任务,它解析服务器stdout以获取systemid值:

 set_fact:
    server_model: "{{ ( server_model_results.stdout_lines | select('match','SystemID' ) | list| first ).split('=')[1] | regex_replace('^\ |\ /$', '' )  }}"
环境: 表2.9.7 Python 3.8.0 macOS 10.15.4

您可以在jinja2模板字符串中使用带
%
运算符的:

$ ansible localhost -m debug -a msg="{{ '%#x' % 1792 }}"
localhost | SUCCESS => {
    "msg": "0x700"
}
您可能仍然需要处理文件中出现的前导0(即
0x0700

如果文件中的所有值都被填充到4个六位数(即
0x
前缀之后),则快速而肮脏的解决方案可能是:

$ ansible localhost -m debug -a msg="0x{{ '%04x' % 1792 }}"
localhost | SUCCESS => {
    "msg": "0x0700"
}
否则,您将不得不自己对下一个奇数个字符执行某种动态0填充

如果供应商表中九位以上的六位数为大写,则可能需要将“x”类型说明符切换为“x”(请参见上面的文档链接)

$ ansible localhost -m debug -a msg="0x{{ '%04x' % 2569 }}"
localhost | SUCCESS => {
    "msg": "0x0a09"
}
$ ansible localhost -m debug -a msg="0x{{ '%04X' % 2569 }}"
localhost | SUCCESS => {
    "msg": "0x0A09"
}