将Ansible变量从Unicode转换为ASCII

时间:2014-01-28 18:17:37

标签: unicode ansible

我在远程系统上获取命令的输出并将其存储在变量中。然后用它来填写放置在系统上的文件模板。

- name: Retrieve Initiator Name
  command: /usr/sbin/iscsi-iname
  register: iscsiname

- name: Setup InitiatorName File
  template: src=initiatorname.iscsi.template dest=/etc/iscsi/initiatorname.iscsi

initiatorname.iscsi.template文件包含:

InitiatorName={{ iscsiname.stdout_lines }}

然而,当我运行它时,我得到一个包含以下内容的文件:

InitiatorName=[u'iqn.2005-03.org.open-iscsi:2bb08ec8f94']

我想要的是什么:

InitiatorName=iqn.2005-03.org.open-iscsi:2bb08ec8f94

我做错了什么?

我意识到我可以使用“echo”InitiatorName = $(/ usr / sbin / iscsi-iname)“> /etc/iscsi/initiatorname.iscsi”将其写入文件,但这似乎是不可思议的这样做的方式。

提前致谢。

2 个答案:

答案 0 :(得分:6)

使用过滤器来避免使用unicode字符串:

InitiatorName = {{ iscsiname.stdout_lines | to_yaml }}

Ansible Playbook Filters

答案 1 :(得分:0)

要避免PyYAML的80个符号限制,只需使用to_json过滤器即可:

InitiatorName = {{ iscsiname.stdout_lines | to_yaml }}

对于我来说,我想从逗号分隔的列表中创建一个python数组。因此a,b,c应该成为["a", "b", "c"]。但是没有'u'前缀,因为我需要WebSpher进行字符串比较(不带特殊字符)。由于它们似乎没有相同的编码,因此比较失败。因此,我不能简单地使用var.split(',')

由于字符串不包含特殊字符,因此我仅将to_jsonmap(trim)结合使用。这解决了a, b会变成"a", " b"的问题。

restartApps = {{ apps.split(',') | map('trim') | list | to_json }}

由于JSON也知道数组,因此得到的结果与python产生的结果相同,但是没有u前缀。