Puppet

Материал из ALT Linux Wiki
Перейти к: навигация, поиск
Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.


Черновик[править]

Установка puppet agent и puppet server[править]

Необходимо установить следующие пакеты:

# apt-get install puppet puppet-server

Настройка puppet master[править]

Прежде всего нужно настроить ваш dns сервер на резолва адресов. Для примера можно внести настройки в файл hosts (/etc/hosts):

127.0.0.1       localhost.localdomain localhost
10.10.3.107     puppetserver
10.10.3.5       puppetclient

После установки всех пакетов настройки dns, конфигурационные файлы puppet находятся в директории /etc/puppet/ Файл настройки - puppet.conf:

[main]
certname=puppetserver
server=puppetserver

[master]
certname=puppetserver
environment=production

В секции main находятся глобальные настройки сервиса, а в секции master, находятся настройки сервера puppet.
Параметр server говорит клиенту, с каким сервером работать. Параметр certname задает имя с которым клиент будет ображаться к серверу. Запуск сервисов:

# systemctl start puppet
# systemctl start puppetmaster

Для подписи всех сертификатов необходимо выполнить команду:

# puppet cert sign –all

Настройка агента puppet[править]

Для того, чтобы натсроить агент puppet, нужно установить пакет puppet:

# apt-get install puppet 

Для примера так же на клиенте был настроен файл hosts, как показано выше.
Файл настроек агента puppet.conf выглядит следующим образом:

[agent]
server=puppetserver

Для проверки работы агента необходимо выполнить команду:

# puppet agent -t

Создание манифестов и модулей puppet[править]

Для создания манифестов и модулей для puppet необходимо наличие следующих каталогов в /etc/puppet:

code
modules
environments
manifests

Внесем корректировки в файл puppet.conf:

[master]
environment=production

Это добавляет окружение production в сервер.

Внимание! puppetmaster берёт информацию о манифестах с /etc/puppet/environments/production/manifests.


В папке /etc/puppet/environments/production/manifests,необходимо создать файл site.pp
Содержание файла:

file { "/etc/passwd":
owner => "root",
group => "bin",
mode => "644",
}

Все обновление манифестов происходят автоматически. На агентах опрос сервера на предмет новых манифестов составляет 30 минут.
Для ускорения обновления конфигурации на агенте используется команда:

# puppet agent -t --debug

Ключ --debug используется для наглядной демонстрации применения манифеста на агенте.

Проверка выполнения конкретного манифеста:

# puppet apply /etc/puppet/environments/production/manifests/site.pp
Notice: Compiled catalog for puppet in environment production in 0.02 seconds
Notice: /Stage[main]/Main/File[/etc/passwd]/group: group changed 'root' to 'bin'
Notice: Applied catalog in 0.03 seconds
puppetd[править]
TODO:
  • В соответствии с http://reductivelabs.com/trac/puppet/wiki/CertificatesAndSecurity при первом запуске puppetd клиента, необходимо обратиться к серверу с запросом подписания сертификата. Для этого puppetd должен быть запущен с ключом --waitforcert. Предлагаю исправить /etc/init.d/puppetd -- добавить режим sign, при котором puppetd стартует с этой опцией.
  • Необходимо добавить в /etc/init.d/puppetd проверку на задание переменной PUPPET_SERVER, чтобы при старте происходило подключение к последнему. А то висит процесс, вроде всё работает, но на самом деле клиент ничего не делает -- не знает ip-сервера.


Пример использования Puppet + PuppetDB для инвентаризация управляемых машин[править]

Рассмотрим на примере. Допустим системный администратор имеет три slave сервера (10.0.1.1, 10.0.2.1, 10.0.3.1) и один master (10.1.0.1). Ему необходимо в автоматическом режиме узнать серийный номер каждой машины и закешировать результаты PuppetDB. Для этого первоначально необходимо настроить Puppet, как на сервере, так и на управляемых машинах (агентах). Добавим в /etc/hosts (как на master машине так и на агентах) наши адреса:

10.1.0.1    master.example.com    puppet
10.0.1.1    agent1.example.com
10.0.2.1    agent2.example.com
10.0.3.1    agent3.example.com

Установим необходимые пакеты на master сервере,

# apt-get install puppet puppet-server postgresql10-server postgresql10-contrib puppetdb-terminus

..и на агентах:

# apt-get install puppet

Сконфигурируем Puppet, изменив содержимое /etc/puppet/puppet.conf на следующее:

