Ansible — отрицательный фильтрующий вопрос

Вот пример Sed, который работает с переменной:

q=242M
sed 's/.$/ &/' <<eof
$q
eof
1
27.01.2020, 15:14
1 ответ

Использовать фильтр разница . Например

    - set_fact:
        users_all: "{{ users|json_query('[].name') }}"
    - set_fact:
        dirs_forbidden: "{{ dirs_forbidden|default([]) + [
          {(item.keys()|list|first):
           (users_all|difference(item.values()|list|first))}] }}"
      loop: "{{ dirs_allowed }}"
    - debug:
        var: dirs_forbidden

дать

    "dirs_forbidden": [
        {
            "dir1": [
                "user3"
            ]
        }, 
        {
            "dir2": [
                "user2", 
                "user3"
            ]
        }, 
        {
            "dir3": [
                "user1", 
                "user3"
            ]
        }
    ]

ПОЗВ. Работа со словарями в этом случае упрощает код. Например

    - set_fact:
        users_all: "{{ users|json_query('[].name') }}"
    - set_fact:
        dirs_all: "{{ users|
                       json_query('[].dirs')|flatten|unique }}"
    - set_fact:
        dirs_allowed: "{{ dirs_allowed|default({})|
                          combine({item: users|json_query(query)}) }}"
      vars:
        query: "[?dirs.contains(@, '{{ item }}')].name"
      loop: "{{ dirs_all }}"
    - debug:
        var: dirs_allowed
    - set_fact:
        dirs_forbidden: "{{ dirs_forbidden|default({})|
                            combine({item: (users_all|difference(dirs_allowed[item]))}) }}"
      loop: "{{ dirs_all }}"
    - debug:
        var: dirs_forbidden

дать

    "dirs_allowed": {
        "dir1": [
            "user1", 
            "user2"
        ], 
        "dir2": [
            "user1"
        ], 
        "dir3": [
            "user2"
        ]
    }
    "dirs_forbidden": {
        "dir1": [
            "user3"
        ], 
        "dir2": [
            "user2", 
            "user3"
        ], 
        "dir3": [
            "user1", 
            "user3"
        ]
    }
0
27.01.2020, 23:55

Теги

Похожие вопросы