1

我遇到了 Ansible 的一个模块,该模块采用 free_form 参数和命名参数 - win_command。给出了一个具体示例,其中提供了一个 powershell 脚本stdin

- name: Run an executable and send data to the stdin for the executable
  win_command: powershell.exe -
  args:
    stdin: Write-Host test

我想将此用作一次性任务,因此我想以以下方式使用临时执行

ansible <host> -m <module> -a <args...>

不幸的是,我在文档中没有看到有关如何处理需要同时指定 free_form 和命名参数的模块的信息。有人知道吗?

将命名参数放在 free_form 参数之后将所有内容放在 free_form 参数中,导致 powershell 抱怨无关参数

... -m win_command -a 'powershell - stdin=C:\some\script.ps1 -arg1 value_1 -arg2 value_2'

PS:我知道我可能会在 free_form 参数中同时填充脚本路径和参数,但我更感兴趣的是了解这是否可以通过 ad-hoc 实现,因为文档没有说任何一种方式。

4

1 回答 1

4

我无法win_command直接测试模块,但是使用command语法非常相似的模块,您可以重现:

- command: some_command
  args:
    chdir: /tmp
    creates: flagfile

像这样:

ansible -m command -a 'chdir=/tmp creates=flagfile some_command'

更新

经调查……您遇到的问题stdin不是报价问题;就是当使用k1=v1 k2=v2 somecommand将参数传递给例如command模块的格式时,Ansible 只处理特定的键。在lib/ansible/parsing/splitter.py我们看到:

if check_raw and k not in ('creates', 'removes', 'chdir', 'executable', 'warn'):
    raw_params.append(orig_x)
else:
    options[k.strip()] = unquote(v.strip())

也就是说,它仅将createsremoveschdirexecutable、 和识别warn为模块参数。我认为这是 Ansible 中的一个错误。当然,添加对stdin参数的支持是微不足道的:

if check_raw and k not in ('stdin', 'creates', 'removes', 'chdir', 'executable', 'warn'):

通过这一更改,我们可以stdin按预期包含空格:

$ ansible localhost -m command -a 'chdir=/tmp stdin="Hello world" sed s/Hello/Goodbye/'                                                                    
 [WARNING]: Unable to parse /home/lars/.ansible_hosts as an inventory source

 [WARNING]: No inventory was parsed, only implicit localhost is available

localhost | CHANGED | rc=0 >>
Goodbye world
于 2019-04-29T14:46:42.693 回答