首页 > 解决方案 > 无法将 ansible fact 设置为整数

问题描述

我正在尝试提取主要发行版版本(其中 ansible_facts 保存为字符串)并将其存储为整数,以便以后 < 或 > 与整数进行比较。当我这样做时:

set_fact:
      distromajor: "{{ ansible_facts['distribution_major_version'] | int }}"

我发现 distromajor 持有“7”而不是 7。所以后来的比较失败了。事实上,我能让它工作的唯一方法就是像这样比较:

(distromajor|int >=6) and (distromajor|int <= 8)

这是预期的行为吗?为什么我不能将发行版主版本保存为 int?

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

标签: ansibleansible-facts

解决方案


问:这是预期的行为吗?

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


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

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

  • 映射(哈希/字典)
  • 序列(数组/列表)
  • 标量(字符串/数字)

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

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

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

  distromajor: '20'
  msg: AnsibleUnsafeText

推荐阅读