Posts Tagged ‘ CentOS

zabbix_agentd […]: unable to create mutex for log file

Нежданно-негаданно нарвался на такую ошибку при запуске zabbix-agent (v 2.4.5) в CentOS 7:

zabbix_agentd [50425]: unable to create mutex for log file
zabbix_agentd [50428]: cannot create Semaphore: [28] No space left on device

Решение простое как двери, нужно добавить SysV IPC semaphores.
Дефолтное значение выглядит так:

[admin@mx1 ~]$ sudo sysctl -a |grep sem
kernel.sem = 250    32000   32  128
[admin@mx1 ~]$

Для меня достаточно было сделать вот так:

[admin@mx1 ~]$ sudo sh -c 'echo "kernel.sem = 250 32000 32 256" > /etc/sysctl.d/10-zabbix.conf'
[admin@mx1 ~]$ sudo sysctl -p /etc/sysctl.d/10-zabbix.conf

И пробуем стартонуть …
Читать полностью

CentOS 6/Oracle Linux 6 — Installing VMware Guest Additions

В одной из предыдущих заметок я описал процесс установки VMware Guest Additions для RHEL 7 based дистрибутивов. Сейчас коротко опишу как это делается в RHEL 6 семействе дистрибутивов (CentOS, Oeacle Linux … etc).

Добавляем ключи официального репозитария VMware:

user$ sudo rpm --import http://packages.vmware.com/tools/keys/VMWARE-PACKAGING-GPG-DSA-KEY.pub
user$ sudo rpm --import http://packages.vmware.com/tools/keys/VMWARE-PACKAGING-GPG-RSA-KEY.pub

Добавляем в систему yum репозитарий. Для этого создаем редактором такой вот файл:

user$ sudo vim /etc/yum.repos.d/vmware-tools.repo

И помещаем в него вот что:

[vmware-tools]
name=VMware Tools
baseurl=http://packages.vmware.com/tools/esx/5.5latest/rhel6/$basearch
enabled=1
gpgcheck=1

Сохраняем файлик и поехали дальше … Читать полностью

PXE Boot: Добавляем утилиту Memtest+

Сдох сервак, ругается на память. Нужен Memtest. Решил добавить в свой PXE (я писал ранее статью про настройку PXE Boot) отдельным пунктом Memtest, как оказалось — это весьма просто.

Все действия выполняются на сервере где розвернут TFTP сервис.
Переходим в рутовую директорию TFTP:

cd /var/lib/tftpboot

Создаем отдельную директорию для memtest:

$ sudo mkdir memtest

и переходим в нее:

$ cd memtest

Качаем бинарь memtest-а:

memtest$ sudo wget -c http://www.memtest.org/download/5.01/memtest86+-5.01.bin

в главный конфиг меню нужно добавить вот такой пунктик:

LABEL Memtest
        MENU LABEL Memtest86+
        KERNEL memtest/memtest86+-5.01.bin

Сохраняем конфиг меню и пользуем 🙂

P.S. Оказалось что сервак просто задолбался работать и требовал немного внимания … после чистки, мойки заработал как ни в чем не бывало.

Хай щастить!

CentOS 7/Oracle Linux 7 — Installing VMware Guest Additions

Необходимо установить гостевые дополнения для OS CentOS7 (ничем не отличается от Oracle Linux 7.x)
Приступим! Для этого нам нужны vmware-репозитории для yum. Но чтобы они красиво работали — сначала нужно установить ключи GPG.

Устанавливаем ключи для необходимых репозиториев:

user@red5:~$ sudo rpm --import http://packages.vmware.com/tools/keys/VMWARE-PACKAGING-GPG-DSA-KEY.pub
user@red5:~$ sudo rpm --import http://packages.vmware.com/tools/keys/VMWARE-PACKAGING-GPG-RSA-KEY.pub

Добавляю yum-репозиторий, для этого создаю файлик:

user@red5:~$ sudo vim /etc/yum.repos.d/vmware-tools.repo

и помещаю туда:

[vmware-tools]
name = VMware Tools
baseurl = http://packages.vmware.com/packages/rhel7/x86_64/
enabled = 1
gpgcheck = 1

Теперь установка нужных пакетов:

user@red5:~$ sudo yum install open-vm-tools-deploypkg
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.mirohost.net
 * extras: mirror.mirohost.net
 * updates: mirror.mirohost.net
