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

Использование Puppet для управления командами оболочки

Например, давайте попробуем разрешить Puppet установить opengeo-suite.

Чтобы сделать что-то вроде

wget -qO- http://apt.opengeo.org/gpg.key | apt-key add -
echo "deb http://apt.opengeo.org/suite/v3/ubuntu lucid main" >> /etc/apt/sources.list

мы можем использовать

exec {'getKey':
    command => "wget -qO- http://apt.opengeo.org/gpg.key | apt-key add -",
}

exec {'addRepo':
    command => "echo "deb http://apt.opengeo.org/suite/v3/ubuntu lucid main" >> /etc/apt/sources.list",
}

Вопрос 1: Если мы снова запустим сценарий марионетки, разве wget и echo не будут запущены дважды? У нас будет дублированное репо в /etc/apt/sources.d. Бег package { "opengeo-suite": } дважды не пытается установить пакет дважды, он просто гарантирует, что он установлен.

Вопрос 2: Делать apt-get install opengeo-suite есть несколько предложений для пользовательского ввода. Будет ли Puppet каким-то образом знать, какой ввод будет использоваться по умолчанию, или произойдет сбой?

  1. Если вы не предотвратите это, команды будут запускаться при каждом запуске марионетки, включая несколько записей в sources.list. Этого не должно происходить, поскольку Puppet ожидает, что exec звонки идемпотентны. Один из способов обойти это - создать "проверочные" файлы и запустить exec только если контрольного файла нет. Видеть документ чтобы узнать, как это сделать. Также обратите внимание, что существуют пользовательские модули для поддержки подходящих репозиториев с Puppet.

  2. Я не использовал Puppet в системе на основе apt (пока), но полагаю, что Puppet или модуль apt, который я связал выше, достаточно умен, чтобы справиться с этим. Если не, посмотри это.

Вы можете использовать onlyif в exec. Тест должен вернуть истину, чтобы выполнить команду, в вашем случае см. Ниже (PUBLIC_KEY_ID, это идентификатор ключа поставщика apt)

exec {'getKey':
  command => "wget -qO- http://apt.opengeo.org/gpg.key | apt-key add -",
  onlyif  => "test `apt-key list |grep PUBLIC_KEY_ID | wc -l ` -eq 0"
}

exec {'addRepo':
  command => "echo "deb http://apt.opengeo.org/suite/v3/ubuntu lucid main" /etc/apt/sources.list",
  onlyif  => "test `grep http://apt.opengeo.org/suite/v3/ubuntu /etc/apt/sources.list | wc -l ` -eq 0"
}