无法将ansible fact设置为整数

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?

最接近的 没有解释为什么在比较时没有将 distromajor 变量重新转换为 int 的情况下后来的整数比较失败。

问:"这是预期的行为吗?"

答:是的。这是 Ansible 中的预期行为。


问:"为什么我不能将发行版主版本保存为 int?"

A:Ansible 决定你不能(待办事项:需要参考源代码)。在YAML中,共有三个基本原语:

  • 映射 (hashes/dictionaries)
  • 序列 (arrays/lists)
  • 标量 (strings/numbers)

如您所见,标量既是字符串又是数字。但是,出于某种我不知道的原因,Ansible 决定任何 "{{ scalar }}" 表达式只能 return stringboolean。例如

    - set_fact:
        distromajor: "{{ ansible_facts['distribution_major_version']|int }}"
    - debug:
        var: distromajor
    - debug:
        msg: "{{ distromajor|type_debug }}"

给出一个字符串,尽管显式转换为整数,正如您已经发现的那样

  distromajor: '20'
  msg: AnsibleUnsafeText