Archives de l’auteur : hugues

Installation snmpd sur VCSA 5.5

Installation des repository

Se connecter en SSH sur la VCSA5.5

zypper addrepo -f http://download.opensuse.org/repositories/net-snmp:/factory/SLE_11_SP2/ opensuse_snmp
zypper addrepo -f http://download.opensuse.org/distribution/11.2/repo/oss/ opensuse

Vérifier la configuration des nouveaux repos

zypper repos -d

Rafraichir les sources

zypper refresh

Installer Net-snmp

zypper install net-snmp

Configuration net-snmp

Editer le fichier /etc/snmp/snmpd.conf

Activer le service

# chkconfig snmpd on

Lancer le service

# /etc/init.d/snmpd start

Autoriser l’accès distant à snmpd

Ajouter 1 ligne suivantes à la fin du fichier « /etc/hosts.allow » pour autoriser votre serveur de polling snmp.

snmpd: 192.168.0.10 : ALLOW

Tester depuis le serveur snmp

$ snmpwalk -v 2c -c public -On 192.168.0.25 .1.3.6.1.2.1.1.1.0
.1.3.6.1.2.1.1.1.0 = STRING: Linux esxi25.lepesant.com 3.0.101-0.7.19-default #1 SMP Fri May 9 14:41:39 UTC 2014 (aab30c0) x86_64

Ca marche !

saltstack : remonter le master

Mon process Saltstack master fonctionne dans un container Docker.
Quand j’ai commencé à jouer utiliser Saltstack, je ne maîtrisais pas Docker (non plus, NDLR).
J’avais donc mon répertoire « file_roots: » (par défaut /srv/salt) dans mon container.

Et puis un jour j’ai voulu construire ma propre image Docker à partir d’un Dockerfile (docker build) pour Saltstack.

J’ai donc fait une copie dans ma HOME du répertoire « srv/salt » à partir du système AUFS.

