Как запустить puppet exec, если условие выполнено?

Просто дам некоторые подробности — сборка на AWS, использование Puppet для обработки DSC, а также загрузка Puppet, чтобы он инициализировал и установил Puppet на вновь подготовленном узле.

Я работаю с Puppet уже некоторое время и обнаружил, что хочу написать модуль, который выполняется только при создании виртуальной машины.

Мой конкретный случай использования заключается в том, что я хочу установить антивирус (в частности, Trend Micro Deep Security) на недавно подготовленный узел автоматически через Puppet.

Сценарию для запуска требуется только загрузка, запуск и пара специальных команд TMDS для активации и т. д.

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

Однако я не думаю, что Puppet «знает» о Trend Micro или о том, как его получить, или URL-адрес и т. д. Поэтому я не могу использовать что-то вроде:

  service { "trend micro":
    ensure => running,
    ensure => present,
  }

Проведя небольшое исследование и просмотрев сообщения в блогах, я знаю, что структура моего код должен быть примерно таким (я знаю, что это неправильно):

exec {'function_name':
  # the script that downloads/installs/activates etc.
  command => '/path/to/script.sh', 
  onlyif  => systemctl service_trendmicro, 
  # which system should return 0 or 1 for pass/fail - I only want it to exec on 0 ofc.
}

Поэтому мой вопрос: как мне собрать это вместе?


person R.Sama    schedule 18.02.2016    source источник


Ответы (2)


Вы можете использовать Puppet для запуска скриптов, как вы это делаете. Однако в итоге вы столкнетесь с теми же проблемами, что и при запуске скриптов без Puppet: их сложно сделать идепотентными, их неудобно обслуживать, и они не переносимы на другие платформы.

Кажется, есть поваренные книги шеф-повара и Ansible Playbooks, предоставленные компанией для установки агента. Это должно дать вам общее представление о том, что делать с Puppet.

Глядя на плейбук Ansible, довольно легко превратить его в эквивалентный код Puppet:

exec {'download Trend RPM':
  command => '/bin/wget https://app.deepsecurity.trendmicro.com:443/software/agent/RedHat_EL7/x86_64/ O /tmp/agent.rpm --quiet',
  creates => '/tmp/agent.rpm',
}
->
package {'ds_agent':
  ensure   => 'installed',
  provider => 'rpm',
  source => '/tmp/agent.rpm',
}
~>
service {'ds_agent':
  ensure => running,
  enable => true,
}

Я только что быстро проверил виртуальную машину CentOS 7, и мне показалось, что она работает:

Notice: Compiled catalog for centos7.vm in environment production in 1.06 seconds
Notice: /Stage[main]/Main/Exec[download Trend RPM]/returns: executed successfully
Notice: /Stage[main]/Main/Package[ds_agent]/ensure: created
Notice: /Stage[main]/Main/Service[ds_agent]/enable: enable changed 'false' to 'true'
Notice: /Stage[main]/Main/Service[ds_agent]: Triggered 'refresh' from 1 events
Notice: Applied catalog in 8.45 seconds

Я бы порекомендовал заглянуть в существующий плейбук Ansible и посмотреть, как выполнить остальные этапы настройки: https://github.com/deep-security/ansible/blob/master/playbook/

person Peter Souter    schedule 19.02.2016
comment
Эй, спасибо за ответ! Я не проверял на выходных :) Я новичок в Puppet, но это выглядит более чем выполнимо - дайте мне попробовать и посмотреть, смогу ли я заставить его работать в Puppet! Сообщу, когда протестирую. Спасибо приятель! Могу я просто проверить, правильно ли я это понял? Exec, очевидно, загружает rpm агента, но будет ли это происходить при каждом запуске? Или create =› означает, что он проверит, что его там нет, перед загрузкой? В Puppet, даже если это не распознанный пакет, мы все равно можем создать новый, и Puppet будет искать этот пакет с... - person R.Sama; 22.02.2016
comment
(продолжение из предыдущего) указанное ему местоположение (в данном случае /tmp/agent.rpm)... Извините за все вопросы, я пытаюсь понять это, я пришел из опыта ООП , и хочу попробовать и сравнить вещи с тем, что я уже знаю! Спасибо :) редактировать: О, и спасибо, что связали меня с кулинарными книгами Ansible/Chef, я понятия не имел, что структуру кода можно (по крайней мере частично) перенести с небольшой работой. Очень очень полезно. - person R.Sama; 22.02.2016
comment
Эй, эта реализация сработала отлично! Я просмотрю кулинарную книгу Ansible и посмотрю, не смогу ли я придумать что-нибудь еще! большое спасибо за это! Решено! :) - person R.Sama; 22.02.2016
comment
Ага! Полный список всех параметров находится здесь: docs.puppetlabs.com/puppet/latest /reference/type.html, я бы также рекомендовал посмотреть на puppetlabs.com/download -learning-vm обучающая виртуальная машина, обучающая некоторым понятиям! :) - person Peter Souter; 24.02.2016

Взгляните на этот модуль: https://github.com/echocat/puppet-redis

Он устанавливает Redis из исходного кода. Итак, он загружает, устанавливает, настраивает и запускает службу. По сути, его функциональность эквивалентна той, которую вы ищете.

person dwerder    schedule 18.02.2016
comment
Эй, спасибо, но я не совсем уверен, что это та реализация, которая лучше всего будет работать в среде... - person R.Sama; 22.02.2016