如何让Ansible vars_prompt将yes/no输入转换为布尔值?
如何在Ansible的vars_prompt中将yes/no输入转换为布尔值?
这个问题的核心原因是YAML解析和vars_prompt输入处理的差异:在vars块里定义的yes/no会被YAML自动解析为布尔值,但vars_prompt的输入默认会被当作字符串处理——而Ansible的when条件会把任何非空字符串都判定为True,哪怕内容是"no",这就导致你的第三个任务逻辑不符合预期。
这里有两种简单的解决方法:
方法一:给vars_prompt指定type: bool
这是最直接的方式,Ansible会自动将用户输入的yes/no/true/false(包括大小写变体,比如YES/No)转换成对应的布尔值,和vars块里的解析效果完全一致:
--- - name: variable tests hosts: local gather_facts: false vars: answer1: yes vars_prompt: - name: "answer2" prompt: "Reply true" private: no type: bool # 启用布尔类型解析 - name: "answer3" prompt: "Reply yes" private: no type: bool # 启用布尔类型解析 tasks: - debug: msg="answer1 is true" when: answer1 - debug: msg="answer2 is true" when: answer2 - debug: msg="answer3 is true" when: answer3
方法二:用bool过滤器手动转换变量
如果因为某些场景不能直接指定type: bool,可以通过set_fact任务或者在when条件中直接使用bool过滤器来转换字符串为布尔值:
--- - name: variable tests hosts: local gather_facts: false vars: answer1: yes vars_prompt: - name: "answer2" prompt: "Reply true" private: no - name: "answer3" prompt: "Reply yes" private: no tasks: # 提前将answer3转换为布尔值 - set_fact: answer3: "{{ answer3 | bool }}" - debug: msg="answer1 is true" when: answer1 - debug: msg="answer2 is true" when: answer2 | bool # 直接在条件中使用过滤器 - debug: msg="answer3 is true" when: answer3
bool过滤器会智能识别常见的布尔字符串:"yes"/"true"/"1"会被转为True,"no"/"false"/"0"会被转为False,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Bernard
相关产品推荐
相关产品推荐

