понедельник, 27 мая 2013 г.

puppet not start service

if you define service

service{"logstash":
    enable => true,
    ensure => true
  }

but during execution puppet you receive on service logstash status, and not started
CAUSE is status return 0 instead of 3(for stopped)
simple fix is

status)
     echo -n "$DESC"
     status -p $PID_FILE
+    exit $?
     ;;
   *)


in your init script

четверг, 23 мая 2013 г.

in `expand_path': non-absolute home

in `expand_path': non-absolute home
error can happend in passenger installation process

lib/phusion_passenger/platform_info/ruby.rb:198:in `expand_path': non-absolute home (ArgumentError)


simple fix - define statis path for HOME
export HOME=/tmp

четверг, 9 мая 2013 г.

periodic task on ruboto

For create periodic task on android by ruboto require create handler and assign task with delay in milliseconds (handl.postDelayed(method_for_eecution, 1000)).
And each time when finished  task - assing new(second line in method test_meth)

def onCreate(bundle)
  ....
  handler = Java::android.os.Handler.new
  test_meth(handler)
end

def test_meth(handl)
    toast "test #{Time.now}"
     handl.postDelayed(test_meth(handl), 1000)
end


 And more clear then java code wich was before.


понедельник, 6 мая 2013 г.

vagrant + libvirt + nested virtualization

Уже расписывал как хорош vagrant и как он становится на два порядка лучше с libvirt. Но есть ньюанс - в либвирте столько функций, что плагин для вагранта еще пилить и пилить. Сегодня добавлена одна из самых вкусных - вложенная виртуализация.
Для тех ,кто не в теме: это возможность запускать виртуальные машины внутри виртуальной машины. Я проверял на 3 уровнях вложенности - работает. Хотя больше двух и не надо.
Вся эта магия доступна на процессорах с поддержкой набора команд vmx от интела. Подробности расписаны тут.

Для начала надо включить опцию для модуля kvm_intel

rmmod kvm_intel
mod_probe kvm_intel nested=1


И в опциях vagrant-libvirt добавить libvirt.nested = true
Получится примерно так:

config.vm.provider :libvirt do |libvirt|
    libvirt.driver = "qemu"
    libvirt.host = "example.com"
    libvirt.connect_via_ssh = true
    libvirt.username = "root"
    libvirt.storage_pool_name = "default"
    libvirt.nested = true
  end

Теперь все новые виртуальные машины будут создаваться с поддержкой встроенной виртуализации.
Проверить можно посмотрев опции процессора вирт машины cat /proc/cpuinfo | grep -i vmx
Если нашлось слово vmx - значит можно запускать виртуалку внутри виртулки. Или подключаться использую virt-manager или vagrant c vagrant-libvirt и запускать используя эти инструменты.

воскресенье, 5 мая 2013 г.

Как работал ovirt в 2008 пока его не переписали на мерзкой яве.

Начало использования
Устанавливаем конфиг репозитория ovirt
rpm -ih http://ovirt.org/repos/ovirt/ovirt-release-LATEST.noarch.rpm
Обновляемся используя новый репозиторий
yum update --enablerepo=ovirt -y
либо можно подредактировать конфиг /etc/yum.repos.d/ovirt.repo
и заменить enabled=0 на enabled=1 (теперь всегда по умолчанию он у нас включен)
yum update -y

И ставим необходимые нам пакеты (может занять до 500мб)
yum install --enablerepo=ovirt ovirt-appliance ovirt-docs ovirt-node virt-viewer-plugin qemu-img

и перезапускаем libvirtd
service libvirtd restart
При условии что обородувание поддерживает виртуализацию и подгружен модуль kvm начинаем ставить виртуальный сервер, можно сказать управляющий - все управление происходить будет с него.
Интерфейс которым подключены к локальной сети eth0 - его и укажем
create-ovirt-appliance -e eth0
После этого сделайте
ifdown eth0
ifconfig eth0 /<маска сети> up

Теперь запустим виртуальную машину
virsh start ovirt-appliance

Так же можно понаблюдать за процессом загрузки (при желании даже вмешаться) запустив

virt-viewer ovirt-appliance

Пароль root по умолчанию ovirt.

Адрес панели управления, по умолчанию 192.168.50.2/ovirt
Доступ в панель ovirtadmin/ovirt

Не советую переименовывать hardware pool с именем default. Оказывается что в коде жестко прописано DEFAULT_POOL_NAME = "default". Можете догадаться как я это узнал... конечно переименовал и потом искал в чем ошибка:)

Если хочется покопаться в коде то желательно получить документацию
У меня встретился досадный баг "uninitialized constant RubyToken::AlreadyDefinedToken"
По первому же запросу гугл подсказал что необходимо в файле Rakefile переместить "require 'gettext/utils'" в задачи только нуждающиеся в нем (make_mo и update_po).

Генерируем документы по коду
rake doc:app.

При неудачном завершении работы виртуальной машины на которой крутился ovirt лучше всего - перед загрузкой успеть в меню загрузчика grub
нажать 'e'
выбрать вторую строку и опять 'e'
написать через пробел цифру 1
потом enter и 'b'
таким образом мы загрузимся в singlemode режиме
и запустим проверку диска fsck /dev/sda2
потом просто перезагружаемся /sbin/init 6
должно нормально загрузится

#################редактировать###################
Общение между физическими серверами происходит (как я понял ) по протоколу amqp используя демон qpid.
На добавляемой физической ноде необходимо запустить
ovirt-install-node stateful
также сделал

create-ovirt-appliance -e eth1
затем понял что в сети должны видеть друг друга не только физические ноды но и виртуальная управляющая
потому подключаем ovirtbr0 к локальной сети
сначала brctl addif ovirtbr0 eth0 добавляем интерфейс к мосту
затем ifconfig eth0 down ; ifconfig eth0 0.0.0.0/0 up; что б могли с любых подсетей получать пакеты
так же и на второй ноде
проверив все пингом пытаемся найти в списке необходимые нам физические сервера
################################################

При запуске libvirtd он рассылает multicast dns (224.0.0.251) сообщение о том что запущен libvirt. Ответственный за это демон avahi.

На управляющем сервере в директории рельсов лежит host-browser.rb он слушает на 12120 порту тср запросы с управляемых физических узлов.

На физ узлах есть скрипт /etc/init.d/ovirt ставим аргумент старт и он посылает сообщения на узел с которого грузился

/usr/sbin/ovirt-identify-node отправляет на указаный сервер информацию о узле
после того как он отработает - создается запись
теперь найти как она должна создаваться автоматом

На управляемой ноде в файле /etc/init.d/ovirt-functions определяются основные конфигурационные параметры - в частности порт и сервер управления



Vagrant + libvirt

There are many virtualization technologies.
Sure the best is KVM!!!
But libvirt can  manage different virtualization technologies.

Next step is provide ability test and develop software by many virtual machines.
and vagrant is amazing for it(Thanks Mitchell).

Vagrant's plugin for libvirt 
By this plugin you can test VM localy and remotely(also remotely on many servers).
require only change Vagrantfile


Vagrant.configure("2") do |config|
  config.vm.define :test_vm do |test_vm|
    test_vm.vm.box = "centos64"
  end

  config.vm.provider :libvirt do |libvirt|
    libvirt.driver = "qemu"
    libvirt.host = "example.com"
    libvirt.connect_via_ssh = true
    libvirt.username = "root"
    libvirt.storage_pool_name = "default"
  end
end


Put your ssh public key to remote server and start libvirtd on it.
I use this tools for test multinodes cloud.
Lets together say THANKS to Lukas Stanek

P.S. Virtualbox is crap, and i was happy remove it from my laptop.

суббота, 4 мая 2013 г.

escape string

for bash
$(printf '%q' $1)

For ruby
%q{string!#$%}

firewalld and port forwarding

for forwarding from port 8080 to virtual machine with ip 192.168.122.126


firewall-cmd --zone=public --add-forward-port=port=8080:proto=tcp:toaddr=192.168.122.126

simple client for hornetQ for testing


I like rabbitmq, but for java projects nice choice is hornetq embedded in jboss.
The best way for testing is write code on ruby.
I use library jruby-hornetq


# tested by jruby
require 'rubygems'
require 'hornetq'

connection = HornetQ::Client::Connection.new(:uri => 'hornetq://localhost/')
session = connection.create_session(:username=>'guest',:password=>'secret')


producer = session.create_producer('jms.queue.QeueuName123')
message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,false)
message.body_buffer.write_string('Hello World')
producer.send(message)
session.close
connection.close


java-freek-way is not for me :)

среда, 17 апреля 2013 г.

autoexpect

Expect - tool for automatically run interactive scripts.
Autoexpect - tool for generate expect script.
Generated code is dirty, but working, It will save many hours.
Example:

autoexpect ssh root@192.168.122.240


work with script, after logout you receive script.exp which contain

 set timeout -1
spawn ssh root@192.168.122.240
match_max 100000
expect -exact "Warning: Permanently added '192.168.122.240' (RSA) to the list of known hosts.\r\r
root@192.168.122.240's password: "
send -- "testpass\r"
expect -exact "\r
Permission denied, please try again.\r\r
root@192.168.122.240's password: "
send -- "vagrant\r"
expect -exact "\r
Last login: Mon Mar 25 21:38:15 2013\r\r
^[\]0;root@centos64:~^G^[\[?1034h\[root@centos64 ~\]# "
send -- "uname -a\r"
expect -exact "uname -a\r
Linux centos64.vagrantup.com 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux\r
^[\]0;root@centos64:~^G\[root@centos64 ~\]# "
send -- "touch /tmp/123\r"
expect -exact "touch /tmp/123\r
^[\]0;root@centos64:~^G\[root@centos64 ~\]# "
send -- "exit\r"
expect eof

воскресенье, 14 апреля 2013 г.

pre-commit hooks for checking commits

there are examples for ruby code and puppet manifests(chef can validate automatically, but stupid puppet can't):
1. create file ./.git/hooks/pre-commit
2. add code

#!/bin/sh
echo 'working pre commit hook'
git diff --cached --name-only --diff-filter=ACM | while read file; do
  # check only puppet files
  if [ "${file##*.}" == 'pp' ]
  then
    echo "check $file"
    puppet parser validate $file
  fi
done

3. require set exec permissions. DO NOT FORGET !!!! (it is cause for not execution hook)
chmod +x ./.git/hooks/pre-commit
Complete.

Also example for ruby:

#!/bin/sh
echo 'working pre commit hook'
git diff --cached --name-only --diff-filter=ACM | while read file; do
  if [ "${file##*.}" == 'rb' ]
  then
    echo "check rubocop $file"
    rubocop $file
  fi
done

воскресенье, 7 апреля 2013 г.

shmmax error for start postgresql

During start postgresql appear error  
Apr 07 12:38:55 localhost.localdomain pg_ctl[9810]: FATAL: could not create shared memory segment: Invalid argument 
Apr 07 12:38:55 localhost.localdomain pg_ctl[9810]: DETAIL: Failed system call was shmget(key=5432001, size=41279488, 03600). 
Apr 07 12:38:55 localhost.localdomain pg_ctl[9810]: HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded your ker...nections. 
Apr 07 12:38:55 localhost.localdomain pg_ctl[9810]: If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter...lled for. 
Apr 07 12:38:55 localhost.localdomain pg_ctl[9810]: The PostgreSQL documentation contains more information about shared memory configuration. 
Apr 07 12:39:00 localhost.localdomain pg_ctl[9810]: pg_ctl: could not start server Apr 07 12:39:00 localhost.localdomain pg_ctl[9810]: Examine the log output.

fix in chef recipes

shmmax='kernel.shmmax=335544320' 
execute "set shmax" do
 command "sysctl -w #{shmmax}" 
end 

file "/etc/sysctl.d/shmmax.conf" do
 content shmmax 
end