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