2016-12-08 4 views
3

Versuch, ein Playbook zu schreiben, das überprüft, ob eine Reihe von Dateien auf einer Reihe von Servern (sowohl Linux- als auch Windows-Hosts) vorhanden ist. HierAnsible-Playbook für Linux- und Windows-Hosts

ist das, was ich bisher:

--- 
- hosts: "{{hosts}}" 
    vars: 
    scripts: 
     - check_blackout.pl 
     - check_empty.pl 
    tasks: 
    - name: windows stat 
     with_items: "{{scripts}}" 
     win_stat: path=D:\scripts\{{item}} 
     register: windows_stat 
     when: "'windows' in group_names" 
    - name: other stat 
     with_items: "{{scripts}}" 
     stat: path=/usr/local/bin/{{item}} 
     register: other_stat 
     remote_user: "{{script_owner | default(ansible_user)}}" 
     when: "'windows' not in group_names" 
    - name: windows debug 
     with_items: "{{windows_stat.results}}" 
     debug: var={{item.item}} 
     when: "{{item.stat.exists}}" 
    - name: other debug 
     with_items: "{{other_stat.results}}" 
     debug: var={{item.item}} 
     when: "{{item.stat.exists}}" 
... 

Wenn ich dies gegen einen Windows- und Linux-Host ausgeführt werden zum Testen, erhalte ich folgendes:

[[email protected] ~]$ ansible-playbook test.yml -e "hosts=vmhkge1jasdev01,jdeesbkup" --ask-vault-pass 
Vault password: 

PLAY [vmhkge1jasdev01,jdeesbkup] ************************************************************************************************************************************************ 

TASK [Gathering Facts] ********************************************************************************************************************************************************** 
ok: [vmhkge1jasdev01] 
ok: [jdeesbkup] 

TASK [windows stat] ************************************************************************************************************************************************************* 
skipping: [jdeesbkup] => (item=check_blackout.pl) 
skipping: [jdeesbkup] => (item=check_empty.pl) 
ok: [vmhkge1jasdev01] => (item=check_blackout.pl) 
ok: [vmhkge1jasdev01] => (item=check_empty.pl) 

TASK [other stat] *************************************************************************************************************************************************************** 
skipping: [vmhkge1jasdev01] => (item=check_empty.pl) 
skipping: [vmhkge1jasdev01] => (item=check_blackout.pl) 
ok: [jdeesbkup] => (item=check_blackout.pl) 
ok: [jdeesbkup] => (item=check_empty.pl) 

TASK [windows debug] ************************************************************************************************************************************************************ 
skipping: [vmhkge1jasdev01] => (item={'_ansible_parsed': True, u'stat': {u'exists': False}, '_ansible_item_result': True, '_ansible_no_log': False, u'changed': False, 'item': u'check_empty.pl', 'invocation': {'module_name': u'win_stat'}}) 
skipping: [vmhkge1jasdev01] => (item={'_ansible_parsed': True, u'stat': {u'exists': False}, '_ansible_item_result': True, '_ansible_no_log': False, u'changed': False, 'item': u'check_blackout.pl', 'invocation': {'module_name': u'win_stat'}}) 
fatal: [jdeesbkup]: FAILED! => {"failed": true, "msg": "The conditional check '{{item.stat.exists}}' failed. The error was: error while evaluating conditional ({{item.stat.exists}}): 'dict object' has no attribute 'stat'\n\nThe error appears to have been in '/home/ansible/test.yml': line 19, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n  when: \"'windows' not in group_names\"\n - name: windows debug\n ^here\n"} 

TASK [other debug] ************************************************************************************************************************************************************** 
fatal: [vmhkge1jasdev01]: FAILED! => {"failed": true, "msg": "The conditional check '{{item.stat.exists}}' failed. The error was: error while evaluating conditional ({{item.stat.exists}}): 'dict object' has no attribute 'stat'\n\nThe error appears to have been in '/home/ansible/test.yml': line 23, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n  when: \"{{item.stat.exists}}\"\n - name: other debug\n ^here\n"} 
     to retry, use: --limit @/home/ansible/test.retry 

PLAY RECAP ********************************************************************************************************************************************************************** 
jdeesbkup     : ok=2 changed=0 unreachable=0 failed=1 
vmhkge1jasdev01   : ok=2 changed=0 unreachable=0 failed=1 

[[email protected] ~]$ 

