通过set_fact分配的一些浮点数将转换为字符串

问题描述 投票:0回答:1

我在这里迷路了。使用ansible-2.9.9-1.fc30.noarch,我不理解为什么Ansible将此somedata.aaa转换为字符串:

- hosts: localhost
  remote_user: root
  gather_facts: no
  vars:
    aaa:
      - 1.111
      - 2.222
      - 3.333
    bbb: 4.444
  roles:
  tasks:
    - set_fact:
        somedata:
          aaa: "{{ aaa | max | float }}"
          bbb: "{{ bbb }}"
    - debug:
        msg: "orig: {{ aaa | max | type_debug }}   aaa: {{ somedata.aaa | type_debug }}   bbb: {{ somedata.bbb | type_debug }}"
    - debug:
        var: somedata
    - debug:
         msg: "{{ somedata | to_nice_json }}"

这是输出:

TASK [debug] ******************************************************************
Monday 08 June 2020  17:06:32 +0200 (0:00:00.350)       0:00:00.376 *********** 
ok: [localhost] => {
    "msg": "orig: float   aaa: str   bbb: float"
}

TASK [debug] ******************************************************************
Monday 08 June 2020  17:06:33 +0200 (0:00:00.332)       0:00:00.708 *********** 
ok: [localhost] => {
    "somedata": {
        "aaa": "3.333",
        "bbb": 4.444
    }
}

TASK [debug] ******************************************************************
Monday 08 June 2020  17:06:33 +0200 (0:00:00.318)       0:00:01.027 *********** 
ok: [localhost] => {
    "msg": "{\n    \"aaa\": \"3.333\",\n    \"bbb\": 4.444\n}"
}

为什么是somedata.aaa string而不是float?如何制作float

ansible ansible-2.x
1个回答
0
投票

max和float是jinja操作,默认情况下jinja将始终返回字符串。请注意,float正在内部转换数字,jinja然后将其放入字符串中。

如果将3.333更改为3,则可以看到此:

aaa:
  - 1.111
  - 2.222
  - 3

使用您的代码,浮点数将其转换为3.0-浮点值:

"somedata": {
        "aaa": "3.0",
        "bbb": 4.444
}

您可以通过将jinja2_native = True添加到ansible.cfg的默认部分来强制jinja始终返回本机类型。

TASK [debug] ************************************************
ok: [localhost] => {
    "somedata": {
        "aaa": 3.0,
        "bbb": 4.444
    }
}

TASK [debug] ************************************************
    "msg": "{\n    \"aaa\": 3.0,\n    \"bbb\": 4.444\n}"
}

请记住,这可能会对代码的其他部分产生影响。

© www.soinside.com 2019 - 2024. All rights reserved.