Кукольный только в том случае, если условный тест на основе логических данных в выходных данных сценария Hiera и CLI

Я запускаю Puppet v3.0 на RHEL 6 и управляю пакетами через ресурс exec. Я хотел бы добавить несколько контрольных ворот в свой манифест через onlyif и unless.

Сначала я хотел бы использовать логические значения, определенные в Hiera [функция автоматического поиска]. Во-вторых, я хотел бы использовать логические значения из сценария bash, работающего под управлением diff <() <().

Я использую следующие данные hiera:

---
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

и мой манифест выглядит следующим образом:

# 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",
   }
}

Как бы я проверил логические значения (0 | 1) из Hiera и diff.script CLI с unless и onlyif в контексте выше?


person fmaree    schedule 23.07.2014    source источник
comment
Есть ли причина, по которой вы предпочитаете exec package { "$pkg_name": ensure => "$pkg_version" } ?   -  person Felix Frank    schedule 24.07.2014
comment
Использование ресурса пакета для одного пакета работает нормально, нет проблем, но это не соответствует нашим требованиям, поскольку это не будет выполняться как одна транзакция. Используя ресурс пакета с 1+ пакетами, вы получите две транзакции, то есть: yum history info | grep -i 'Transaction ID'. Я также считаю, что это не очень хорошо работает, когда есть цепочка зависимостей пакетов, если я должен установить желаемое состояние на ensure => present,. Я использую здесь exec, чтобы установить более 300 пакетов за одну транзакцию, что также быстрее по сравнению с использованием ресурса package для тех же 300+ пакетов.   -  person fmaree    schedule 24.07.2014


Ответы (1)


Я предполагаю, что вы хотите установить все перечисленные пакеты за один раз, если установлено $patch_now.

Вы не должны проверять это, используя onlyif. Это предназначено для проверки некоторого состояния в системе агента. Если мастеру известны ваши данные, вы должны использовать условные операторы в структуре манифеста.

if $patch_now {
    exec { ... }
}

Но используйте true и false вместо 1 и 0 в качестве значения флага - и 1, и 0 равны true в логическом контексте!

В любом случае ваш YAML выглядит забавно.

Чтобы определить одно значение:

my-class::package::patch_now: false

Чтобы определить массив:

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

Когда вы используете массив в своем классе, вы не можете просто поместить его в строку, такую ​​как "yum update -e0 -d0 -y $package_list", потому что она расширится до "yum update -e0 -d0 -y acl-2.2.49-6.el6-x86_64acpid-1.0.10-2.1.el6-x86_64..." без пробелов между элементами.

Чтобы объединить элементы с пробелами, используйте функцию join из модуля stdlib.

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

Честно говоря, я не понимаю, как должен работать ваш diff <() <(). Весь подход выглядит немного запутанным. Я подозреваю, что с небольшой настройкой ваш скрипт diff, вероятно, мог бы выполнять обновления самостоятельно (так что exec просто запускает этот скрипт с другими параметрами).

ИЗМЕНИТЬ после получения дополнительной информации в вашем комментарии.

Чтобы сделать эту работу чистой, я рекомендую следующее.

  1. попросите Puppet передать ваши данные Hiera агенту

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

  2. Тогда diff будет работать так, как вы предложили, только проще.

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

Просто убедитесь, что exec требует file, и все будет в порядке.

person Felix Frank    schedule 23.07.2014
comment
Привет, Феликс, я попробовал подход if $patch_now { exec { ... } }. Однако по договоренности я не могу использовать require => Exec['...'], с другого ресурса. Думаю, я нашел работоспособное решение с логическими данными Hiera, заменив test 0 -eq $patch_now", на onlyif => "echo $patch_now", в качестве одного из триггеров на exec {'patch_packages':. - person fmaree; 24.07.2014
comment
Что касается diff и my-diff.script, у меня есть фактор, который создает список всех RPM, установленных на узле, затем у меня есть список RPM с желаемым состоянием в Hiera, и я сравниваю два списка в форме diff <(facter pkg_list) <(hiera data), который отлично работает с CLI, поэтому, если два списка не совпадают, тогда diff вернет 1. Я хотел использовать это возвращенное логическое значение из моего скрипта в качестве контрольного элемента только если и если. - person fmaree; 24.07.2014
comment
echo $patch_now всегда будет возвращать 0, то есть true. Возможно, вы захотите require Class['my-classs::package'], это чище и безопаснее. - person Felix Frank; 24.07.2014