mkdir -p srv/salt
sudo cp -a /var/lib/docker/aufs/mnt/ce45266348553e0e240e86dbb2cdbd27c50965f2f2d9707ec7a37a766e11cdbe/srv/salt/* srv/salt/
sudo chown -R hugues:hugues srv/salt

Puis j’ai buildé mon image, et je l’ai lancé.

docker run -i -t -p 4505:4505 -p 4506:4506 -v /home/hugues/srv:/srv hlepesant/saltstack:latest /bin/bash

Puis je rentre dedans avec docker-enter

docker ps
CONTAINER ID        IMAGE                   [...]
74601a54cf89        hugues/saltstack:latest [...]
docker-enter 74601a54cf89
root@74601a54cf89:/# 

Là les minions sont tous revenus voir papa.

root@74601a54cf89:/# salt-key -L
Accepted Keys:
Unaccepted Keys:
minion-01
minion-02
minion-03
Rejected Keys:
root@74601a54cf89:/# 

Le problème c’est que les commandes salt échouent lamentablement.

Pour débugger : https://salt.readthedocs.org/en/v2014.1.0rc1/topics/troubleshooting/minion.html

A grand coup de « # salt-call -l debug state.highstate » exécuté à partir d’un des minions, l’erreur devient plus flagrante.
La clef publique échangée entre le minion et le master n’est plus la même.

Pour y remédier :

1. Sur le master :

salt-key -d <minion_id>

2. Sur le minion

sudo rm /etc/salt/pki/minion/minion_master.pub
sudo /etc/init.d/salt-minion restart

3. Retour sur le master

salt-key -a <minion_id>

Et voilà.

OSSEC : Installation sur les distributions Debian et Ubuntu

OSSEC est un système de détection d’intrusion basé sur l’hôte (HIDS) qui effectue l’analyse des log, la vérification de l’intégrité des fichiers (FIM), de la surveillance des politiques, la détection de rootkit, les alertes en temps réel et la réponse active…..

Son installation sous Debian et Ubuntu est maintenant facilité par la mise à disposition des paquets adéquates par Alienvault.

Debian 7

wget -O - http://ossec.alienvault.com/repos/apt/conf/ossec-key.gpg.key | apt-key add -
echo "deb http://ossec.alienvault.com/repos/apt/debian wheezy main" >> /etc/apt/sources.list prix viagra 100mg.d/ossec.list
apt-get update
apt-get install ossec-hids

Ubuntu 14.04

wget -O - http://ossec.alienvault.com/repos/apt/conf/ossec-key.gpg.key | apt-key add -
echo "deb http://ossec.alienvault.com/repos/apt/ubuntu trusty main" >> /etc/apt/sources.list.d/ossec.list
apt-get update
apt-get install ossec-hids

Pour l’agent installer « ossec-hids-agent »

Docker Public Repository

Pour faciliter le développement et surtout le déploiement de l’application Zacacia, j’utilise Docker.
Les 2 containers sont disponibles sous forme de Dockerfile ici

<a href="https://registry.hub viagra a vendre.docker.com/repos/hlepesant/ » title= »My Repositories »>https://registry.hub.docker.com/repos/hlepesant/

Cela vous donne aussi un aperçu des possibilités de Docker, et son inscription complète dans la mouvance DevOps.

Saltstack : Création d’un minion

On part sur une installation toute fraiche et basic d’une Ubuntu 14.04 LTS Server.
Seule l’option « OpenSSH server » a été choisie lors de létape Tasksel.

Une fois logger sur la nouvelle machine.

Ajout du repository et installation du paquet

sudo add-apt-repository ppa:saltstack/salt
sudo apt-get install -y salt-minion

Qui c’est ton papa ?

sudo -i
echo "192.168.10.10\t gru.lepesant.com gru" >> /etc/hosts
sed -i 's/^#master: salt/master: gru/' /etc/salt/minion

Va voir papa !

/etc/init.d/salt-minion restart

Et pour que le service démarre sur un reboot :

sudo update-rc.d salt-minion defaults

Sur Gru (Salt Master)

root@gru:/srv/salt# salt-key -L
Accepted Keys:
web-01.lepesant.com
sql-01.lepesant.com
Unaccepted Keys:
xen-01.lepesant.com
Rejected Keys:

root@gru:/srv/salt# salt-key -y -a xen-01.lepesant.com

The following keys are going to be accepted:
Unaccepted Keys:
xen-01.lepesant.com
Key for minion xen-01.lepesant.com accepted.

Et voilà.

Saltstack : renommer un minion

Il est parfois nécessaire de renommer votre minion.

Si vous ne forcer pas l’id du minion dans /etc/salt/minion, mais que vous laissez « socket.getfqdn() » le définir, vous devrez modifier les fichiers :

  • /etc/hostname
  • /etc/hosts

Puis, sur le minion :

  1. arrêter le service salt-minion
  2. supprimer le fichier /etc/salt/minion_id
  3. Relancer le service salt-minion

Sur le master :

  1. Supprimer la clef de l’ancien minion
  2. salt-key -d <old_minion_id>
    
  3. Afficher la nouvelle demande d’enregistrement
  4. salt-key -L
    
  5. Ajouter la clef du nouveau
  6. salt-key -a <new_minion_id>
    

Saltstack

Logo SaltStack

En tant que « devops« , je suis amené à installer et surtout configurer un nombre important de serveurs / machines virtuelles. Bien souvent les systèmes installés sont identiques. Un serveur LAMP ressemble très souvent à son voisin. Surtout si celui-ci fait partie de la même ferme de serveur Web.

La gestion des fichiers de configuration peut s’avérer fastidieuse.

Sur un projet professionel récent, j’ai été amené à gérer une dizaine de serveur Docker (Wikipedia : Docker).
Tous configurés de la même manière au nom et à l’IP prêts.

Rapidement j’ai cherché un outils me facilitant le boulot.

Il existe différents outils qui permettent une gestion centralisée des fichiers de configuration d’un serveur.
Les plus connus sont :

  • Puppet,
  • Chef,
  • Cfengine.

Un petit (pas si) nouveau pointe le bout de son nez depuis 2011: SaltStack.

C’est ce dernier que j’ai décidé d’utiliser car j’ai eu un très bon retour de ma Grotte à Barbus francophones préférées, dont l’un des gourous acteurs et ami, avait écrit un article dans Linux Magazine.

De plus il est écrit en python ce qui ne gache rien, et la learning curve est compatible avec mes enjeux de mise en production ;-).

Vous trouverez ici quelques articles faisant écho de mon retour d’expérience sur SaltStack.

  1. Création d’un Minion
  2. Renommer un minion

noNoseOnTV part 3

Voici le dernier code source de l’appareil NoNoseOnTV.

Et voici le schéma :


Sensor_bb

// # Author  : Hugues Lepesant
// # Date    : 30/04/2014
// # Version : 0.3
 
// # URM Code based on Jiang's work from DFRobot
// # Product name:ultrasonic scanner Kit
// # Product SKU:SEN0001
  
// # Description:
// # The Sketch for scanning 180 degree area 4-500cm detecting range
  
// # Connection:
// #       Pin 1 VCC (URM V3.2) -> VCC (Arduino)
// #       Pin 2 GND (URM V3.2) -> GND (Arduino)
// #       Pin 4 PWM (URM V3.2) -> Pin 6 (Arduino)
// #       Pin 6 COMP/TRIG (URM V3.2) -> Pin 5 (Arduino)
// # Pin mode: PWM
// # Working Mode: PWM passive control mode.
// # If it is your first time to use it,please make sure the two jumpers to the right hand
// # side of the device are set to TTL mode. You'll also find a secondary jumper on
// # the left hand side, you must break this connection or you may damage your device.


#include <IRremote.h>
#include <NewTone.h>


const int URPWM = 6;      // PWM Output 0-25000us,every 50us represent 1cm
const int URTRIG = 5;     // PWM trigger pin

const int greenLedPin = 2;
const int yellowLedPin = 4;
const int redLedPin = 7;
const int buzzerPin = 8;
 
const int distMinimum = 100; // 1 meter
const int distMedium  = 150; // 1 meter and half

const int duration = 800;
int alert = 0;
int tvPower = 1;
 
//boolean up=true;       // create a boolean variable
//unsigned long time;    // create a time variable
//unsigned long urmTimer = 0; // timer for managing the sensor reading flash rate
unsigned int Distance=0;

IRsend irsend;
 
uint8_t EnPwmCmd[4]={0x44,0x22,0xbb,0x01}; // distance measure command
  
void setup() {             // Serial initialization
    Serial.begin(9600);    // Sets the baud rate to 9600
 
    pinMode(greenLedPin, OUTPUT);
    digitalWrite(greenLedPin, LOW);
     
    pinMode(yellowLedPin, OUTPUT);
    digitalWrite(yellowLedPin, LOW);
     
    pinMode(redLedPin, OUTPUT);
    digitalWrite(redLedPin, LOW);
 
    PWM_Mode_Setup();
}
  
void loop() {
  Distance = PWM_Mode();

  
  Serial.print("Distance = ");
  Serial.print(Distance);
  Serial.println(" cm");
   
  if ( Distance > distMedium ) {
    digitalWrite(greenLedPin, HIGH);
    digitalWrite(yellowLedPin, LOW);
    digitalWrite(redLedPin, LOW);
    
    if ( tvPower == 0 ) {
      SendPowerCode(tvPower);
      tvPower = 1;
    }
    
    alert = 0;
  }
 
  if ( Distance > distMinimum && Distance < distMedium ) {
    digitalWrite(greenLedPin, LOW);
    digitalWrite(yellowLedPin, HIGH);
    digitalWrite(redLedPin, LOW);
  }
 
  if ( Distance < distMinimum ) {
    digitalWrite(greenLedPin, LOW);
    digitalWrite(yellowLedPin, LOW);
    digitalWrite(redLedPin, HIGH);
    
    alert++;

    NewTone(buzzerPin, 440, duration);


    if (alert > 2) {
      if ( tvPower == 1 ) {
        SendPowerCode(tvPower);
      }
      tvPower = 0;
    }
 }

  delay(1000);
  
  Serial.print("ALERT = ");
  Serial.println(alert);
}
 
  
void PWM_Mode_Setup(){
    pinMode(URTRIG,OUTPUT);       // A low pull on pin COMP/TRIG
    digitalWrite(URTRIG,HIGH);    // Set to HIGH
  
    pinMode(URPWM, INPUT);        // Sending Enable PWM mode command
     
    for (int i=0;i<4;i++) {
        Serial.write(EnPwmCmd[i]);
    }
}
  
int PWM_Mode(){                   // a low pull on pin COMP/TRIG  triggering a sensor reading
    digitalWrite(URTRIG, LOW);
    digitalWrite(URTRIG, HIGH);   // reading Pin PWM will output pulses
      
    unsigned long DistanceMeasured=pulseIn(URPWM,LOW);
      
    if (DistanceMeasured==50000) { // the reading is invalid.
      return 0;
    } else {
        return DistanceMeasured/50; // every 50us low level stands for 1cm
    }
}

void SendPowerCode(int tvPower)
{
  for (int i = 0; i < 3; i++) {
    irsend.sendSony(0xa90, 12); // Sony TV power code
    delay(100);
  }
  
  if ( tvPower == 1 ) {
    Serial.print("Signal Off sent");
  } else {
    Serial.print("Signal On sent");
  }
}

NoNoseOnTV . part 2

Et hop voilà le code version 2.

// # Author  : Hugues Lepesant
// # Date    : 24/04/2014
// # Version : 0.2
 
// # URM Code based on Jiang's work from DFRobot
// # Product name:ultrasonic scanner Kit
// # Product SKU:SEN0001
  
// # Description:
// # The Sketch for scanning 180 degree area 4-500cm detecting range
  
// # Connection:
// #       Pin 1 VCC (URM V3.2) -&gt; VCC (Arduino)
// #       Pin 2 GND (URM V3.2) -&gt; GND (Arduino)
// #       Pin 4 PWM (URM V3.2) -&gt; Pin 3 (Arduino)
// #       Pin 6 COMP/TRIG (URM V3.2) -&gt; Pin 5 (Arduino)
// # Pin mode: PWM
// # Working Mode: PWM passive control mode.
// # If it is your first time to use it,please make sure the two jumpers to the right hand
// # side of the device are set to TTL mode. You'll also find a secondary jumper on
// # the left hand side, you must break this connection or you may damage your device.
  
int URPWM=3;        // PWM Output 0-25000us,every 50us represent 1cm
int URTRIG=5;       // PWM trigger pin
 
int pinGreen = 2;
int pinYellow = 6;
int pinRed = 7;

int duration = 1000;
 
int distMinimum = 100; // 100 cm
int distMedium = 150;  // 150 cm
 
boolean up=true;       // create a boolean variable
unsigned long time;    // create a time variable
unsigned long urmTimer = 0; // timer for managing the sensor reading flash rate
  
unsigned int Distance=0;
 
uint8_t EnPwmCmd[4]={0x44,0x22,0xbb,0x01}; // distance measure command
  
void setup() {             // Serial initialization
    Serial.begin(9600);    // Sets the baud rate to 9600
 
    pinMode(pinGreen, OUTPUT);
    digitalWrite(pinGreen, LOW);
     
    pinMode(pinYellow, OUTPUT);
    digitalWrite(pinYellow, LOW);
     
    pinMode(pinRed, OUTPUT);
    digitalWrite(pinRed, LOW);
 
    PWM_Mode_Setup();
}
  
void loop() {
  Distance = PWM_Mode();
  Serial.print("Distance = ");
  Serial.print(Distance);
  Serial.println(" cm");
   
  if ( Distance > distMedium ) {
    digitalWrite(pinGreen, HIGH);
    digitalWrite(pinYellow, LOW);
    digitalWrite(pinRed, LOW);
  }
 
  if ( Distance > distMinimum && Distance < distMedium ) {
    digitalWrite(pinGreen, LOW);
    digitalWrite(pinYellow, HIGH);
    digitalWrite(pinRed, LOW);
  }
 
  if ( Distance < distMinimum ) {
    digitalWrite(pinGreen, LOW);
    digitalWrite(pinYellow, LOW);
    digitalWrite(pinRed, HIGH);
    
    tone(8, 330, duration);
//    noTone(8);
 }
   
  delay(2000);
}
 
  
void PWM_Mode_Setup(){
    pinMode(URTRIG,OUTPUT);       // A low pull on pin COMP/TRIG
    digitalWrite(URTRIG,HIGH);    // Set to HIGH
  
    pinMode(URPWM, INPUT);        // Sending Enable PWM mode command
     
    for (int i=0;i<4;i++) {
        Serial.write(EnPwmCmd[i]);
    }
}
  
int PWM_Mode(){                   // a low pull on pin COMP/TRIG  triggering a sensor reading
    digitalWrite(URTRIG, LOW);
    digitalWrite(URTRIG, HIGH);   // reading Pin PWM will output pulses
      
    unsigned long DistanceMeasured=pulseIn(URPWM,LOW);
      
    if (DistanceMeasured==50000) { // the reading is invalid.
      return 0;
    } else {
        return DistanceMeasured/50; // every 50us low level stands for 1cm
    }
}