Irgendwelche Ideen, wie ich bekommen kann funktioniert das?
Ich habe die Gruppenmitgliedschaft verschiedene Kombinationen ausprobiert einschließlich der Überprüfung vor der Überprüfung der Ergebnisse:

when: "'windows' in group_names and {{item.stat.exists}}" 

Allerdings scheint ansible noch das item.stat Feld selbst zu überprüfen, wenn der erste Teil der Bedingung falsch ist.

Oder ist meine grundlegende Vorgehensweise falsch, sollte ich diese Aufgaben in verschiedene Playbooks aufteilen?

Antwort

1

Ja, Sie haben Recht. with_items wird vor when ausgewertet. Sie können eine Standard leere Liste hinzufügen, den Fehler zu vermeiden:

- name: other debug 
    with_items: "{{other_stat.results | default([]) }}" 
    debug: var={{item}} 
    when: "{{item.stat.exists | default(false)}}" 
+0

, die keinen Unterschied überhaupt nicht machen. Immer noch 'dict object' hat keine Attribut 'stat' Fehlermeldung. – Patrick

+0

Die bedingte Überprüfung '{{item.stat.exists | Standard (falsch)}} 'fehlgeschlagen. 'dict object' hat kein Attribut 'stat'. – Patrick

+0

Ja, tut mir leid, ich verstehe, ist schwierig zu reproduzieren, Problem verursacht durch laufende Spiele gegen Windows und Linux-Hosts, ich versuche, einfachere Testfall zu erzeugen, aber nicht viel Glück. – Patrick

0

habe es funktioniert, ist hier erfolgreich Textbuch und Ausgang:

--- 
- hosts: "{{hosts}}" 
    vars: 
    scripts: 
     - run.pl 
    tasks: 
    - name: win_stat 
     with_items: scripts 
     win_stat: path="D:\scripts\{{item}}" 
     register: "win_result" 
     when: "'windows' in group_names" 
    - name: other_stat 
     with_items: scripts 
     stat: path="/usr/local/bin/{{item}}" 
     register: "other_result" 
     when: "'windows' not in group_names" 
    - debug: var=win_result 
    - debug: var=other_result 
    - with_items: "{{ win_result.results }}" 
     debug: msg="{{item.item}}" 
     when: "not (item.skipped | default(false))" 
    - with_items: "{{ other_result.results}}" 
     debug: msg="{{item.item}}" 
     when: "not (item.skipped | default(false))" 
... 


[[email protected] ~]$ ansible-playbook debug.yml -e "hosts=jdeesbkup,vmhkge1jasdev01" --ask-vault-pass 
Vault password: 

PLAY [jdeesbkup,vmhkge1jasdev01] ************************************************************************************************************************** 

TASK [Gathering Facts] ************************************************************************************************************************************ 
ok: [jdeesbkup] 
ok: [vmhkge1jasdev01] 

TASK [win_stat] ******************************************************************************************************************************************* 
skipping: [jdeesbkup] => (item=scripts) 
ok: [vmhkge1jasdev01] => (item=scripts) 

TASK [other_stat] ***************************************************************************************************************************************** 
skipping: [vmhkge1jasdev01] => (item=scripts) 
ok: [jdeesbkup] => (item=scripts) 

TASK [debug] ********************************************************************************************************************************************** 
ok: [jdeesbkup] => { 
    "win_result": { 
     "changed": false, 
     "msg": "All items completed", 
     "results": [ 
      { 
       "_ansible_item_result": true, 
       "_ansible_no_log": false, 
       "changed": false, 
       "item": "scripts", 
       "skip_reason": "Conditional check failed", 
       "skipped": true 
      } 
     ] 
    } 
} 
ok: [vmhkge1jasdev01] => { 
    "win_result": { 
     "changed": false, 
     "msg": "All items completed", 
     "results": [ 
      { 
       "_ansible_item_result": true, 
       "_ansible_no_log": false, 
       "_ansible_parsed": true, 
       "changed": false, 
       "invocation": { 
        "module_name": "win_stat" 
       }, 
       "item": "scripts", 
       "stat": { 
        "exists": false 
       } 
      } 
     ] 
    } 
} 

