I tried the following in 2.7.11-1ubuntu2.3. And got the following error: err: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not match $(pecl at /etc/puppet/modules/php5/manifests/init.pp:90 on node xxxx.

Any idea how I can run commands?

On client,

puppet agent --test

On master

    exec { "pecl_memcache" :
            provider => shell,
            command  => "if [ -n "$(pecl install memcache | egrep fail )" ]; then echo y | pecl install memcache-3.0.8; fi",
            logoutput => true,

1 Answer 1


You'll need to escape those quotes and variables inside the command parameter; they are being evaluated by Puppet instead of by bash.

However, it is cleaner to use onlyif instead of relying on the shell to check output:

exec { "pecl_memcache" :
        provider  => shell,
        command   => "pecl install memcache-3.0.8",
        unless    => "pecl install memcache | egrep fail",
        logoutput => true,

The slight difference here is that unless relies on the exit code of egrep, whereas the -n test just looks for a non-empty string. This should be functionally the same in this case.

  • It seems that the logic is incorrect. Ideally what I need is that if the "install fail" message shows, it means that the package was installed, therefore it should not run the command.
    – Diden
    Aug 2, 2013 at 18:02
  • Change onlyif to unless.
    – Cakemox
    Aug 2, 2013 at 18:11

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.