Resolving Dependencies
--> Running transaction check
---> Package open-vm-tools-deploypkg.x86_64 0:9.4.10-3 will be installed
--> Processing Dependency: open-vm-tools < 9.5 for package: open-vm-tools-deploypkg-9.4.10-3.x86_64
--> Processing Dependency: open-vm-tools >= 9.4 for package: open-vm-tools-deploypkg-9.4.10-3.x86_64
--> Processing Dependency: libmspack for package: open-vm-tools-deploypkg-9.4.10-3.x86_64
--> Running transaction check
---> Package libmspack.x86_64 0:0.0.20040308alpha-2 will be installed
---> Package open-vm-tools.x86_64 0:9.4.0-6.el7 will be installed
--> Processing Dependency: libicuuc.so.50()(64bit) for package: open-vm-tools-9.4.0-6.el7.x86_64
--> Processing Dependency: libicui18n.so.50()(64bit) for package: open-vm-tools-9.4.0-6.el7.x86_64
--> Processing Dependency: libicudata.so.50()(64bit) for package: open-vm-tools-9.4.0-6.el7.x86_64
--> Processing Dependency: libdnet.so.1()(64bit) for package: open-vm-tools-9.4.0-6.el7.x86_64
--> Running transaction check
---> Package libdnet.x86_64 0:1.12-13.1.el7 will be installed
---> Package libicu.x86_64 0:50.1.2-11.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

===============================================================================================================================================================
 Package                                       Arch                         Version                                   Repository                          Size
===============================================================================================================================================================
Installing:
 open-vm-tools-deploypkg                       x86_64                       9.4.10-3                                  vmware-tools                        21 k
Installing for dependencies:
 libdnet                                       x86_64                       1.12-13.1.el7                             base                                31 k
 libicu                                        x86_64                       50.1.2-11.el7                             base                               6.9 M
 libmspack                                     x86_64                       0.0.20040308alpha-2                       vmware-tools                        26 k
 open-vm-tools                                 x86_64                       9.4.0-6.el7                               base                               430 k

Transaction Summary
===============================================================================================================================================================
Install  1 Package (+4 Dependent packages)

Total size: 7.4 M
Installed size: 26 M
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : libmspack-0.0.20040308alpha-2.x86_64                                                                                                        1/5
  Installing : libicu-50.1.2-11.el7.x86_64                                                                                                                 2/5
  Installing : libdnet-1.12-13.1.el7.x86_64                                                                                                                3/5
  Installing : open-vm-tools-9.4.0-6.el7.x86_64                                                                                                            4/5
  Installing : open-vm-tools-deploypkg-9.4.10-3.x86_64                                                                                                     5/5
  Verifying  : open-vm-tools-deploypkg-9.4.10-3.x86_64                                                                                                     1/5
  Verifying  : libdnet-1.12-13.1.el7.x86_64                                                                                                                2/5
  Verifying  : libicu-50.1.2-11.el7.x86_64                                                                                                                 3/5
  Verifying  : libmspack-0.0.20040308alpha-2.x86_64                                                                                                        4/5
  Verifying  : open-vm-tools-9.4.0-6.el7.x86_64                                                                                                            5/5

Installed:
  open-vm-tools-deploypkg.x86_64 0:9.4.10-3                                                                                                                    

Dependency Installed:
  libdnet.x86_64 0:1.12-13.1.el7      libicu.x86_64 0:50.1.2-11.el7      libmspack.x86_64 0:0.0.20040308alpha-2      open-vm-tools.x86_64 0:9.4.0-6.el7    

Complete!
user@red5:~$

Запускаем сервис и добавляем его в автозагрузку:

user@red5:~$ sudo systemctl restart vmtoolsd.service
user@red5:~$ sudo systemctl enable vmtoolsd.service

После этого в VmWare Vsphere Client видим вот такую картинку:
VmWare - Install Guest Additions

Хай щастить!

Zabbix 2.4 и JMX мониторинг Java приложений

Многие кто использует Java приложение знают о такой полезной штуке как JMX. Мне как администратору больше интересен JMX для мониторинга Java-приложений. Мониторим Zabbix-ом, он имеет поддержку JMX в виде отдельного интерфейса, правда для получения данных использует Java Gateway. Что это такое, как настроить … я дальше опишу.
Схема получения данных Zabbix-Server-ом от Java-app в конечном итоге будет выглядеть вот так:

                              / -> Java App1
Zabbix-Server -> Java Gateway --> Java App2
                              \ -> Java App3

Все три компонента могут быть как на одном хосте, так и на разных.
Мне как администратору проще воспринимать Zabbix Java Gateway как некий прокси, который преобразует данные полученные от JMX в формат данных Zabbix и отдает их в Zabbix Server.
Читать полностью

