2017-11-17 3 views
-1

list은 실제로 dict의 키 목록입니다. 그리고이 list 키로 필터링 된 dict으로 연결된 문자열을 가져 와서 모듈 옵션에 사용하고 싶습니다.Ansible - 키 목록으로 사전을 필터링하십시오.

나의 사용 사례는 authorized_keys 파일을 생성하기 위해 공개 키의 이름 목록이있는 사용자입니다. 당신이 여기에서 볼 수 있듯이

1 --- 
2 - hosts: localhost 
3 become: false 
4 vars: 
5  pub_keys: 
6  key01: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ[…]5/ [email protected] 
7  key02: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ[…]ea [email protected] 
8  key03: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ[…]dN [email protected] 
9  users: 
10  root: 
11   home: /root 
12   shell: /bin/bash 
13   authorized_keys: 
14   - key01 
15  mgmtusr: 
16   home: /home/mgmtusr 
17   shell: /bin/bash 
18   authorized_keys: 
19   - key01 
20   - key02 
21   - key03 
22 
23 tasks: 
24  - name: Debug Authorized Keys 
25  debug: 
26   msg: "USER:{{ item.key }} AUTHKEYSLIST:{{ pub_keys|selectattr(item.authorized_keys) }}" 
27  with_dict: "{{ users }}" 
28 
29  - name: Manage users Authorized Keys 
30  authorized_key: 
31   user: "{{ item.key }}" 
32   key: "{{ pub_keys|selectattr(item.authorized_keys) }}" 
33   exclusive: yes 
34  with_dict: "{{ users }}" 
35 

, 나는 그것을 dict|selectattr(list)으로 시도해하지만 실패합니다.

디버그 모듈에 <generator object select_or_reject at 0x…>을 가져오고 물론 authorized_key 모듈에 invalid key specified을 얻는 것. 다른 시도처럼

 
TASK [Debug Authorized Keys] ************************************************************************************************************************************************************************************************************************************************** 
ok: [localhost] => (item={'key': u'mgmtusr', 'value': {u'home': u'/home/mgmtusr', u'shell': u'/bin/bash', u'authorized_keys': [u'key01', u'key02', u'key03']}}) => { 
    "item": { 
     "key": "mgmtusr", 
     "value": { 
      "authorized_keys": [ 
       "key01", 
       "key02", 
       "key03" 
      ], 
      "home": "/home/mgmtusr", 
      "shell": "/bin/bash" 
     } 
    }, 
    "msg": "USER:mgmtusr AUTHKEYSLIST:" 
} 
ok: [localhost] => (item={'key': u'root', 'value': {u'home': u'/root', u'shell': u'/bin/bash', u'authorized_keys': [u'key01']}}) => { 
    "item": { 
     "key": "root", 
     "value": { 
      "authorized_keys": [ 
       "key01" 
      ], 
      "home": "/root", 
      "shell": "/bin/bash" 
     } 
    }, 
    "msg": "USER:root AUTHKEYSLIST:" 
} 

TASK [Manage users Authorized Keys] ******************************************************************************************************************************************************************************************************************************************* 
failed: [localhost] (item={'key': u'mgmtusr', 'value': {u'home': u'/home/mgmtusr', u'shell': u'/bin/bash', u'authorized_keys': [u'key01', u'key02', u'key03']}}) => {"changed": false, "failed": true, "item": {"key": "mgmtusr", "value": {"authorized_keys": ["key01", "key02", "key03"], "home": "/home/mgmtusr", "shell": "/bin/bash"}}, "msg": "Failed to lookup user mgmtusr: 'getpwnam(): name not found: mgmtusr'"} 
failed: [localhost] (item={'key': u'root', 'value': {u'home': u'/root', u'shell': u'/bin/bash', u'authorized_keys': [u'key01']}}) => {"changed": false, "failed": true, "item": {"key": "root", "value": {"authorized_keys": ["key01"], "home": "/root", "shell": "/bin/bash"}}, "msg": "invalid key specified: "} 

(with_subelements, lookup('template'는 ...) selectattr 솔루션을 보인다되지 않습니다. 제안 사항이 있으십니까? 여기

답변

1

당신은 이동 :

- name: Manage users Authorized Keys 
    authorized_key: 
    user: "{{ item.key }}" 
    key: "{{ item.value.authorized_keys | map('extract',pub_keys) | list | join('\n') }}" 
    exclusive: yes 
    with_dict: "{{ users }}" 

extract 필터 사용을 참조하십시오.

또한 map을 사용하는 경우 값을 방지하려면 거의 항상 list으로 타이프 변환해야합니다.

+0

답변 해 주셔서 감사합니다. 검색 할 때'map'을 조금 읽었지만 아직 찾지 못했습니다. 이제 결정적으로, 저는 그것에 대해 더 많이 배워야합니다. – xenlo