TASK [debug] ********************************************************************************************************************************************** 
ok: [jdeesbkup] => { 
    "other_result": { 
     "changed": false, 
     "msg": "All items completed", 
     "results": [ 
      { 
       "_ansible_item_result": true, 
       "_ansible_no_log": false, 
       "_ansible_parsed": true, 
       "changed": false, 
       "invocation": { 
        "module_args": { 
         "checksum_algorithm": "sha1", 
         "follow": false, 
         "get_attributes": true, 
         "get_checksum": true, 
         "get_md5": true, 
         "get_mime": true, 
         "path": "/usr/local/bin/scripts" 
        }, 
        "module_name": "stat" 
       }, 
       "item": "scripts", 
       "stat": { 
        "exists": false 
       } 
      } 
     ] 
    } 
} 
ok: [vmhkge1jasdev01] => { 
    "other_result": { 
     "changed": false, 
     "msg": "All items completed", 
     "results": [ 
      { 
       "_ansible_item_result": true, 
       "_ansible_no_log": false, 
       "changed": false, 
       "item": "scripts", 
       "skip_reason": "Conditional check failed", 
       "skipped": true 
      } 
     ] 
    } 
} 

TASK [debug] ********************************************************************************************************************************************** 
skipping: [jdeesbkup] => (item={'skipped': True, '_ansible_no_log': False, 'skip_reason': u'Conditional check failed', '_ansible_item_result': True, 'item': u'scripts', 'changed': False}) 
ok: [vmhkge1jasdev01] => (item={'_ansible_parsed': True, u'stat': {u'exists': False}, '_ansible_item_result': True, '_ansible_no_log': False, u'changed': False, 'item': u'scripts', 'invocation': {'module_name': u'win_stat'}}) => { 
    "item": { 
     "changed": false, 
     "invocation": { 
      "module_name": "win_stat" 
     }, 
     "item": "scripts", 
     "stat": { 
      "exists": false 
     } 
    }, 
    "msg": "scripts" 
} 

TASK [debug] ********************************************************************************************************************************************** 
--- 
- hosts: "{{hosts}}" 
    vars: 
    scripts: 
     - run.pl 
    tasks: 
    - name: win_stat 
     with_items: scripts 
     win_stat: path="D:\scripts\{{item}}" 
     register: "win_result" 
     when: "'windows' in group_names" 
    - name: other_stat 
     with_items: scripts 
     stat: path="/usr/local/bin/{{item}}" 
     register: "other_result" 
     when: "'windows' not in group_names" 
    - debug: var=win_result 
    - debug: var=other_result 
    - with_items: "{{ win_result.results }}" 
     debug: msg="{{item.item}}" 
     when: "not (item.skipped | default(false))" 
    - with_items: "{{ other_result.results}}" 
     debug: msg="{{item.item}}" 
     when: "not (item.skipped | default(false))" 
#  when: "'windows' in group_names and {{item.stat.exists}}" 
# - name: win_test 
#  with_items: {{win_result.results}} 
#  debug: var="{{item}}" 
#  when: "'windows' in group_names and {{item.stat.exists}}" 

    ~                                       
    ~                                       
    ~                                       
    skipping: [vmhkge1jasdev01] => (item={'skipped': True, '_ansible_no_log': False, 'skip_reason': u'Conditional check failed', '_ansible_item_result': True, 'item': u'scripts', 'changed': False}) 
    ok: [jdeesbkup] => (item={'_ansible_parsed': True, u'stat': {u'exists': False}, '_ansible_item_result': True, '_ansible_no_log': False, u'changed': False, 'item': u'scripts', 'invocation': {'module_name': u'stat', u'module_args': {u'checksum_algorithm': u'sha1', u'get_checksum': True, u'follow': False, u'path': u'/usr/local/bin/scripts', u'get_md5': True, u'get_mime': True, u'get_attributes': True}}}) => { 
     "item": { 
      "changed": false, 
      "invocation": { 
       "module_args": { 
        "checksum_algorithm": "sha1", 
        "follow": false, 
        "get_attributes": true, 
        "get_checksum": true, 
        "get_md5": true, 
        "get_mime": true, 
        "path": "/usr/local/bin/scripts" 
       }, 
       "module_name": "stat" 
      }, 
      "item": "scripts", 
      "stat": { 
       "exists": false 
      } 
     }, 
     "msg": "scripts" 
    } 

    PLAY RECAP ************************************************************************************************************************************************ 
    jdeesbkup     : ok=5 changed=0 unreachable=0 failed=0 
    vmhkge1jasdev01   : ok=5 changed=0 unreachable=0 failed=0