Как добавить фильтрацию в словарь - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь запросить список из словаря, который заканчивается цифрой 1.

Это то, что я пытаюсь, но я получаю пустой список в качестве вывода.

    - name: Get list of sid that are open in READ WRITE mode
      set_fact:
        sid_output: "{{ om.results | selectattr(\"sid\", \"match\", \"1$\") | map(attribute='sid') | list}}"

Вот вывод из моего словаря:

{
   'msg':u'All items completed',
   'changed':True,
   'results':[  
      {  
         '_ansible_parsed':True,
         'stderr_lines':[  

         ],
         u'cmd':u'echo \"set pagesize 0\\nselect trim(open_mode) from v\\\\$database;\" | /u01/app/oracle/product/11.2.0/dbinst_1/bin/sqlplus -S / as sysdba',
         u'end':         u'2019-05-15 12:04:30.478084         ', '         _ansible_no_log':False,
         u'stdout':u'READ WRITE',
         '_ansible_item_result':True,
         u'changed':True,
         u'sid':u'dw1',
         'failed':False,
         u'delta':         u'0:00:00.073102         ', u'         stderr':u'',
         u'rc':0,
         u'invocation':{  
            u'module_args':{  
               u'creates':None,
               u'executable':None,
               u'_uses_shell':True,
               u'_raw_params':u'echo \"set pagesize 0\\nselect trim(open_mode) from v\\\\$database;\" | /u01/app/oracle/product/11.2.0/dbinst_1/bin/sqlplus -S / as sysdba',
               u'removes':None,
               u'argv':None,
               u'warn':True,
               u'chdir':None,
               u'stdin':None
            }
         },
         'stdout_lines':[  
            u'READ WRITE'
         ],
         u'start':         u'2019-05-15 12:04:30.404982         ', '         _ansible_ignore_errors':None,
         '_ansible_item_label':u'dw1'
      }
   ]
}

1 Ответ

0 голосов
/ 16 мая 2019

Ваша проблема - использование теста match.Из документации по поиску и совпадению :

для "совпадения" требуется полное совпадение в строке, в то время как для "поиска" требуется совпадение только с подмножеством строки.

Другими словами, если вы пытаетесь проверить, используя some_match is match('foo.*bar'), это означает, что строка должна начинаться с foo и заканчиваться bar.Если вы тестируете some_mastch is match('bar$'), то вы ищете строки, которые в точности равны bar.

Поскольку вы используете:

selectattr(\"sid\", \"match\", \"1$\")

Это означает, что он будет соответствовать только строкам, которые в точности равны 1.Вы хотите использовать search вместо этого.И пока вы это делаете, избавьтесь от всех этих избежавших двойных кавычек:

- set_fact:
    sid_output: "{{ om.results | selectattr('sid', 'search', '1$') | map(attribute='sid') | list}}"

С вашими примерами это установит sid_output в dw1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...