Archives pour décembre, 2013

Pacemaker : configuration d’une ressource de type clone

Une ressource de type clone permet l’exécution simultanée d’une même ressource sur un ou plusieurs nodes composant le cluster.

Dans le cas présenté ici, il m’est nécesaire de lancer autofs sur les deux nodes composant le cluster, avec une instance par node. Les paramètres de configuration de la ressource clone sont donc clone max = 2 et clone node max = 1. De plus, il faut impérativement désactiver la colocation sur celle-ci.

heartbeat-clone_resource

Debian : installation de PHP 5.3 sous Wheezy

root@amazon ~ # cat /etc/apt/sources.list
deb http://ftp.debian.org/debian/ squeeze main contrib non-free
deb http://security.debian.org/ squeeze/updates main contrib non-free
root@amazon ~ # cat /etc/apt/preferences.d/preferences
Package: php5*
Pin: release a=oldstable
Pin-Priority: 700

Package: libapache2-mod-php5
Pin: release a=oldstable
Pin-Priority: 700

Package: php-pear
Pin: release a=oldstable
Pin-Priority: 700

Package: php-apc
Pin: release a=oldstable
Pin-Priority: 700

Package: *
Pin: release a=stable
Pin-Priority: 600
root@amazon ~ # apt-get update
root@amazon ~ # apt-get install libapache2-mod-php5 php5-cli php5-curl php5-dev php5-gd php5-mcrypt php5-mysql

Pacemaker : supprimer un node en doublon

root@node0 ~ # crm configure show
node $id="87979dd9-bb33-42ad-acb5-31d6023e0079" node0
node $id="8a34568b-d09f-457c-8cf0-22675d243342" node1
node $id="fabb197c-87f9-46d9-bb9e-27517a9717a4" node1
root@node0 ~ # cibadmin --query --local
    <nodes>
      <node id="87979dd9-bb33-42ad-acb5-31d6023e0079" uname="node0" type="normal"/>
      <node id="fabb197c-87f9-46d9-bb9e-27517a9717a4" uname="node1" type="normal"/>
      <node id="8a34568b-d09f-457c-8cf0-22675d243342" uname="node1" type="normal"/>
    </nodes>
root@node0 ~ # crm_node -i
87979dd9-bb33-42ad-acb5-31d6023e0079
root@node1 ~ # crm_node -i
8a34568b-d09f-457c-8cf0-22675d243342
root@node0 ~ # /etc/init.d/pacemaker stop
root@node1 ~ # /etc/init.d/pacemaker stop
root@node0 ~ # crm_node --force -R fabb197c-87f9-46d9-bb9e-27517a9717a4
root@node0 ~ # cibadmin --delete --obj_type nodes --crm_xml '<node id="fabb197c-87f9-46d9-bb9e-27517a9717a4" uname="node1" type="normal"/>'
root@node0 ~ # /etc/init.d/pacemaker start
root@node1 ~ # /etc/init.d/pacemaker start

Node.js : template de script de démarrage init.d

#! /bin/sh
### BEGIN INIT INFO
# Provides:          app
# Required-Start:    $remote_fs $syslog $network
# Required-Stop:     $remote_fs $syslog $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: app
# Description:       app startup script
### END INIT INFO

# Author: Boris HUISGEN <bhuisgen@hbis.fr>

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
DESC="app"
NAME=app
DAEMON=/usr/local/bin/node
USER=app
GROUP=app
LOGFILE=/var/log/app/app.log
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

NODEAPP_DIR=/home/app/
NODEAPP_SCRIPT="app.js"

[ -x "$DAEMON" ] || exit 0

[ -r /etc/default/$NAME ] && . /etc/default/$NAME

. /lib/init/vars.sh
. /lib/lsb/init-functions

do_start()
{
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test \
		> /dev/null || return 1
	start-stop-daemon --start --quiet --make-pidfile --pidfile $PIDFILE \
		--exec $DAEMON --chdir $NODEAPP_DIR --chuid $USER:$GROUP \
		--background -- $NODEAPP_SCRIPT >> $LOGFILE 2>&1 || return 2
}

do_stop()
{
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2

        start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --pidfile $PIDFILE
        [ "$?" = 2 ] && return 2

	rm -f $PIDFILE
	return "$RETVAL"
}