CentOS 6.6 — Puppet Dashboard Install

В одной из предыдущих статей я описал процесс установки и настройки 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:

max_allowed_packet      = 32M

Добавляем в автозагрузку и стартуем сервис:

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/
Должны увидеть вот что:

Puppet Dashboard - First Start

Как видим никакой статистики тут пока нет, все по нулям. Для того чтобы связать 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 указываем:

[agent]
    report = true

2. перегружаем puppet agent:

agent01:~$ sudo service puppet restart
Stopping puppet agent:                                     [  OK  ]
Starting puppet agent:                                     [  OK  ]
agent01:~$

Ну вот, сервисы подстроили …
Пробуем зайти еще раз по URL http://puppet.intranet:3000/ Поидее увидим уже и кой какую статистику с добавленными нодами:

Puppet Dashboard - Working

Фух … радуемся 🙂

Хай щастить!

CentOS 6.6 — Puppet Server (Puppetmaster) Install

С чего начинается сервер? Конечно же с sudo, vim, rsync, mc, screen, ntp, iptables, ssh, selinux
Надеюсь все это у вас установлено и настроено? Тогда поехали дальше!

У компании Puppet Labs есть свой репозитарий для софта, его и будем использовать. Для начала добавим его:

puppet:~$ sudo rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm

Установим puppet-server:

puppet:~$ sudo yum install puppet-server

Настроим основные параметры для сервиса puppetmaster (он же puppet-server):

puppet:~$ sudo vim /etc/sysconfig/puppetmaster

Тут меня интересуют такие опции, я их розкомментировал и чуть подправил:

PUPPETMASTER_MANIFEST=/etc/puppet/manifests/site.pp
PUPPETMASTER_LOG=/var/log/puppet/master.log

Дальше настройка происходит в директории /etc/puppet, для удобства переходим туда:

puppet:~$ cd /etc/puppet/

Смотрим что тут есть:

puppet:/etc/puppet$ ls -l
total 28
-rw-r--r-- 1 root root 4178 Mar 25 16:33 auth.conf
drwxr-xr-x 3 root root 4096 Mar 30 12:21 environments
-rw-r--r-- 1 root root 1462 Mar 25 16:32 fileserver.conf
drwxr-xr-x 2 root root 4096 Mar 25 16:33 manifests
drwxr-xr-x 2 root root 4096 Mar 25 16:33 modules
-rw-r--r-- 1 root root  853 Mar 25 16:32 puppet.conf
puppet:/etc/puppet$

Оглядываясь на некоторый опыт работы с puppet могу сказать что мне не хватает тут директории files, в которой удобно хранить файлики которые буду передавать агентам (различные конфиги, скрипты и тп). Создам ее сразу:

puppet:/etc/puppet$ sudo mkdir files

Ну и сразу настрою раздачу файлов puppetmaster-ом, это делается в конфиге fileserver.conf путем добавления вот таких строчек:

[files]
  path /etc/puppet/files
  allow *

Теперь пропишем все возможные альтернативные DNS имена нашего puppet master-а. Они нужны в случае если есть необходимость генерить корневой сертификат с разными именами сервера. Это не обязательно, но в моем случае нужно было. Поэтому я в конфиге puppet.conf в раздел [main] добавил вот что:

# Master Names for Cert Generate
dns_alt_names = puppet,puppet.intranet,puppet.mycompany.com

И последний штрих — основной манифест, тот что /etc/puppet/manifests/site.pp, пишем туда для начала такое:

node default {
   }

Пробуем запустить сервис puppetmaster, первый раз это делается вот такой командой:

puppet:~$ sudo puppet master --verbose --no-daemonize

Если все настроено верно, то вы увидите много строчек начинающихся словами Info либо Notice — это нормально. Если же будут Error-ы … чтото вы настроили неверно и следует обратить внимание на сообщения — наверняка там будет указано в чем ошибка.
У меня все прошло отлично, остановить сервис можно просто комбинацией Ctrl + C и потом уже стартонуть как положено:

puppet:~$ sudo service puppetmaster start
Starting puppetmaster:                                     [  OK  ]
puppet:~$

Проверим слушается ли порт 8140:

puppet:~$ sudo netstat -lnp |grep 8140
tcp        0      0 0.0.0.0:8140                0.0.0.0:*                   LISTEN      3368/ruby          
puppet:~$

Отлично, порт слушается.
Добавим сервис в автозагрузку:

