2017-05-08 1 views
1

zusammengesetzt ist habe ich eine Reihe von Rückgabewerte von einem Powershell-Skript, und ich möchte einen Befehl auszuführen, nur wenn alle Elemente im Array sind 0. Was ich diese haben, ist:Überprüfen Sie, ob eine Liste nur von Werten gleich 0 in ansible

- name: check if computer is running DC services 
    raw: Get-Service -name {{item}} 
    with_items: 
    - "adws" 
    - "kdc" 
    - "netlogon" 
    register: services 
    # ignore_errors: yes 
    failed_when: services.stderr and 'Cannot find any service with service name ' not in services.stderr 
    changed_when: False 

- name: debug services 
    debug: 
    var=services 

- name: copy check_ad.exe to DCs 
    win_copy: src=check_ad.exe dest='{{nagios_client_install_path}}\\check_ad.exe' 
    tags: ['win-nagios-client'] 
    when: item.rc == 0 

aber dies wird copy check_ad.exe wenn jede der Dienste laufen ausgeführt werden. Wie kann ich es ändern, um nur zu laufen, wenn alle Dienste laufen?

Debug-Info ist hier:

ok: [server_name] => { 
    "changed": false, 
    "services": { 
     "changed": false, 
     "msg": "All items completed", 
     "results": [ 
      { 
       "_ansible_item_result": true, 
       "_ansible_no_log": false, 
       "changed": false, 
       "failed": false, 
       "failed_when_result": false, 
       "item": "adws", 
       "rc": 1, 
       "stderr": "Get-Service : Cannot find any service with service name 'adws'.\r\nAt line:1 char:1\r\n+ Get-Service -name adws\r\n+ ~~~~~~~~~~~~~~~~~~~~~~\r\n + CategoryInfo   : ObjectNotFound: (adws:String) [Get-Service], Ser \r\n viceCommandException\r\n + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell. \r\n Commands.GetServiceCommand\r\n \r\n\r\n", 
       "stdout": "", 
       "stdout_lines": [] 
      }, 
      { 
       "_ansible_item_result": true, 
       "_ansible_no_log": false, 
       "changed": false, 
       "failed": false, 
       "failed_when_result": false, 
       "item": "kdc", 
       "rc": 1, 
       "stderr": "Get-Service : Cannot find any service with service name 'kdc'.\r\nAt line:1 char:1\r\n+ Get-Service -name kdc\r\n+ ~~~~~~~~~~~~~~~~~~~~~\r\n + CategoryInfo   : ObjectNotFound: (kdc:String) [Get-Service], Serv \r\n iceCommandException\r\n + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell. \r\n Commands.GetServiceCommand\r\n \r\n\r\n", 
       "stdout": "", 
       "stdout_lines": [] 
      }, 
      { 
       "_ansible_item_result": true, 
       "_ansible_no_log": false, 
       "changed": false, 
       "failed": false, 
       "failed_when_result": false, 
       "item": "netlogon", 
       "rc": 0, 
       "stderr": "", 
       "stdout": "\r\nStatus Name    DisplayName       \r\n------ ----    -----------       \r\nRunning Netlogon   netlogon        \r\n\r\n\r\n", 
       "stdout_lines": [ 
        "", 
        "Status Name    DisplayName       ", 
        "------ ----    -----------       ", 
        "Running Netlogon   netlogon        ", 
        "", 
        "" 
       ] 
      } 
     ] 
    } 
} 
+0

"* Dies wird" copy check_ad.exe "ausführen, wenn einer der Dienste ausgeführt wird *" - geht das wirklich? IMHO sollte es einen Syntaxfehler in der letzten Aufgabe erzeugen. – techraf

+0

@techraf - welches Syntaxproblem siehst du? Ich habe es oft ohne Problem ausgeführt (abgesehen von dem, den ich erwähnte, dass es die beabsichtigte Aktion nicht ausführt) – ebarrere

+0

Es gibt keine Schleife in 'copy check_ad.exe zu DCs' Task, so dass' item' nicht definiert ist und 'item.rc verweist 'in der Bedingung sollte fehlschlagen. – techraf

Antwort

1

Als rc Werte sind ganze Zahlen Sie können sie summieren und das Ergebnis auf 0 vergleichen:

- name: copy check_ad.exe to DCs 
    win_copy: src=check_ad.exe dest='{{nagios_client_install_path}}\\check_ad.exe' 
    tags: ['win-nagios-client'] 
    when: services.results | map(attribute='rc') | sum == 0 

einen allgemeineren Ansatz (nicht nur für Integer) wäre eine difference filter zu verwenden, die alle Vorkommen von 0 (aus der resultierenden Liste der Zuordnung rc wie oben) entfernt und die Größe überprüft e der verbleibenden Liste.

Wenn die ursprüngliche Liste andere Elemente enthielt, wäre der resultierende Wert positiv.

+0

Schön, danke! Ich dachte darüber nach, die RC-Felder zu summieren, konnte aber keinen Weg finden, das zu tun - danke für die Hilfe mit Jinja. – ebarrere

Verwandte Themen