[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/etc/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/facts.d

[master]
certname=puppet
dns_alt_names=puppet,master.example.com
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY

Если Puppet уже присутствовал в систме то:

# rm -rf /etc/puppet/ssl

SSL сертификаты Puppet сгенерирует самостоятельно при запуске:

# systemctl start puppetmaster
# systemctl start puppet

Настроим агенты, указав адрес master сервера в /etc/puppet/puppet.conf:

[agent]
server=master.example.com

После чего можно сгенерировать сертификаты на агентах:

# rm -rf /etc/puppet/ssl/
# puppet agent -t

После того, как сертификаты будут готовы, их можно проверить в очереди на подпись на master сервере,

# puppet cert sigb -all

..для подписи всех сразу:

# puppet cert sigb --all

Теперь мы имеем slave сервера (agent1, agent2, agent3) под управлением master сервера. Для решения задачи нам понадобится puppetdb, для кеширования результатов запросов. Более подробно о настройках Puppetdb и PostgreSQL. Все настройки базы данных производятся только на master сервере. Инициализируем базу данных postgresql и запустим службу:

# /etc/init.d/postgresql initdb
# systemctl start postgresql

Создадим нового пользователя, базу данных и установим необходимый плагин:

# createuser -U postgres -DRSP puppetdb
# createdb -U postgres -E UTF8 -O puppetdb puppetdb
# psql -U postgres puppetdb -c 'create extension pg_trgm'

Сделаем базу доступной по сети:

# echo "listen_addresses = 'localhost'" >> /var/lib/pgsql/data/postgresql.conf
# echo "host puppetdb puppetdb 127.0.0.1/32 md5" >> /var/lib/pgsql/data/pg_hba.conf
# systemctl restart postgresql

Важным условием корректной работы является синхронизация времени, как на master сервере, так и на агентах:

# systemctl enable ntpd
# systemctl start ntpd

Для настройки PuppetDB необходимо отредактировать конфигурационные файлы /etc/puppetdb/conf.d/database.ini и /etc/puppetdb/conf.d/jetty.ini в соответствии с параметрами, которые были указаны при конфигурировании базы данных и инструкцией Puppetdb. После настройки PuppetDB, необходимо сообщить Puppet, что мы хотим кешировать результаты запросов. Добавим в конфигурационный файл, в секцию [master] /etc/puppet/puppet.conf, следующее,

pluginsync = true
storeconfigs = true
storeconfigs_backend = puppetdb
reports = store,puppetdb

..так же создадим /etc/puppet/routes.yaml и /etc/puppet/puppetdb.conf со следующим содержимым:

/etc/puppet/routes.yaml

---
master:
  facts:
    terminus: puppetdb
    cache: yaml

/etc/puppet/puppetdb.conf

[main]
pluginsync = true
storeconfigs = true
storeconfigs_backend = puppetdb
reports = store,puppetdb

Запустим PuppetDB и перезапустим puppet-сервисы:

# systemctl start puppetdb
# systemctl restart puppetmaster
# systemctl restart puppet

После того как настроены Puppet и PuppeDB, можно перейти к написанию манифеста для определения серийного номера агентов. Пример получения серийного номера машины:

exec { 'serial':
	command => 'dmidecode -t system | grep Serial'
}

Так же можно указать агентов, на которых будет запускаться манифест:

node 'agent1', 'agent2', 'agent3' {
	exec { 'serial':
		command => 'dmidecode -t system | grep Serial'
	}
}

node default {}

Агенты раз в 30 минут опрашивают сервер и выполняют адресованные им манифесты. Периодичность опросов можно изменить в манифесте. Для принудительного запуска манифеста, необходимо выполнить на агенте:

# puppet agent --test --debug

Готовые манифесты[править]

Прописывание репозитория[править]

exec { 'repo-clean':
    command => '/usr/bin/apt-repo rm all',
}
exec { 'repo-add-p8':
    command => '/usr/bin/apt-repo add http://10.10.3.77/repo/p8',
}
exec { 'repo-add-p8-arepo':
    command => '/usr/bin/apt-repo add "rpm http://10.10.3.77/repo/p8 x86_64-i586 classic"',
}
exec { 'repo-add-extra':
    command => '/usr/bin/apt-repo add "rpm http://10.10.3.77/repo/extra x86_64 extra"',
}

Обновление системы[править]

Для обновления системы каждый день в промежутке между 5-8 утра можно использовать следующий манифест:

schedule { 'update':
    range  => '5 - 8',
    period => daily,
    repeat => 1,
}
exec { 'apt-update':
    command => '/usr/bin/apt-get update',
}
exec { 'apt-distupgrade':
    require => Exec['apt-update'],
    command => '/usr/bin/apt-get dist-upgrade -y',
    schedule => 'update',
}

Советы[править]

  • Для command указывайте полный путь к выполняемому файлу;