【问题标题】:puppet exec: could not find command 'source'puppet exec:找不到命令“源”
【发布时间】:2021-08-30 11:10:40
【问题描述】:
 exec {'alias':
   command  => 'source /etc/profile',
   path =>  [ '/bin/', '/sbin/' , '/usr/bin/', '/usr/sbin/' ],
   provider => shell,
 }

/etc/profile

alias extend_shutdown_15='bash extend_shutdown.sh 15'

因此,在执行资源中使用“source /etc/profile”命令时,我想在任何配置更改后更新“/etc/profile”,但出现以下错误:

Error: Could not find command 'source'
Error: /Stage[main]/Main/Node[default]/Exec[alias]/returns: change from 'notrun' to ['0'] failed: Could not find command 'source' (corrective)

【问题讨论】:

  • source /etc/profile 即使成功也不会造成任何永久性更改。为什么要这样做?
  • 我想为命令创建别名,所以我打算添加到 /etc/profile 中以使其成为全局,因此将这些配置更改影响到我们的系统需要运行“rebo​​ot”或“source /etc /轮廓” ?我正在尝试这些 puppet exec,但由于源命令而出错
  • 好的,那么 exec 资源中的隔离 source /etc/profile 将无法为您实现此目的。您可能应该考虑以其他方式执行此操作。
  • 此外,将别名放入/etc/profile 并不会使它们成为全局变量。根据环境和参数,在 shell 初始化期间并不总是读取该文件。此外,别名不会传递给子进程,默认情况下,它们不会被非交互式 shell 扩展。此外,它们不会与使用替代 shell 的人共享。如果您想向系统添加新命令,请考虑编写可执行的 shell 脚本并将它们放在默认 PATH 中的某个位置。

标签: exec puppet


【解决方案1】:

这...

Error: Could not find command 'source'

... 与Execcommand 参数有关,与文件/etc/profile 的具体内容无关。问题正是错误消息所说的:source is not a known command。

也许您已经习惯了 Csh 系列的 shell,它提供了 source 作为内置函数,但 Puppet 将改为调用 POSIX shell。或者您可能习惯于 Bash、Zsh 或 Ksh 提供 source 作为内置命令,但这是一个扩展。 POSIX shell 语言没有定义 source 内置函数,它不是标准实用程序。至少,当 Bash 在 POSIX 模式下运行时,它不会识别 source,这就是我希望 Puppet 调用它的方式(或者你系统上的任何默认 shell)。

POSIX shell 语言中的等效命令是.(单个句点/句号字符)。那么,我希望这个Exec 可以正确应用:

 exec { 'alias':
   command  => '. /etc/profile',
   path     => [ '/bin', '/sbin' , '/usr/bin', '/usr/sbin' ],
   provider => 'shell',
 }

然而,正如 cmets 中所述,这在很大程度上是无用的。它不会影响在Exec 范围之外运行的任何东西的环境或别名(它不能)。此外,无论如何,别名是一种值得商榷的方式。

写完之后,我现在意识到这可能是一个 XY 问题。我建议发布一个新问题,重点关注您正在尝试做的事情,而不是关注如何去做的这个特定想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-25
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    相关资源
    最近更新 更多