提问人:TSG 提问时间:9/9/2021 最后编辑:β.εηοιτ.βεTSG 更新时间:10/30/2023 访问量:2316
无法将 Ansible 事实设置为整数
Can't set Ansible fact as integer
问:
我正在尝试提取主要发行版版本(以字符串形式保存)并将其存储为整数以供以后使用或与整数进行比较。当我这样做时:ansible_facts
<
>
- set_fact:
distromajor: "{{ ansible_facts['distribution_major_version'] | int }}"
我找到保留而不是.
所以后来的比较失败了。事实上,我能让它工作的唯一方法是像这样比较:distromajor
"7"
7
(distromajor|int >=6) and (distromajor|int <= 8)
这是预期的行为吗?
为什么我不能将发行版主要版本保存为 int?
最接近的 SO 问题无法解释为什么在比较时如果不将变量重新转换为整数,则后面的整数比较会失败。distromajor
答:
8赞
Vladimir Botka
9/9/2021
#1
问:“这是预期行为吗?
答:是的。这是 Ansible 中的预期行为。
Q: “为什么我不能将发行版主要版本保存为 int?”
答:Ansible 认为你不能(待办事项:需要引用源代码)。在 YAML 中,有三个基本基元:
- 映射(哈希/字典)
- 序列(数组/列表)
- 标量(字符串/数字)
如您所见,标量既是字符串又是数字。但是,出于某种我不知道的原因,Ansible 决定任何表达式只能返回字符串或布尔值。例如"{{ scalar }}"
- set_fact:
distromajor: "{{ ansible_facts['distribution_major_version']|int }}"
- debug:
var: distromajor
- debug:
msg: "{{ distromajor|type_debug }}"
尽管显式转换为整数,但仍给出一个字符串,正如您已经发现的那样
distromajor: '20'
msg: AnsibleUnsafeText
更新。
如果要将变量保留为整数,请将其放入字典中。例如
my_dict_yaml: |
distromajor: {{ ansible_distribution_major_version }}
my_dict: "{{ my_dict_yaml|from_yaml }}"
给
my_dict:
distromajor: 20
my_dict.distromajor|type_debug: int
用于测试的完整 playbook 示例
- hosts: localhost
vars:
my_dict_yaml: |
distromajor: {{ ansible_distribution_major_version }}
my_dict: "{{ my_dict_yaml|from_yaml }}"
tasks:
- setup:
gather_subset: distribution_major_version
- debug:
var: ansible_distribution_major_version
- debug:
var: ansible_distribution_major_version|type_debug
- debug:
var: my_dict
- debug:
var: my_dict.distromajor|type_debug
评论