如何同时为Ansible ad-hoc提供named和free_form参数?

时间:2019-04-29 14:35:53

标签: ansible ansible-ad-hoc

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

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

我想将此作为一次性任务使用,所以我想以... p>的方式使用临时执行

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

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

在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是否可以实现这一点更感兴趣,因为文档没有给出任何说明。

1 个答案:

答案 0 :(得分:1)

我无法直接测试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())

也就是说,它仅将createsremoveschdirexecutablewarn识别为模块参数。我认为这是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