![如何在 Ansible 中用命令模块替换 shell 模块?](https://linux22.com/image/785484/%E5%A6%82%E4%BD%95%E5%9C%A8%20Ansible%20%E4%B8%AD%E7%94%A8%E5%91%BD%E4%BB%A4%E6%A8%A1%E5%9D%97%E6%9B%BF%E6%8D%A2%20shell%20%E6%A8%A1%E5%9D%97%EF%BC%9F.png)
我需要一点帮助。
在下面的例子中,我需要shell
用command
模块替换。但我很困惑,因为 command
它不能与管道一起使用。
所以请给我这个任务的解决方案。例如:
- name: Get the version
become: true
run_once: true
shell: zypper pa | grep eric-odl | awk -F {'print $4'}
register: odl_version
由于每个命令的输出都依赖于下一个命令,我将如何拆分这个任务?
答案1
我需要
shell
用command
模块替换。
也许您可以提供更多有关原因和目标的背景信息。
目前我猜根据man zypper
你尝试
包 (pa) [选项] [存储库]...
列出所有可用的包或指定存储库中的所有包。类似于
zypper search -s -t package
。
首先,然后喜欢进一步推进某件事。
但我很困惑
command
是不是因为管道不工作。
是的,情况确实如此,这也是预期行为。请参见示例
-
命令不会通过 shell 处理,因此变量
$HOSTNAME
和操作(如“*
”、“<
”、“>
”、“|
”、“;
”和“&
”)将不起作用。使用ansible.builtin.shell如果您需要这些功能,请尝试使用模块。 -
它几乎就像ansible.builtin.命令
/bin/sh
模块,但通过远程节点上的shell ( ) 运行命令。
所以请给我这个任务的解决方案
不会有“那个解决方案”,但您可以查看以下从最可取到最不可取的方法的列表:
- 使用
package_facts
模块以获取包信息作为事实 - 评价
zypper
模块来管理 SUSE 和 openSUSE 上的软件包 zypper
在不需要grep
and 或awk
类似的 其他语法中使用该命令- 或者编写自己的自定义模块
- 或者使用
script
模块,以便在传输后在远程节点上运行本地脚本
或者,至少,只使用shell
带有管道的命令(以及您当前给出的示例)