Ansible中如何拼接含AnsibleUnsafeText类型的变量以扩展卷组
Ansible扩展卷组:类型错误问题及解决
问题1:为什么new_pvs是AnsibleUnsafeText类型?
new_pvs是通过字符串拼接的模板表达式生成的("/dev/{{ disk }}{{ next_number }}"),Ansible会将这类直接拼接的模板文本标记为AnsibleUnsafeText类型。这个设计是为了避免自动转义可能包含特殊字符的内容,同时明确该文本是未经安全处理的原始模板输出。
问题2:如何将rootvg_pvs和new_pvs拼接为单个列表?
union过滤器要求两边都是列表类型,而new_pvs是单个文本对象,所以需要把它转换成列表再进行拼接,以下是两种实用方法:
方法1:使用union时临时包装成列表
直接修改表达式,把单个文本放进列表后再做合并,后续传给lvg模块时也用同样写法:
- debug: msg:|- current_pvs: {{ rootvg_pvs | union([new_pvs]) }} - name: 扩展rootvg卷组 lvg: vg: rootvg pvs: "{{ rootvg_pvs | union([new_pvs]) }}"
方法2:直接将new_pvs定义为列表类型
修改vars里的new_pvs定义,从一开始就把它做成列表:
new_pvs: ["/dev/{{ disk }}{{ next_number }}"]
之后直接用union拼接即可:
- debug: msg:|- current_pvs: {{ rootvg_pvs | union(new_pvs) }}
补充:用+运算符拼接(无自动去重)
如果能确认新分区不会和现有PV重复,也可以直接用列表加法:
current_pvs: {{ rootvg_pvs + [new_pvs] }}
内容的提问来源于stack exchange,提问作者danidar
相关产品推荐
相关产品推荐

