无法将 Ansible 事实设置为整数

Can't set Ansible fact as integer

提问人:TSG 提问时间:9/9/2021 最后编辑:β.εηοιτ.βεTSG 更新时间:10/30/2023 访问量:2316

问:

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

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

我找到保留而不是.
所以后来的比较失败了。事实上,我能让它工作的唯一方法是像这样比较:
distromajor"7"7

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

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

最接近的 SO 问题无法解释为什么在比较时如果不将变量重新转换为整数,则后面的整数比较会失败distromajor

Ansible -事实

评论

0赞 P.... 9/9/2021
这回答了你的问题吗?Ansible:如何在模块中对整数变量进行算术运算set_fact?
0赞 TSG 9/9/2021
不。我之前看到过,但它并没有解释为什么后来的比较会失败,除非我在比较时再次转换为 int

答:

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