2017-06-27 2 views
0

Ich schreibe verschiedene Playbooks für die Bereitstellung von Benutzern, Gruppen, Richtlinien usw. in AWS.Schlüsselwert von registrierter Variable in ansible abrufen

Im Moment versuche ich eine Aufgabe zu schreiben, die alle Zugriffsschlüssel von einem bestimmten AWS IAM-Konto entfernt. Um dies ordnungsgemäß mit dem iam-Modul in ansible zu tun, müssen Sie den AWS-Zugriffsschlüssel angeben, den Sie deaktivieren möchten.

Dieses Skript erstellt auch einen Benutzer vor der Hand (das Entfernen von Zugriffsschlüsseln soll sicherstellen, dass, wenn der Benutzer bereits erstellt wurde, keine vorherigen Zugriffsschlüssel vorhanden sind).

Der Ausgang der Erstellung eines Benutzers wird in eine Variable registriert wie

so
- name: Create new user and add to IAM group for console 
    vars: 
    use_key: "{{ enable_access_keys }}" 
    iam: 
    iam_type: user 
    name: "{{ item }}" 
    state: present 
    aws_access_key: "{{ account_vars.aws_access_key }}" 
    aws_secret_key: "{{ account_vars.aws_secret_key }}" 
    password: "{{ iam_password }}" 
    update_password: on_create 
    with_items: 
    - "{{ iam_user_name_list }}" 
    when: not use_key 
    register: console_user 

Der Ausgang des console_user var ist:

ok: [127.0.0.1] => { 
    "changed": false, 
    "msg": { 
     "changed": false, 
     "msg": "All items completed", 
     "results": [ 
      { 
       "_ansible_item_result": true, 
       "_ansible_no_log": false, 
       "_ansible_parsed": true, 
       "changed": false, 
       "groups": null, 
       "invocation": { 
        "module_args": { 
         "access_key_ids": null, 
         "access_key_state": null, 
         "aws_access_key": "removed", 
         "aws_secret_key": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER", 
         "ec2_url": null, 
         "groups": null, 
         "iam_type": "user", 
         "key_count": 1, 
         "name": "other-guy", 
         "new_name": null, 
         "new_path": null, 
         "password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER", 
         "path": "/", 
         "profile": null, 
         "region": null, 
         "security_token": null, 
         "state": "present", 
         "trust_policy": null, 
         "trust_policy_filepath": null, 
         "update_password": "on_create", 
         "validate_certs": true 
        } 
       }, 
       "item": "other-guy", 
       "keys": { 
        "Access key is here": "Active" 
       }, 
       "user_name": "other-guy" 
      } 
     ] 
    } 
} 

Meine Frage ist, wie kann ich den Zugriffsschlüssel erhalten das ist unter dem "Schlüssel" Wörterbuch zur Verfügung gestellt? Da das, wonach ich suche, der Schlüssel ist, nicht der Wert, bin ich mir nicht sicher, wie ich diesen Zugriffsschlüssel erhalten würde, damit ich ihn in der nächsten Aufgabe verwenden kann, um zu sagen, dass ich ihn entfernen möchte.

Vielen Dank im Voraus für jede Hilfe.

Antwort

0

Es gibt .keys() Methode für jedes Wörterbuch. Zum Beispiel Schlüssel für jeden Benutzer drucken:

- debug: 
    msg: "User {{ item.user_name }} has keys {{ item.keys.keys() }}" 
    with_items: "{{ console_user.results }}" 

Oder iterieren jeden Schlüssel jeden Benutzer mit JMESPath:

- debug: 
    msg: "{{ item }}" 
    with_items: "{{ console_user.results | json_query('[].keys.keys(@)') }}" 
+0

Vielen Dank! Genau das, was ich gesucht habe. Aus irgendeinem Grund mag Ansible die .keys nicht direkt auf der Variablen, weil es so zu denken scheint, als wollten wir keys() aufrufen (console_user.results [0] .keys gibt nur "builtin_function_or_method" -Objekt anstelle der KV-Paare im Dictionary zurück)). Ich musste am Ende die json Abfrage verwenden, aber das hat den Trick gemacht. – astrade