puppet:~$ sudo chkconfig puppetmaster on

Также стоит добавить правило в iptables чтобы розрешить входящие соединения от агентов на порт 8140. В моем случае правила лежат в /etc/sysconfig/iptables. Я добавил туда строчку перед правилом ssh:

# Puppet Master
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8140 -j ACCEPT

Применим новые правила iptables:

puppet:~$ sudo iptables-restore /etc/sysconfig/iptables

Со стороны сервера мы все необходимые настройки сделали. Но прелесть puppet-а не просто в сервере, а в связке клиент-сервер. Давайте попробуем создать пробный манифест на сервере, добавить клиента и применить к нему созданный манифест.

Да будет агент!
Есть некий другой хост CentOS 6.6, хотим им рулить с помощью puppet — не вопрос. Клиент настраивается очень просто!
Добавляем репозитарий:

agent01:~$ sudo rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm

Установим puppet-agent:

agent01:~$ sudo yum install puppet

Настроим основные параметры для сервиса puppe (он же puppet-agent):

agent01:~$ sudo vim /etc/sysconfig/puppet

Розкомментировал и чуть подправил вот что:

PUPPET_SERVER=puppet.intranet
PUPPET_LOG=/var/log/puppet/puppet.log

Больше никаких настроек не нужно, запускаем сервис:

agent01:~$ sudo service puppet start
Starting puppet agent:                                     [  OK  ]
agent01:~$

И добавляем в автозагрузку сервис puppet:

agent01:~$ sudo chkconfig puppet on

Топаем на сервер и смотрим что там в логах puppetmaster:

puppet:~$ sudo cat /var/log/puppet/master.log
....
Mon Mar 30 13:54:22 +0100 2015 Puppet (notice): agent01.intranet has a waiting certificate request
....

Вот же он, наш агент 🙂 Ждет подтверждения сертификата, нужно подтвердить:

puppet:~$ sudo puppet ca sign agent01.intranet

Теперь он в семье, дружно виляет хвостом и ждем своих манифестов. Давайте сварганим ему рецептик для теста.
Начинать стоит с простого, к примеру хочу применить некоторые параметры sysctl к тестовому хосту agent01, а потом возможно еще к какомуто серверу, или группе серверов. В обычном случае нам нужно зайти на сервер (или группу серверов), создать там файлик в /etc/sysctl.d/some_file.conf и потом применить их командой sysctl -p. Хорошо если у вас 2 или 3 сервера, а если 153? Руки сотрутся по ssh ходить 🙂
С puppet — это раз плюнуть! Хлопотно только на момент внедрения, когда нужно на каждом сервере установить и настроить puppet-agent. Ну вобщем, поехали дальше … Создадим файлик /etc/puppet/files/rh6/sysctl.d/77-tcp.conf с необходимыми конфигами sysctl, для примера вот так:

# TCP Options #
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 720000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_probes = 7
net.ipv4.tcp_keepalive_intvl = 30

Теперь создадим модуль rh6_sysctl, для начала нужна директория:

puppet:~$ sudo mkdir -p /etc/puppet/modules/rh6_sysctl/manifests/

Модули требуют обязательно файлик init.pp, не вопрос! Сделаем /etc/puppet/modules/rh6_sysctl/manifests/init.pp с таким вот манифестом (комментарии к манифесту там же):

class rh6_sysctl {
  # убедиться что директория /etc/sysctl.d существует
  # владелец root:root, права на директорию 755
  file { "/etc/sysctl.d":
        ensure => "directory",
        owner  => "root",
        group  => "root",
        mode   => 755,
  }

  # Зависит от директории File["/etc/sysctl.d"]
  # если директория отсутствует - сначала будет выполнен рецепт ее создания
  # а потом то что тут: создать файлик /etc/sysctl.d/77-tcp.conf, права 644
  # владелец файла root:root
  #содержимое взять с файла /etc/puppet/files/rh6/sysctl.d/77-tcp.conf на puppetmaster
  file { "/etc/sysctl.d/77-tcp.conf":
        mode    => 644,
        owner   => "root",
        group   => "root",
        ensure  => "present",
        source  => "puppet:///files/rh6/sysctl.d/77-tcp.conf",
        require => File["/etc/sysctl.d"],
  }

  # Это чтото вроде подписки на обновление файла /etc/sysctl.d/77-tcp.conf
  # команда "sysctl -p /etc/sysctl.d/77-tcp.conf" выполнится только если файл изменился
  exec { "refresh_sysctl":
        command => "sysctl -p /etc/sysctl.d/77-tcp.conf",
        subscribe => File["/etc/sysctl.d/77-tcp.conf"],
        refreshonly => true,
  }
}

