Ansible的Win_PowerShell可以彻底处理布尔值吗

kxe2p93d  于 2022-11-10  发布在  Shell
关注(0)|答案(1)|浏览(99)

当我尝试将布尔变量传递给win_powershell以在远程访客/目标上注册测试的离散状态时(供以后使用),win_powershell似乎会阻塞。对于多次尝试提供符合要求的语句,我收到了如下错误:

  • was not followed by a valid variable name character. Consider using ${} to delimit the name.
  • Last close parenthesis is an invalid character
  • Cannot convert string to bool
  • Colon is unexpected token
  • $True is unexpected token
  • Unable to convert to dictionary
  • Must either be a JSON string or in the key=value form

我的目标是使用Win_PowerShell模块来执行PowerShell脚本……

$IsInstalled = ((gp HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*).DisplayName -Match "Microsoft SQL Server").Length -gt 0

..。在远程主机上,并在后面的攻略中使用IsInstalled变量。(p/s语句在直接调用时执行得非常完美)。
我的任务最终看起来像下面这样,所有不同的/不成功的尝试都被注解掉了。请注意,最后我求助于最简单的测试,它推断通过Win_PowerShell处理布尔值是不可行的。我希望有人能证明我是错的,并且/或者确认我需要通过处理字符串变量来获得这样的解决方案。
顺便说一句(对于无辜的旁观者)在Win_PowerShell的Ansible文档中没有bool这个词的命中。但是,参数的描述包括单词字典和术语key=Value对。如果这些描述是限制,它应该(我希望是)这样陈述(更强调)。
一路上观察到的要点,…

  • an=运算符始终生成字符串;对其他变量类型使用json语法;对其他类型(如Boolean)使用a:(冒号)。
  • 考虑使用${}来分隔变量名(但如何分隔?)
  • 括起任何布尔值等同于单‘
  • 我找到了其他一些博客/帖子,但没有任何外行(Json New)术语(我可以理解)。

有没有人有办法让布尔值按要求工作,或者我应该(只是)尝试将所需的状态处理为字符串变量?查看这些博客…
powershell - Variable reference is not valid. ':' was not followed by a valid variable name character如何在双引号字符串中使用对象的属性?
这是我的任务努力(失败的声明被评论)……

- name: Test for installed SQL Server
      ansible.windows.win_powershell:
        script: |
          [CmdletBinding()]
          param (
            [bool]$IsInstalled
          )
          # $IsInstalled = ((gp HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*).DisplayName -Match "Microsoft SQL Server").Length -gt 0
          # $IsInstalled: ((gp HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*).DisplayName -Match "Microsoft SQL Server").Length -gt 0
          # $IsInstalled: ${ ((gp HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*).DisplayName -Match "Microsoft SQL Server").Length -gt 0 }
          # ${IsInstalled}: ((gp HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*).DisplayName -Match "Microsoft SQL Server").Length -gt 0
          # if ( ((gp HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*).DisplayName -Match "Microsoft SQL Server").Length -gt 0 ) # last close paren is invalid character
          # if ( '((gp HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*).DisplayName -Match "Microsoft SQL Server").Length -gt 0' ) # cannot convert string to bool
          if ( $False ) # a sanity check ...
             # { $IsInstalled: $True }
             # { ${ $IsInstalled}: $True }
             # { ${IsInstalled}: $True } # colon is unexpected token 
             # { ${IsInstalled} = $True } # equals outputs a string; cannot convert to boolean (i knew that but what the hey)
             # { ${ $IsInstalled: } $True } # unexpected token $True
             { '$IsInstalled: $True' }
          else
             # { $IsInstalled: $False }
             # { ${ $IsInstalled}: $False }
             # { ${IsInstalled}: $False }
             # { ${IsInstalled} = $False }
             # { ${ $IsInstalled: } $False }
             { '$IsInstalled: $False' }
        parameters:
          # IsInstalled: $True # cannot convert string to bool
          # 'IsInstalled: $True' # is of type System.String ... unable to convert to dict ... must either be a JSON string or in the key=value form"
}
      register: SQLtest

我期待第一个(注解)语句起作用;完成。也就是说,将SQLest.IsInstated注册为布尔状态以供以后使用。

2w2cym1i

2w2cym1i1#

这是一个确实有效的解决方案;我无法让模板起作用,...

- name: Test for installed SQL Server
        ansible.windows.win_powershell:
          script: |
            ((gp HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*).DisplayName -Match "Microsoft SQL Server 2019 ").Length -gt 0
        register: SQLtest

..。在后面的When条件句中使用...

when: not SQLtest.output

它总是很简单(一旦你知道怎么做)。

相关问题