如何将AnsibleUnsafeText转换为字符串

76次阅读
没有评论

问题描述

在使用ansible的shell模块比较两个SSL证书的链时遇到了问题。他使用openssl命令获取了两个证书的链,并将输出注册到变量chain_from_certificate1和chain_from_certificate2中。然后他使用fail模块比较了这两个变量的标准输出。然而,ansible告诉他这两个链不相似,而实际上它们是相同的。用户怀疑问题出在比较运算符上,因为变量的类型是”AnsibleUnsafeText”而不是字符串。他想知道如何比较两个AnsibleUnsafeText变量,并且在比较之前是否需要将它们转换为字符串。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

我认为这是由于变量属性不存在导致的。很可能chain_from_certificate1和chain_from_certificate2没有stdout属性。你尝试通过打印变量来进行调试了吗?使用stdout属性打印变量,是否会出现类似的错误?

- name: 打印变量
  debug:
    msg: "{{ chain_from_certificate1.stdout }}"

没有stdout属性的情况下,这个命令的输出是什么?它是否与手动执行openssl x509 -issuer -noout -in Certiticate1的输出相同?

- name: 打印变量
  debug:
    msg: "{{ chain_from_certificate1 }}"

我的假设是脚本将stdout的值设置为chain_from_certificate1和chain_from_certificate2,而不是stdout: 。因此,stdout属性不存在。或者chain_from_certificate1和chain_from_certificate2包含另一种数据结构。关键是将它们打印出来,以便进一步调试。

方案2

如果方案1无法解决问题,你可以尝试将AnsibleUnsafeText转换为字符串进行比较。你可以使用Ansible的过滤器来实现这一点。以下是一个示例:

- name: 比较两个AnsibleUnsafeText
  fail:
    msg: "错误,链不相似"
  when: chain_from_certificate1 | string != chain_from_certificate2 | string

在上面的示例中,我们使用了Ansible的过滤器string将chain_from_certificate1和chain_from_certificate2转换为字符串进行比较。如果它们不相等,就会触发fail模块并输出错误消息。
请注意,使用过滤器将AnsibleUnsafeText转换为字符串可能会导致数据丢失或格式变化。因此,在进行比较之前,请确保你了解这种转换可能带来的影响。

总结

在使用ansible比较AnsibleUnsafeText变量时,你可以尝试打印变量进行调试,或者将其转换为字符串进行比较。请根据具体情况选择合适的解决方案。

正文完