【问题标题】:How to get ansible playbook to take input for my perlscript.pl which contains <STDIN>?如何让 ansible playbook 为包含 <STDIN> 的 perlscript.pl 输入?
【发布时间】:2019-07-14 04:22:22
【问题描述】:

在 ansible playbook 中,我使用一个包含 perl 脚本文件的文件来执行一些任务。如何获取 ansible 以捕获 perl 脚本的 STDIN?

> #!/usr/bin/perl -w
> ...
> print OUTPUT_FILE "\n";
> my $datasetid_target = <STDIN>; <<--not able to link to ansible playbook
> $datasetid_target; print OUTPUT_FILE
> qq("datasetId":"$datasetid_target",);

该脚本作为一个独立的脚本运行良好,但使用 ansible 不会打印任何内容。

我尝试使用 args、vars、expect、stdin 没有成功。

预期结果大致如下:(请参阅快照)

>  - name: edit source file
>    shell: perl "{{ project_dir }}/edit_dataschema.pl"
>    args:
>      stdin:  <<-- here is my problem
>        "{{datasetid_target}}"

【问题讨论】:

  • 嗨 Bhargavi,欢迎来到 SO。请更具体地说明正在发生的事情;你的程序挂了吗?我能够用shell: perl -we '$foo = &lt;STDIN&gt;; print qq("foo": "$foo",);' 组合一个简单的例子,它在与args: stdin: 一起使用时表现合理,所以我担心你只是有不恰当的期望
  • 嗨,马修,感谢您的帮助。有没有办法传递多个标准输入?例如: args: stdin: $dataset_target: {{dataset_target}} $tablename: {{tablename}}?
  • @BhargaviJagannathan 我没听懂你..? STDIN 中的多个输入是什么意思。?您可以在 while 循环中进行输入。否则读取输入并使用空格字符分割。
  • 重新表述我的问题:如何使用 shell 模块将 3 个命令行参数传递给 perl 脚本。我使用 programname.pl arg1 arg2 arg3。但是脚本只处理第一个参数。

标签: perl ansible yaml stdin


【解决方案1】:

首先,以防万一,请检查在同一行传递参数是否有任何影响(as seen here):

- name: edit source file
  shell: perl "{{ project_dir }}/edit_dataschema.pl"
  args:
    stdin: "{{datasetid_target}}"

其次,检查string conversion as made here 是否有帮助:

  args:
    stdin: "{{datasetid_target | string}}"

【讨论】:

  • 感谢您的建议,您的字符串建议帮助解决了问题。我还有一个问题,我在同一个脚本中还有 2 个标准输入,关于如何在 ansible 上处理它们有什么建议吗?我是 ansible 和 perl 的新手,感谢您的帮助。
  • @BhargaviJagannathan 如果它们用于相同命令的相同 STDIN,最好将字符串组合为一个,以传递给所述命令。如果对于两个不同的命令,它们是两个不同的 STDIN,则应适用上述方法,只需对其他命令重复/复制即可。
  • 如何使用 shell 模块将 3 个命令行参数传递给 perl 脚本。我使用 {{}}
  • @BhargaviJagannathan 通过复制 shell 步骤三次,每个步骤都有自己的字符串作为 STDIN 在每个 shell 步骤中传递。
猜你喜欢
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多