Puppet onlyif and unless conditional test from boolean data in Hiera and CLI script output

℡╲_俬逩灬. 提交于 2019-12-11 16:00:04

问题


I am running Puppet v3.0 on RHEL 6 and am doing package management via the exec resource. I would like to add a number of control gates into my manifest via onlyif and unless.

First I would like to use booleans as defined in Hiera [ auto lookup function ]. Secondly I would like to use booleans from a bash script running diff <() <().

Im using the following hiera data :

---
my-class::package::patch_now:
 0

my-class::package::package_list:
 acl-2.2.49-6.el6-x86_64
 acpid-1.0.10-2.1.el6-x86_64
...etc

and my manifest are as follows :

# less package.pp
class my-classs::package(
$package_list,
$patch_now,
){
   exec {'patch_packages':
      provider => shell,
      path => [ "/bin/", "/usr/bin/" ],
      logoutput => true,
      timeout => 100,
      command => "yum update -e0 -d0 -y $package_list",
      unless => "/path/to/my-diff.script 2>&1 > /dev/null",
      onlyif => "test 0 -eq $patch_now",
   }
}

How would I test the booleans (0|1) from Hiera and a CLI diff.script with unless and onlyif in the context above ?


回答1:


I'm assuming that you mean to install all listed packages in one sweep if $patch_now is set.

You should not test for that using onlyif. That is meant to verify some state on the agent system. If the master is aware of your data, you should use conditionals in the manifest structure.

if $patch_now {
    exec { ... }
}

But do use true and false instead of 1 and 0 as the value for the flag - both 1 and 0 are equal to true in boolean context!

Your YAML looks funny, anyway.

To define a single value:

my-class::package::patch_now: false

To define an array:

my-class::package::package_list:
  - acl-2.2.49-6.el6-x86_64
  - acpid-1.0.10-2.1.el6-x86_64
  - ...

When you use the array in your class, you cannot just put it in a string such as "yum update -e0 -d0 -y $package_list", for that will expand to "yum update -e0 -d0 -y acl-2.2.49-6.el6-x86_64acpid-1.0.10-2.1.el6-x86_64...", without spaces between the elements.

To concatenate the elements with spaces, use the join function from the stdlib module.

$packages = join($package_list, ' ')
...
"yum update -e0 -d0 -y $packages"

I honestly don't get how your diff <() <() is supposed to work. The whole approach looks a little convoluted. I suspect that with a little tweaking, your diff script could probably perform the updates on its own (so that the exec just runs this script with different parameters).

EDIT after receiving more info in your comment.

To make this work cleanly, I recommend the following.

  1. have Puppet transfer your Hiera data to the agent

    file { '/opt/wanted-packages': content => inline_template('<%= package_list * "\n" %>') }

  2. The diff will then work like you suggested, only simpler.

    diff /opt/wanted-packages <(facter ...)

Just make sure that the exec requires the file and you should be fine.



来源:https://stackoverflow.com/questions/24914087/puppet-onlyif-and-unless-conditional-test-from-boolean-data-in-hiera-and-cli-scr

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!