我遇到了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是否可以实现这一点更感兴趣,因为文档没有给出任何说明。
答案 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())
也就是说,它仅将creates
,removes
,chdir
,executable
和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