【问题标题】:How to use a Powershell output into an Ansible Playbook如何在 Ansible Playbook 中使用 Powershell 输出
【发布时间】:2017-10-20 15:23:20
【问题描述】:

我有一个简单的 Powershell 脚本,它检查是否有两件事并将结果写入输出。我的想法是在 Ansible Playbook 中使用该输出作为变量,用于重启或不重启机器(但在下面的示例中,我有一个 PING 测试命令)。

我的 PS1

#Change computer description
$CDesc = Get-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\"
If($CDesc.GetValue("srvcomment") -eq $null) {
    New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\" -Name "srvcomment" -Value "PROD | AZI | V | APPLICA | SQL" -PropertyType String
} else {
    $step1 = Write-Output "Step1"
}

#Check if CD drive is available
$CDletter = Get-WmiObject -Class Win32_CDROMDrive | select -ExpandProperty Drive
If($CDletter -eq $null) {
    $step2 = Write-Output "Step2"
}



if (($step1) -and ($step2)) {Write-Host "already_updated"}

我的剧本:

# Run post build scripts on machines taggedd with AnsibleVM1 from commad line variable with "{{ hosts }}"
# ansible-playbook test.yml -i azure_rm.py --extra-vars "hosts=displayName_AnsibleVM1" --ask-vault-pass -vvvv

- hosts: "{{ hosts }}"
  gather_facts: no

  vars_files:
   - ./vars/vault.yml
   - ./vars/vars.yml

  tasks:
   - include_vars: vault.yml
   - name: test script
     script: ./files/test.ps1
     register: result

   - set_fact: machineId={{result.stdout_lines.0}}

   - win_ping:
       when: machineId.already_ASDF

但是,PING(或即将重新启动)模块仍在运行。这是我的输出:

TASK [test script] ****************************************************************************************************************************************************************
task path: /home/beefcake/cloudy/Ansible/test.yml:13
<51.x.x.x> ESTABLISH WINRM CONNECTION FOR USER: admin on PORT 5986 TO 51.x.x.x
EXEC (via pipeline wrapper)
EXEC (via pipeline wrapper)
<51.x.x.x> PUT "/home/beefcake/cloudy/Ansible/files/test.ps1" TO "C:\Users\admin\AppData\Local\Temp\ansible-tmp-1508512681.4-33957924788761\test.ps1"
EXEC (via pipeline wrapper)
EXEC (via pipeline wrapper)
changed: [AnsibleVM1] => {
    "changed": true, 
    "failed": false, 
    "rc": 0, 
    "stderr": "", 
    "stdout": "already_updated\n", 
    "stdout_lines": [
        "already_updated"
    ]
}
Read vars_file './vars/vault.yml'
Read vars_file './vars/vars.yml'

TASK [set_fact] *******************************************************************************************************************************************************************
task path: /home/beefcake/cloudy/Ansible/test.yml:17
ok: [AnsibleVM1] => {
    "ansible_facts": {
        "machineId": "already_updated"
    }, 
    "changed": false, 
    "failed": false
}
Read vars_file './vars/vault.yml'
Read vars_file './vars/vars.yml'

TASK [win_ping] *******************************************************************************************************************************************************************
task path: /home/beefcake/cloudy/Ansible/test.yml:19
Using module file /usr/local/lib/python2.7/dist-packages/ansible/modules/windows/win_ping.ps1
<51.x.x.x> ESTABLISH WINRM CONNECTION FOR USER: admin on PORT 5986 TO 51.x.x.x
EXEC (via pipeline wrapper)
ok: [AnsibleVM1] => {
    "changed": false, 
    "failed": false, 
    "ping": "pong"
}
META: ran handlers
META: ran handlers

PLAY RECAP ************************************************************************************************************************************************************************
AnsibleVM1                 : ok=4    changed=1    unreachable=0    failed=0 

任何想法我做错了什么?

【问题讨论】:

    标签: powershell azure ansible


    【解决方案1】:

    如果您想匹配字符串(例如,检查脚本的输出值是否“已更新”),您可以这样:

    - win_ping: when: machineId == 'already_updated' machineId 没有属性,它是一个简单的字符串值。

    为了保存步骤,您还可以执行以下操作: - win_ping: when: result.stdout_lines[0] == 'already_updated'

    为了构建更复杂的 Powershell 逻辑并仍然与 Ansible 交互,您基本上有两种选择:

    1. 让您的 Powershell 脚本输出 json(将“Convertto-json”cmdlet 与 Write-Output 结合使用)并使用 Ansible 的内置 json 解析器对其进行解析
    2. 在 Powershell 中编写 Ansible 模块。

    【讨论】:

    • 感谢您对此进行调查,但是您提到的前 2 个 when 选项没有帮助,它仍然可以正常工作。只是为了代格,我将result.stdout_lines[0] 更改为[1] 以查看它是否会失败,但它没有,只是直接运行。我也尝试过ConvertTo-JSON for if (($step1) -and ($step2)) {Write-Host "already_updated"} Powershell,但奇怪的是,如果我不这样做,它的输出与您在此处看到的完全相同,而且它也没有任何区别。最后一件事,我已将 {Write-Host 更改为 {Write-Output,我 认为 将它变成了一个变量,但它没有产生差异 :(
    • 这很奇怪。设置好后可以使用“debug”模块打印“machineId”的值吗?
    • 另外,我猜它应该运行 win_ping 模块?如果 Powershell 脚本输出“already_updated”,则运行 win_ping 模块。至少这是我在上述答案中的示例中的逻辑。
    猜你喜欢
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2021-11-04
    相关资源
    最近更新 更多