Невозможно сравнить атрибут с числом. Ошибка: «не поддерживается между экземплярами AnsibleUnsafeText и int» - PullRequest
2 голосов
/ 19 марта 2020
- getent:
    database: passwd
- debug: 
    var: getent_passwd | dict2items | selectattr('value.1', '>=', 1000) | map(attribute='key') | list

И вывод

TASK [debug] ******************************************************************************************************
fatal: [localhost]: FAILED! => {"msg": "Unexpected templating type error occurred on 
({{getent_passwd | dict2items | selectattr('value.1', '>=', 1000) | map(attribute='key') | list}}): 
'>=' not supported between instances of 'AnsibleUnsafeText' and 'int'"}

Как я могу изменить 'value.1' на целое число?

1 Ответ

1 голос
/ 19 марта 2020

Q: "Как я могу изменить 'value.1' на целое число?"

A: Можно использовать json_query function to_number . Например,

    - debug:
        var: getent_passwd|
             dict2items|
             json_query('[?to_number(value[1]) >= `1000`].key')

Q: «Как изменить значение 1000 на переменную?»

A: Подстановка должна быть преобразован в число тоже. Хорошая идея объявить query отдельно. Например,

    - set_fact:
        myusers: "{{ getent_passwd|dict2items|json_query(query) }}"
      vars:
        myuid: 1000
        query: "[?to_number(value[1]) >= to_number('{{ myuid }}')].key"

Q: "Как добавить больше условий в функцию json_query? Как selectattr('value.5', 'ne', '/sbin/nologin')."

A: Можно использовать pipe или и выражение . Например,

    - getent:
        database: passwd
    - set_fact:
        myusers: "{{ getent_passwd|dict2items|json_query(query) }}"
      vars:
        myuid: 1000
        myshell: /usr/sbin/nologin
        query: "[?to_number(value[1]) >= to_number('{{ myuid }}')] |
                [?value[5] == '{{ myshell }}'].{user: key, uid: value[1], shell: value[5]}"
    - debug:
        var: myusers

дать

    "myusers": [
        {
            "user": "libvirt-qemu", 
            "shell": "/usr/sbin/nologin", 
            "uid": "64055"
        }, 
        {
            "user": "nobody", 
            "shell": "/usr/sbin/nologin", 
            "uid": "65534"
        }
    ]

Установить переменные и оператор сравнения для ваших нужд.

Возможно, труба в json_query считается анти-паттерном. Поэтому вместо канала следует использовать и выражение . Например

  query: "[?(to_number(value[1]) >= to_number('{{ myuid }}')) &&
            (value[5] == '{{ myshell }}')].{user: key, uid: value[1], shell: value[5]}"
...