Сложно? Не очень …
Применим к серверу agent01.intranet наш сварганенный на скорую руку модулец rh6_sysctl. Для этого открываем файлик /etc/puppet/manifests/site.pp и пишем туда после node default вот что:

node 'agent01.intranet' {
  include rh6_sysctl
}

Теперь перегружаем puppetmaster

puppet:~$ sudo service puppetmaster restart

А теперь и сервис агента, так как неохота ждать следующего обращения к puppetmaster. По умолчанию агент раз в 30 минут ходит на сервер за рецептами. Но при старте идет сразу же, такчто рестарт сервиса то что нужно при отладке:

agent01:~$ sudo service puppet restart

И смотрим в логи агента:

agent01:~$ sudo cat /var/log/puppet/puppet.log
....
Mon Mar 30 14:03:16 +0000 2015 Puppet (notice): Starting Puppet client version 3.7.5
Mon Mar 30 14:03:18 +0000 2015 /Stage[main]/Rh6_sysctl/File[/etc/sysctl.d]/ensure (notice): created
Mon Mar 30 14:03:18 +0000 2015 /Stage[main]/Rh6_sysctl/File[/etc/sysctl.d/77-tcp.conf]/ensure (notice): defined content as '{md5}5c01b1ec505972bd48f587c7ea5e3d73'
Mon Mar 30 14:03:18 +0000 2015 /Stage[main]/Rh6_sysctl/Exec[refresh_sysctl] (notice): Triggered 'refresh' from 1 events
Mon Mar 30 14:03:18 +0000 2015 Puppet (notice): Finished catalog run in 1.29 seconds
agent01:~$

Убедиться что настройки действительно применились вы можете с помощью sysctl … не буду писать ерунды, как это сделать и так ясно.
Прелесть puppet в том что все рецепты, классы, модули можно компоновать между собой, применять к ноде или группе нод, контролировать состояние с помощью dashboard (опишу чуть позже как настроить). К примеру для начала рекомендую написать набор мелких рецептов по базовой настройке дефолтного сервера (установка неких пакетов необходимых везде: rsync, mc, vim, htop, screen etc… , установка базовых сервисов, подсовывание конфигов, перегрузка, автозагрузка: ntpd, sshd etc … , настройка sudo, создание учеток админов или юзеров, и тд и тп) после этого приступать к написанию более продвинутых манифестов для автоматизации настройки web-server, db-server, ftp-server … etc.

Хай щастить!

CentOS 6.6 — Установка htop

Мдя … кто бы мог подумать что для того чтобы в CentOS установить htop нужно добавить помоечный репозитарий rpmforge … Розбалованный я Debian-ом да бубунтой 🙂
Итак, для установки htop в CentOS 6.6 x86_64 нужно собственно добавить репозитарий:

[black@cent66-01 ~]$ sudo rpm -Uvh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
[sudo] password for black:
Retrieving http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
warning: /var/tmp/rpm-tmp.5mFRTd: Header V3 DSA/SHA1 Signature, key ID 6b8d79e6: NOKEY
Preparing...                ########################################### [100%]
   1:rpmforge-release       ########################################### [100%]
[black@cent66-01 ~]$

После этого обновить информацию о пакетах …
Читать полностью

Java Applications — Создание Init скриптов для Linux

При установке в Linux сторонних приложений написанных на Java возникает множество вопросов, один из них — как удобнее всего управлять запуском/остановкой/перегрузкой таких приложений? В идеале хотелось бы создать init-скрипты и добавить их в init систему Linux. Такой метод самый правильный с точки зрения операционной системы Linux и удобный как для пользователей так и для админов. Но реальность такова что большинство java-приложений распространяются в виде архивов в которых, в лучшем случае, включены скрипты для запуска, настройки, остановки и еще черт знает чего 🙂
В данной статье на примере приложений Pentaho-BI/Pentaho-DI я решил показать как используя java-wrapper создать init-скрипты для CentOS Linux для управления сервисом как от имени обычного пользователя, так и от root-а. Читать полностью

Linux/Unix — App’s debug

На днях прокачал свой скил в Linux 🙂 Как дебажить программу или службу? Проще не придумаешь — используй strace!
Install:

# apt-get install strace

Usage:

$ strace -e trace=open,read,close,connect  -p <pid>
$ strace -e trace=open,read,close,connect  <app>

Читать полностью