我的Vagrant机器支持Augeas吗?

5

我想在我的 Vagrant 虚拟机上获取 Augeas 支持。

我尝试使用以下指令安装一些软件包:

package { "augeas-tools":   ensure => installed }
package { "libaugeas-dev":  ensure => installed }
package { "libaugeas-ruby": ensure => installed }

当我尝试在我的manifests中使用augeas时,在虚拟机引导后,我收到了以下错误消息:

err: Could not find a suitable provider for augeas

我正在使用Vagrant 1.0.3中附带的precise32官方镜像。
Vagrant 1.0.3包含ruby 1.8.7和puppet 2.7.14。
$ ruby -v
$ ruby 1.8.7 (2011-06-30 patchlevel 352) [i686-linux]
$ puppet help
$ Puppet v2.7.14

这是我的一个小清单,包含了php类,在apachemysql和其他类分别测试后进行了引用。 除了augeas命令之外,所有内容都可以正常工作。

class php {

    exec { "apt-update":
        command     => "/usr/bin/apt-get update",
        refreshonly => true;
    }

    package { "augeas-tools":   ensure => installed }
    package { "libaugeas-dev":  ensure => installed }
    package { "libaugeas-ruby": ensure => installed }

    package { "php5":               ensure => installed }
    package { "php5-cli":           ensure => installed }
    package { "php5-xdebug":        ensure => installed }
    package { "php5-curl":          ensure => installed }
    package { "php5-intl":          ensure => installed }
    package { "php5-imap":          ensure => installed }
    package { "php5-mcrypt":        ensure => installed }
    package { "php5-imagick":       ensure => installed }
    package { "php5-sqlite":        ensure => installed }
    package { "php5-gd":            ensure => installed }
    package { "php-apc":            ensure => installed }

    package { 
        "libapache2-mod-php5" : 
            ensure => installed,
            require => Package["php5"]
    }

    augeas { "php-cli":
        require =>  [
                        Package["php5"],
                        Package["augeas-tools"],
                        Package["libaugeas-dev"],
                        Package["libaugeas-ruby"],
                    ],
        context => "/etc/php5/cli/php.ini",
        changes => [
            "set date.timezone Europe/Rome",
            "set short_open_tag Off",
        ];
    }

    augeas { "php-apache":
        require =>  [
                        Package["php5"],
                        Package["augeas-tools"],
                        Package["libaugeas-dev"],
                        Package["libaugeas-ruby"],
                    ],
        context => "/etc/php5/apache2/php.ini",
        changes => [
            "set date.timezone Europe/Rome",
            "set short_open_tag Off",
        ];
    }

}

安装完软件包后,使用 "vagrant ssh" 登录到 vagrant 虚拟机中,然后执行以下命令:
vagrant@precise32:~$ ruby -raugeas -e "puts Augeas.open"
#<Augeas:0xb77a3598>

非常感谢您的提前帮助!


你使用的是哪个版本的Puppet,你的Puppet代码是什么样子的? - raphink
我添加了你所请求的信息。希望这能帮到你... - Francesco Casula
4个回答

8

我在我的Vagrantfile中添加了以下内容,因此augeas开始工作。

如果是ubuntu,在声明puppet provisioner之前,请添加以下行:

config.vm.provision :shell, :inline => "sudo apt-get update && sudo apt-get install puppet -y"

这将更新您的apt packages,并更新puppet客户端,最新版本已经修复了问题。


7
事实证明,在我之前的回答中提到的bug#6907并没有被解决。那个修复程序只适用于在运行过程中提供了相关命令的Puppet providers。
对于Augeas provider,它使用一个名为“features”的内部 Puppet 来检查ruby-augeas库是否可用。特性只会被检查一次并被缓存,所以即使安装了库,该特性仍然会被评估为 false。
我已经将此问题报告给上游bug #14822,并发送了一个pull request进行修复。在应用了该patch后,在测试中我现在可以得到这样的成功运行结果:
notice: /Stage[main]//Package[ruby-augeas]/ensure: created
notice: /Stage[main]//Augeas[test]/returns: executed successfully

我不熟悉Vagrant,但我认为在此期间你需要找到一个解决办法来安装libaugeas-ruby软件包,然后再运行Puppet。


1
我相信这是找到解决方案的方法,但不是解决方案本身。点赞! :) - Francesco Casula

1
阅读了 @m0dlx 的答案后,我检查了 /home/vagrant/postinstall.sh 文件,并发现 Vagrant 使用自己的 Ruby 副本:

# The base path to the Ruby used for the Chef and Puppet gems ruby_home="/opt/vagrant_ruby"

之后,我在 /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/puppet-2.7.19/lib/puppet/provider/augeas/augeas.rb 找到了文件 augeas.rb 并进行了编辑,修改了一行。
confine :true => Puppet.features.augeas?

confine :true => :augeas

简单来说,我部分应用了@m0dlx的补丁

之后这个错误就消失了。


1
在 Puppet 2.7.14 上,这个 应该可以工作,因为提供程序的依赖项只有在需要时才会被评估 - 即当 Puppet 需要运行那些 Augeas 资源时。
没有完整的 Puppet 日志文件来确认,我怀疑这是因为您缺少 Augeas 包和需要它们的 Augeas 资源之间的显式依赖关系。请记住,在清单中按顺序列出资源并不意味着 Puppet 会以这种方式执行它们。
您可以向每个 Augeas 资源添加 requires 参数:
augeas { "php-cli":
    require => [ Package["php5"], Package["libaugeas-ruby"] ],
    # ...
}

或者使用链接语法,以便自动使每个Augeas资源依赖于一个软件包。将其添加到类内的一行中,但不要放在任何资源内部:

Package["libaugeas-ruby"] -> Augeas <| |>

我已经将所有需要的内容添加到augeas指令中,但问题仍然存在。请注意:我已经使用新的requires编辑了主要问题的代码。感谢您的回复... - Francesco Casula
好的,请在安装了libaugeas-ruby之后尝试运行以下命令:ruby -raugeas -e "puts Augeas.open" - Dominic Cleal
添加到主问题:#Augeas:0xb77a3598 - Francesco Casula
在我的另一个答案中提到的内容已经合并,因此从2.7.20或3.0.2开始,您将能够执行此操作。 - Dominic Cleal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接