在Ansible 2.9中是否可以将十进制字符串转换为十六进制字符串?

时间:2020-04-28 21:27:07

标签: ansible jinja2

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

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

示例:

Server returns: SystemID = 1792
Matching entry in vendor table: 0x0700

我已经在Ansible文档中进行搜索,并且在Web上搜索了本机Ansible命令或jinja2表达式来进行转换。

我只发现了int(value,base = x)jinja2函数,它与我尝试做的相反。

原生python hex()命令可以做到。但我想避免这种情况。

这是解析服务器stdout以获得systemid值的剧本任务:

 set_fact:
    server_model: "{{ ( server_model_results.stdout_lines | select('match','SystemID' ) | list| first ).split('=')[1] | regex_replace('^\ |\ /$', '' )  }}"

环境: Ansible 2.9.7 的Python 3.8.0 macOS 10.15.4

1 个答案:

答案 0 :(得分:0)

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

$ 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"
}

否则,您将不得不自己对下一个奇数个char实施某种动态0填充。

如果您的供应商表中的9位数以上的大写字母,您可能希望将'x'类型说明符切换为'X'(请参见上面的doc链接)

$ 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"
}