2017-12-04 10 views
0

의 다른 목록에 있는지 확인Ansible - (? Ansible와) 사전의 목록에있는 항목이 사전의 목록의 목적은 사전의 또 다른 목록에 있는지 확인하는 방법 사전

당신은 시도 할 수 jinja filters selectattr - 사용하는 데 문제가있어서 간단하지만 못생긴 해결책으로 되돌아갔습니다 - filtered list을 만들고 필터링 된 속성 만 비교하십시오 (list-to-list). 나는 그것을 좋아하지 않지만 그것이 효과적이다. 다른 방법을 알고 있다면 알려주세요.

각본 : 결과가

ok: [prd-inner-mgmt202] => { 
    "changed": false, 
    "examined": 1, 
    "files": [       ### List of dictionary 
     { 

      "path": "/var/spool/cron/crontabs/root", 

     }, 
     { 

      "path": "/var/spool/cron/crontabs/another_file", 

     } 
    ], 
    "invocation": { 
     "module_args": { 
      "age": null, 
      "age_stamp": "mtime", 
      "contains": null, 
      "file_type": "file", 
      "follow": false, 
      "get_checksum": false, 
      "hidden": false, 
      "path": "/var/spool/cron/crontabs/", 
      "paths": [ 
       "/var/spool/cron/crontabs/" 
      ], 
      "patterns": [ 
       "*" 
      ], 
      "recurse": false, 
      "size": null, 
      "use_regex": false 
     }, 
     "module_name": "find" 
    }, 
    "matched": 1, 
    "msg": "" 
} 

는 문자열리스트를 생성 찾을 사전

crontabs: 
    - user: root 
    crontab_rules: | 
     11 1 * * * find /home/ansible/.ansible/tmp/ -atime +10 -delete 

- name: find existing system_crontabs #would generate a list of dict 
    find: 
    path: /var/spool/cron/crontabs/ 
    register: system_side_crontabs 
    become: True 

- name: create lists of system_cron_names and repo_cron_names 
    set_fact: 
    system_cron_names: "[]" 
    repo_cron_names: "[]" 

- name: build list of system_cron_names 
    set_fact: 
    system_cron_names: "{{ system_cron_names }} + [ '{{ item.path |basename }}' ]" 
    with_items: "{{ system_side_crontabs.files }}" 

- name: build lists of repo_cron_names 
    set_fact: 
    repo_cron_names: "{{ repo_cron_names }} + [ '{{ item.user }}' ]" 
    with_items: "{{ crontabs }}" 

- name: assert check if an object of system_crontab is defined in repo_crontab 
    assert: 
    that: "{{ [item] |intersect(repo_cron_names) | length }} == 1" 
    with_items: "{{ system_cron_names }}" 

hosts_vars/PRD-이너 mgmt202의 #A 목록 비교하기 쉬움

0 문자열

TASK [mid_crontab : build list of repo_cron_names] ***************************** 

ok: [prd-inner-mgmt202] => (item={u'crontab_rules': u'11 1 * * * find /home/ansible/.ansible/tmp/ -atime +10 -delete\n', u'user': u'root'}) => { 
    "ansible_facts": { 
     "repo_cron_names": [ 
      "root" 
     ] 
    }, 
    "changed": false, 
    "invocation": { 
     "module_args": { 
      "repo_cron_names": [ 
       "root", 
     "other" 
      ] 
     }, 
     "module_name": "set_fact" 
    }, 
    "item": { 
     "crontab_rules": "11 1 * * * find /home/ansible/.ansible/tmp/ -atime +10 -delete\n", 
     "user": "root" 
    } 
} 

필요한 검사를 어설

의 또 다른 목록을 생성 intersect 신사 필터를 사용한다. 내 경우에는 시스템 정의 객체 (cron 레코드)가 내 저장소에 있어야합니다. 따라서 목록에는 요소가 하나 있어야합니다.

--- 
- hosts: localhost 
    gather_facts: no 
    vars: 
    crontabs: 
     - user: root 
     crontab_rules: xxx 
    tasks: 
    - find: 
     path: /tmp/test 
     register: myfiles 
    - assert: 
     that: sys_crons_violation | count == 0 
     msg: "This crons are not defined in repo : {{ sys_crons_violation | join(', ') }}" 
     vars: 
     sys_crons: "{{ myfiles.files | map(attribute='path') | map('basename') | list }}" 
     repo_crons: "{{ crontabs | map(attribute='user') | list }}" 
     sys_crons_violation: "{{ sys_crons | difference(repo_crons) }}" 

결과 :

TASK [find] ************************ 

TASK [assert] ********************** 
fatal: [localhost]: FAILED! => { 
    "assertion": "sys_crons_violation | count == 0", 
    "changed": false, 
    "evaluated_to": false, 
    "msg": "This crons are not defined in repo : another_file" 
} 
TASK [mid_crontab : assert check if system_crontab is defined in repo_crontab] * 

ok: [prd-inner-mgmt202] => (item=root) => { 
    "changed": false, 
    "invocation": { 
     "module_args": { 
      "that": "1 == 1" 
     }, 
     "module_name": "assert" 
    }, 
    "item": "root", 
    "msg": "All assertions passed" 
} 

답변

0

는 문자열 (이름)의 목록에 원래 DICT을 줄이고 차이를 비교하려는 것 같다