我有一本剧本,向服务器查询服务器的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
答案 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"
}