case "$1" in
  start)
	[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
	do_start
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  stop)
	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
	do_stop
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  status)
	status_of_proc -p $PIDFILE "$DAEMON" "$NAME" && exit 0 || exit $?
	;;
  restart|force-reload)
	log_daemon_msg "Restarting $DESC" "$NAME"
	do_stop
	case "$?" in
	  0|1)
		do_start
		case "$?" in
			0) log_end_msg 0 ;;
			1) log_end_msg 1 ;;
			*) log_end_msg 1 ;;
		esac
		;;
	  *)
		log_end_msg 1
		;;
	esac
	;;
  *)
	echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
	exit 3
	;;
esac

:

Iptables : redirection de port pour une application Node.js / Express

*nat
:PREROUTING ACCEPT [7281:438725]
:POSTROUTING ACCEPT [1652:103194]
:OUTPUT ACCEPT [1652:103194]
-A PREROUTING -d 80.80.80.80/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination :3000 
-A OUTPUT -o lo -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3000
COMMIT
*filter
:INPUT ACCEPT [184:13033]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [46937:6349034]
-A INPUT -d 80.80.80.80/32 -m state --state NEW -p tcp --dport 3000 -j ACCEPT 
-A INPUT -j DROP
-A FORWARD -j DROP
COMMIT

iRedMail : configurer un second node en backup MX

Configuration du serveur LDAP sur le node MX1

root@mx1 ~ # nano /etc/ldap/slapd.conf
moduleload syncprov
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 200
root@mx1 ~ # /etc/init.d/slapd restart

Configuration du serveur LDAP sur le node MX2

root@mx2 ~ # nano /etc/ldap/slapd.conf
syncrepl rid=1
   provider=ldap://mx1.my.domain
   type=refreshAndPersist
   searchbase="dc=mailing,dc=com"
   bindmethod=simple
   binddn="cn=Manager,dc=mailing,dc=com"
   credentials=mypassword
   scope=sub
   schemachecking=on
   type=refreshOnly
   retry="60 +"
   scope=sub
   interval=00:00:01:00
   attrs="*,+"

updateref ldap://mx1.my.domain/
root@mx2 ~ # /etc/init.d/slapd restart

Activation du backup MX sur le node MX2

Au niveau LDAP, il ne faut aucun attribut supplémentaire sur les objets MailDomain pour permettre le backup MX. Plus précisément, il n’y a plus de vérification sur l’attribut domainBackupMX, mais il peut être utilisé avec la valeur no pour ne pas relayer un domaine sur le MX2.

root@mx2 ~ # cat /etc/postfix/ldap/relay_domains.cf
query_filter = (&(objectClass=mailDomain)(|(domainName=%s)(&(enabledService=domainalias)(domainAliasName=%s)))(accountStatus=active)(enabledService=mail))
root@mx2 ~ # cat /etc/postfix/ldap/virtual_mailbox_domains.cf
query_filter = (&(objectClass=mailDomain)(|(domainName=%s)(&(enabledService=domainalias)(domainAliasName=%s)))(domainBackupMX=no)(accountStatus=active)(enabledService=mail))
root@mx2 ~ # cat /etc/postfix/ldap/transport_maps_domain.cf
query_filter = (&(objectClass=mailDomain)(|(domainName=%s)(domainAliasName=%s))(domainBackupMX=no)(accountStatus=active)(enabledService=mail))
root@mx2 ~ # nano /etc/postfix/main.cf
maximal_queue_lifetime=9d
root@mx2 ~ # /etc/init.d/postfix restart

Debian : coloration du prompt

Une petite astuce pour colorer le prompt Bash selon le type de serveur : serveur en production, serveur interne, ou encore console locale.

Exemple pour un serveur de production (prompt rouge) :

root@mx1 ~ # cat /etc/bash.bashrc
# set a fancy prompt (non-color, overwrite the one in /etc/profile)
#PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

if [[ ${EUID} == 0 ]] ; then
   PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[01;34m\] \W \$\[\033[00m\] '
else
   PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] '
fi

Bind: cache forward & error (no valid RRSIG) resolving

Dec  2 11:21:22 vmb-ld7-proxydns named[3951]: error (no valid RRSIG) resolving 'google.fr/DS/IN': 192.168.0.153#53
root@proxydns:~# nano /etc/bind/named.conf.options
options {

        forward only;
        forwarders {
                192.168.0.153;
                192.168.0.154;
        };

        //dnssec-validation auto;
        dnssec-enable no;
        dnssec-validation no;
};

Remarque : la désactivation de DNSSEC ne devrait être faite que dans le cas d’un serveur de cache interne, limité à un groupe de travail.

Haut de page