Назад | Перейти на главную страницу

Марионетка: переместить файл в другое место в зависимости от наличия каталога.

У меня такая конфигурация:

file { 
     "/tmp/apc.ini":
     source => "puppet:///modules/uc/php/apc.ini",
     require => Package["php-apc"]
  } 

  exec {
    "Add apc.ini to php mods-available":
    command => 'mv /tmp/apc.ini /etc/php5/mods-available/apc.ini',
    onlyif =>  "test -d /etc/php5/mods-available",
    require => File["/tmp/apc.ini"]
  }

  exec { 
    "Add apc.ini to php conf.d":
    command => 'mv /tmp/apc.ini /etc/php5/conf.d/apc.ini',
    unless =>  "test -d /etc/php5/mods-available",
    require => File["/tmp/apc.ini"]
  } 

Я хотел бы иметь возможность упростить это, чтобы файл /tmp/apc.ini не создавался каждый раз, когда я запускаю puppet agent --test

На данный момент я получаю следующий результат:

info: Retrieving plugin
info: Loading facts in /var/lib/puppet/lib/facter/root_home.rb
info: Loading facts in /var/lib/puppet/lib/facter/concat_basedir.rb
info: Loading facts in /var/lib/puppet/lib/facter/postgres.rb
info: Loading facts in /var/lib/puppet/lib/facter/puppet_vardir.rb
info: Caching catalog for frontapp0.demo.infra.universcine.com
info: Applying configuration version '1376302253'
notice: /Stage[main]/Uc::Role::Php/File[/tmp/apc.ini]/ensure: defined content as '{md5}e5f5a158bd83469ce031b20ec72ce717'
notice: /Stage[main]/Uc::Role::Php/Exec[Add apc.ini to php mods-available]/returns: executed successfully
notice: Finished catalog run in 36.12 seconds

Что я могу попробовать?

ОБНОВИТЬ Цель состоит в том, чтобы иметь apc.ini либо в доступных модах, либо в conf.d, в зависимости от того, существует первый или нет.

Простой способ добиться этого - развернуть настраиваемый факт. Если вы используете puppet-stdlib модуль, вы можете писать собственные факты на выбранном вами языке, перетащив исполняемый скрипт в /etc/facter/facts.d (видеть Эта статья подробнее). Например, если вы создали скрипт /etc/facter/facts.d/apc_ini_path со следующим содержимым (и убедитесь, что он исполняемый):

#!/bin/sh
if [ -d /etc/php5/mods-available ]; then
  echo "apc_ini_path=/etc/php5/mods-available"
else
  echo "apc_ini_path=/etc/php5/conf.d/"
fi

Тогда вам будет доступен факт apc_ini_path, и вы сможете сделать это:

file { "$apc_ini_path/apc.ini":
    source => "puppet:///modules/uc/php/apc.ini",
    require => Package["php-apc"]
}

Конечно, если вам нравится Ruby, вы также можете просто вставить факт Ruby в YOURMODULE/lib/facter/yourfact.rb используя представленные примеры в той же статье. Они предоставляют образец факта о Ruby, который довольно тривиален:

# hardware_platform.rb

Facter.add("hardware_platform") do
  setcode do
    Facter::Util::Resolution.exec('/bin/uname -i')
  end
end

Это должно быть довольно легко заменить проверкой существования каталога.