В одной из предыдущих статей я описал процесс установки и настройки Puppet Server (он же Puppetmaster). Сейчас же хочу написать небольшую заметку по установке и настройке Puppet Dashboard — это весьма приятное дополнение к Puppet. Представляет из себя WEB-консоль для мониторинга применения манифестов и визуализации конфигурации вцелом.
Устанавливать буду на том же сервере где настраивал Puppetmaster. Поехали?
Репозитарий Puppet Labs у меня уже добавлен, тем кто настраивает на отдельном сервере — его нужно добавить. Повторюсь на всяк случай:
puppet:~$ sudo rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm
Это не единственный необходимый репозиторий, забегая наперед скажу что нам нужен еще и mysql-server. Я предпочитаю mariadb вариант, но в официальных репах CentOS 6.6 он слегка «протухший», поэтому я добавил еще один репозитарий — для MariaDB. Если вас не напрягает протухлость mysql из оф реп CentOS — пропустите данный шаг. Итак, сначала создаем файлик /etc/yum.repos.d/mariadb-55.repo:
puppet:~$ sudo touch /etc/yum.repos.d/mariadb-55.repo
Открываем данный файл любым текстовым редактором (vi, vim, nano, mcedit …) и добавляем вот что:
# MariaDB 5.5 CentOS repository list - created 2015-03-30 10:48 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
Теперь установим все необходимые пакеты:
puppet:~$ sudo yum install MariaDB-server puppet-dashboard
Все пакеты установлены, начинаем настройку. Начнем с mariadb.
Копируем заготовку конфига mysql:
puppet:~$ sudo cp /usr/share/mysql/my-medium.cnf /etc/my.cnf.d/server.cnf
Тюнинг mysql под разные задачи — это отдельная тема. В данном случае нам нужно только добавить вот такую опцию в конфиг /etc/my.cnf.d/server.cnf:
Добавляем в автозагрузку и стартуем сервис:
puppet:~$ sudo systemctl enable mariadb
puppet:~$ sudo systemctl start mariadb
Задаем пароль учетки root в mysql:
puppet:~$ sudo mysqladmin -u root password '_my_root_mysql_pass_here_'
Заходим в mysql и готовим базу:
puppet:~$ mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.41-MariaDB MariaDB Server
Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> CREATE DATABASE dashboard CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> CREATE USER 'dashboard'@'localhost' IDENTIFIED BY 'dash_pass_here';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON dashboard.* TO 'puppet_dashboard'@'localhost';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> quit
Bye
puppet:~$
На этом MySQL можно считать подготовленным. Мы имеем базу, пользователя и пароль для базы.
Настройка подключения дашборда к этой базе:
puppet:~$ cd /usr/share/puppet-dashboard
Тут нас интересует файлик config/database.yml Это конфиг подключения Puppet Dashboard к MySQL DB. Заполняем согласно только что созданной БД ( проще говоря прописываем название, имя пользователя, пароль для подключения к базе mysql)
Меня интересует только секция produclion. Разработкой я заниматься не собираюсь, в любом случае добавить в будущем данные базы не составит труда.
Итак, что у меня получилось с данным конфигом:
production:
database: dashboard
username: dashboard
password: dash_pass_here
encoding: utf8
adapter: mysql
Что дальше? Пробуем проинитить базу:
puppet:/usr/share/puppet-dashboard$ sudo -u puppet-dashboard rake RAILS_ENV=production db:migrate
Ха! Поймал ошибку! У меня mysql datadir не стандартный, поэтому вот (если у вас все стандартно — то команда отработает на ура, пропустите следующий шаг):
puppet:/usr/share/puppet-dashboard$ sudo -u puppet-dashboard rake RAILS_ENV=production db:migrate --trace
(in /usr/share/puppet-dashboard)
config.gem: Unpacked gem daemons-1.0.10 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem json_pure-1.7.7 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem factory_girl-1.3.3 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem rdoc-3.6.1 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem haml-3.1.2 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem rspec-rails-1.3.4 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem will_paginate-2.3.15 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem mocha-0.9.7 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem rack-1.1.6 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem thoughtbot-shoulda-2.10.2 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem rspec-1.3.2 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem sass-3.1.2 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:migrate
rake aborted!
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
/usr/share/puppet-dashboard/vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb:620:in `real_connect'
/usr/share/puppet-dashboard/vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb:620:in `connect'
/usr/share/puppet-dashboard/vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb:203:in `initialize'
...
Пробуем прописать в конфиг … вот что:
production:
database: dashboard
username: dashboard
password: dash_pass_here
encoding: utf8
adapter: mysql
socket: /var/lib/mysql/data/mysql.sock
И еще раз init базы:
puppet:/usr/share/puppet-dashboard$ sudo -u puppet-dashboard rake RAILS_ENV=production db:migrate
(in /usr/share/puppet-dashboard)
.......
Preparing to delete from resource_events
2015-03-31 10:29:13: Deleting 0 orphaned records from resource_events
Deleting 100% |#########################################################################################################################| Time: 00:00:00
-- execute("ALTER TABLE reports ADD CONSTRAINT fk_reports_node_id FOREIGN KEY (node_id) REFERENCES nodes(id) ON DELETE CASCADE;")
-> 0.0033s
-- execute("ALTER TABLE resource_events ADD CONSTRAINT fk_resource_events_resource_status_id FOREIGN KEY (resource_status_id) REFERENCES resource_statuses(id) ON DELETE CASCADE;")
-> 0.0029s
-- execute("ALTER TABLE resource_statuses ADD CONSTRAINT fk_resource_statuses_report_id FOREIGN KEY (report_id) REFERENCES reports(id) ON DELETE CASCADE;")
-> 0.0031s
-- execute("ALTER TABLE report_logs ADD CONSTRAINT fk_report_logs_report_id FOREIGN KEY (report_id) REFERENCES reports(id) ON DELETE CASCADE;")
-> 0.0029s
-- execute("ALTER TABLE metrics ADD CONSTRAINT fk_metrics_report_id FOREIGN KEY (report_id) REFERENCES reports(id) ON DELETE CASCADE;")
-> 0.0027s
== AddReportForeignKeyConstraints: migrated (0.0304s) ========================
== RemoveUrlFromNodes: migrating =============================================
-- remove_column(:nodes, :url)
-> 0.0028s
== RemoveUrlFromNodes: migrated (0.0030s) ====================================
** Invoke db:schema:dump (first_time)
** Invoke environment
** Execute db:schema:dump
puppet:/usr/share/puppet-dashboard$
Отработала командочка отлично!
Пробуем запустить сервис puppet-dashboard:
puppet:/usr/share/puppet-dashboard$ sudo service puppet-dashboard start
Starting Puppet Dashboard: config.gem: Unpacked gem daemons-1.0.10 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem json_pure-1.7.7 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem factory_girl-1.3.3 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem rdoc-3.6.1 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem haml-3.1.2 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem rspec-rails-1.3.4 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem will_paginate-2.3.15 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem mocha-0.9.7 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem rack-1.1.6 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem thoughtbot-shoulda-2.10.2 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem rspec-1.3.2 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
config.gem: Unpacked gem sass-3.1.2 in vendor/gems has no specification file. Run 'rake gems:refresh_specs' to fix this.
=> Booting WEBrick
=> Rails 2.3.17 application starting on http://0.0.0.0:3000 [ OK ]
puppet:/usr/share/puppet-dashboard$
Поидее запустилась, слушается ли порт 3000?
puppet:/usr/share/puppet-dashboard$ sudo netstat -lnp |grep 3000
tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 12269/ruby
puppet:/usr/share/puppet-dashboard$
Слушается! Если есть firewall — добавляем правило для порта TCP/3000:
# Puppet Dashboard
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3000 -j ACCEPT
если нет просто пробуем браузером зайти на puppet-server порт 3000, в моем случае URL выглядит так: http://puppet.intranet:3000/
Должны увидеть вот что:

Как видим никакой статистики тут пока нет, все по нулям. Для того чтобы связать puppetserver и puppet agents/dashboard нужно подправить их конфиги.
1. На puppetmaster в конфиге /etc/puppet/puppet.conf, точнее в секции [master] указать:
[master]
reports = store, http
reporturl = http://puppet.intranet:3000/reports/upload
и перегрузить puppetmaster:
puppet:~$ sudo service puppetmaster restart
2. Еще перегрузим сервисы dashboard и puppet-dashboard-workers:
puppet:~$ sudo service puppet-dashboard-workers start
puppet:~$ sudo service puppet-dashboard restart
Не забываем добавить нужные сервисы в автозапуск:
puppet:~$ sudo chkconfig puppet-dashboard on
puppet:~$ sudo chkconfig puppet-dashboard-workers on
Теперь дополнительный параметр для puppet agent.
1. В конфиге /etc/puppet/puppet.conf, точнее в секции [agent] каждого puppet agent-a указываем:
2. перегружаем puppet agent:
agent01:~$ sudo service puppet restart
Stopping puppet agent: [ OK ]
Starting puppet agent: [ OK ]
agent01:~$
Ну вот, сервисы подстроили …
Пробуем зайти еще раз по URL http://puppet.intranet:3000/ Поидее увидим уже и кой какую статистику с добавленными нодами:

Фух … радуемся 🙂
Хай щастить!