如何移除Ansible变量的最后一个字符?遇切片报错问题
Ansible变量截取最后一个字符报错问题
我尝试移除输出的最后一个字符时遇到问题:
首先,通过以下playbook获取根分区设备路径并注册变量:
- debug: msg: "{{ ansible_mounts|json_query('[?mount == `/`].device') }}" register: rootpart
针对普通字符串的截取写法是有效的:
- debug: msg: "{{ '/dev/sda4'[:-1] }}"
但直接对注册的变量rootpart使用同样的截取语法时失败:
- debug: msg: "{{ rootpart[:-1] }}"
报错信息:
msg: 模板处理时发生意外类型错误 ({{ rootpart[:-1] }}): unhashable type: 'slice'
解决方法
问题出在rootpart是Ansible注册后的结果对象,不是直接的字符串值:
- 注册变量后,
debug模块的输出内容存在于rootpart.msg中 json_query返回的是一个列表(比如["/dev/sda4"]),而非单个字符串
正确的写法需要先提取列表中的字符串,再做截取:
- debug: msg: "{{ rootpart.msg[0][:-1] }}"
更严谨的写法(避免列表为空时报错):
- debug: msg: "{{ rootpart.msg | first | default('') | regex_replace('.$', '') }}"
说明:
rootpart.msg:获取debug模块输出的列表结果[0]/first:提取列表中的第一个元素(根分区唯一)[:-1]:截取字符串去掉最后一个字符regex_replace('.$', ''):通过正则替换移除最后一个字符,兼容性更强
内容的提问来源于stack exchange,提问作者Bursuc Sergiu
相关产品推荐
相关产品推荐

