检查列表是否仅由Ansible中等于0的值组成

检查列表是否仅由Ansible中等于0的值组成,ansible,Ansible,我有一个来自PowerShell脚本的返回值数组,仅当数组中的所有项都为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_wh

我有一个来自PowerShell脚本的返回值数组,仅当数组中的所有项都为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                              ", 
                    "", 
                    ""
                ]
            }
        ]
    }
}

由于
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

更通用的方法(不仅仅是整数)是使用删除所有出现的
0
(如上所述,从映射的结果列表
rc
)并检查剩余列表的大小


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

“如果有任何服务正在运行,则将运行“复制检查”\u ad.exe”——是否确实如此?IMHO在上一个任务中应该产生语法错误。@techraf-您看到了什么语法问题?我多次运行它都没有出现问题(除了我提到的一次,它没有执行预期的操作)在
将check\u ad.exe复制到DCs
任务中没有循环,因此
未定义,引用
项。条件中的rc
应该失败。哦,哈哈,好的一点,我一定错过了最后一个“with\u items”在我的复制/粘贴行。很好,谢谢!我曾想过对rc字段求和,但找不到一种简单的方法——感谢Jinja的帮助。