2017-05-08 70 views
1

我有一个PowerShell脚本的返回值数组,我只想在数组中的所有项都为0时执行一个命令。有是这样的:检查一个列表是否只包含Ansible中的值等于0

- 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 

,但是这将运行copy check_ad.exe如果任何服务正在运行。我如何才能将其更改为只在全部服务正在运行时才运行?

调试信息是在这里:

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

“*这将运行”复制check_ad.exe“如果任何服务正在运行*” - 是否真的吗?恕我直言,它应该在上一个任务中产生语法错误。 – techraf

+0

@techraf - 你看到什么语法问题?我跑了很多次没有问题(除了我提到的它没有执行预期的动作) – ebarrere

+0

复制check_ad.exe到DCs任务没有循环,所以'item'是未定义的并且引用'item.rc '有条件的应该会失败。 – techraf

回答

1

由于rc值为整数,你可以总结起来,并将结果以0比:

- 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 

一个更普遍的做法(不仅对于整数)将使用difference filter移除所有出现的0(从如上所述的映射rc的结果列表)并且检查该siz e剩下的名单。

如果原始列表包含其他元素,则结果值为正数。

+0

不错,谢谢!我想了解一下rc字段的内容,但是看不到这样做的方法 - 感谢Jinja的帮助。 – ebarrere

相关问题