20111220 lyon jug-packaging-natif

39
DevOps L’approche packaging natif LyonJUG 20 Décembre 2011

description

Présentation DevOps au LyonJUG.Approche Packaging Natif

Transcript of 20111220 lyon jug-packaging-natif

Page 1: 20111220 lyon jug-packaging-natif

DevOpsL’approche packaging natifLyonJUG 20 Décembre 2011

Page 2: 20111220 lyon jug-packaging-natif

Henri Gomez+20 ans dans l’industrie logicielle

Architecte Java, CI et direction de production

Dev, QA et Ops

OpenSource Activist

Apache Tomcat

JPackage

openjdk-osx-build

Page 3: 20111220 lyon jug-packaging-natif

Packaging Natif

Coeur de la pile applicative des OS

Gestion des dépendances

Mise à jour automatique ou sélective

Utilisé par les Ops

Page 4: 20111220 lyon jug-packaging-natif

Packaging sous Unix

RPM (Redhat Package Manager) sous RHEL/CentOS/ Fedora, SLES/OpenSuse, Mandriva

DEB sous Debian/Ubuntu

PKG sous Solaris

Page 5: 20111220 lyon jug-packaging-natif

Qu’est-ce qu’un package ?

Un fichier (.rpm, .deb)

Des données (fichiers et programmes)

Du code exécuté lors de l’installation, la mise à jour ou la suppression du package

Lié à une architecture (Intel, ARM, PowerPC en 32 ou 64bits) ou neutre (exemple: une application Java)

Page 6: 20111220 lyon jug-packaging-natif

Points communs avec MavenConstruction par DSL

Quelques commandes pour les manipuler (rpm, apt-get)

Gestion des dépendances pour la construction mais aussi pour l’exécution

Dépôts de packages, accessible en local ou via HTTP

Nexus et Artifactory peuvent servir de dépôts RPM

Mises à jour automatiques ou contrôlées

Page 7: 20111220 lyon jug-packaging-natif

Un DSL pour les Ops

Simple

Quelques macros

SH powered

Page 8: 20111220 lyon jug-packaging-natif

Construire un RPM

Des fichiers binaires - depuis l’entrepôt de livrables

Des sources - depuis le SCM

Un fichier de construction, le SPECFILE

Page 9: 20111220 lyon jug-packaging-natif

Entête déclaratif Name: myappVersion: 1.0.0Release: 1Summary: MyApp powered by Apache TomcatGroup: Applications/CommunicationsURL: http://www.mycorp.org/Vendor: MyCorpPackager: MyPackagerLicense: AGPLv1BuildArch: noarch

%define tomcat_rel 7.0.22%define myapp myapp%define myappusername myuser%define myappuserid 1234%define myappgroupid 1234 Requires: java = 1.6.0

Source0: apache-tomcat-%{tomcat_rel}.tar.gzSource1: myapp.war

%descriptionMyApp powered by Apache Tomcat

Page 10: 20111220 lyon jug-packaging-natif

Construction

%prep%setup -q -c

%build

%install# Prep the install location.rm -rf $RPM_BUILD_ROOT

mkdir -p $RPM_BUILD_ROOT%{_initrddir}mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig

Page 11: 20111220 lyon jug-packaging-natif

Hook de pré-install

%pre%if 0%{?suse_version} > 1140%service_add_pre %{myapp}.service%endif# add user and group%{_sbindir}/groupadd -r -g %{myappgroupid} %{myappusername} 2>/dev/null || :%{_sbindir}/useradd -s /sbin/nologin -c "%{myapp} user" -g %{myappusername} -r -d %{myappdir} -u %{myappuserid} %{myappusername} 2>/dev/null || :

Page 12: 20111220 lyon jug-packaging-natif

Hook de post-install%post%if 0%{?suse_version} > 1140%service_add_post %{myapp}.service%endifif [ "$1" == "1" ]; then # register app as service systemctl enable %{myapp}.service >/dev/null 2>&1

# Generated random password for RO and RW accounts RANDOMVAL=`echo $RANDOM | md5sum | sed "s| -||g" | tr -d " "` sed -i "s|@@SKEL_RO_PWD@@|$RANDOMVAL|g" %{_sysconfdir}/sysconfig/%{myapp} RANDOMVAL=`echo $RANDOM | md5sum | sed "s| -||g" | tr -d " "` sed -i "s|@@SKEL_RW_PWD@@|$RANDOMVAL|g" %{_sysconfdir}/sysconfig/%{myapp}

pushd %{myappdir} >/dev/null ln -s %{myapplogdir} logs ln -s %{myapptempdir} temp ln -s %{myappworkdir} work popd >/dev/null

fi

Page 13: 20111220 lyon jug-packaging-natif

Hook de pre-uninstall%preun%if 0%{?suse_version} > 1140%service_del_preun %{myapp}.service%endifif [ "$1" == "0" ]; then # Uninstall time, stop App and cleanup

# stop Application [ -x "/etc/init.d/%{myapp}" ] && /etc/init.d/%{myapp} stop

%{_sbindir}/userdel %{myappusername} %{_sbindir}/groupdel %{myappusername}

rm -rf %{myappworkdir}/* %{myapptempdir}/*

# unregister app from services systemctl disable %{myapp}.service >/dev/null 2>&1

# finalize housekeeping rm -rf %{myappdir} rm -rf %{myapplogdir} rm -rf %{myapptempdir} rm -rf %{myappworkdir}

fi

Page 14: 20111220 lyon jug-packaging-natif

Hook de post-uninstall

%postun%if 0%{?suse_version} > 1140%service_del_postun %{myapp}.service%endif

Page 15: 20111220 lyon jug-packaging-natif

Déclaration du contenu

%files%defattr(-,root,root)%attr(0755,%{myappusername},%{myappusername}) %dir %{myapplogdir}%attr(0755, root,root) %{_initrddir}/%{myapp}%attr(0644,root,root) %{_systemdir}/%{myapp}.service%config(noreplace) %{_sysconfdir}/sysconfig/%{myapp}%config %{_sysconfdir}/logrotate.d/%{myapp}%config %{_sysconfdir}/security/limits.d/%{myapp}%{myappdir}/bin%{myappdir}/conf%{myappdir}/lib%attr(-,%{myappusername}, %{myappusername}) %{myappdir}/webapps%attr(0755,%{myappusername},%{myappusername}) %dir %{myappdatadir}%attr(0755,%{myappusername},%{myappusername}) %dir %{myapptempdir}%attr(0755,%{myappusername},%{myappusername}) %dir %{myappworkdir}%doc %{myappdir}/NOTICE%doc %{myappdir}/RUNNING.txt%doc %{myappdir}/LICENSE%doc %{myappdir}/RELEASE-NOTES

Page 16: 20111220 lyon jug-packaging-natif

Historique

%changelog* Sat Dev 03 2011 [email protected] 1.0.3-1- Adapt spec to OpenSuse 12.1* Sun Nov 20 2011 [email protected] 1.0.2-1- Make use of OpenSuse 11.4 macros* Sun Jun 19 2011 [email protected] 1.0.1-1- Update Application* Sun Jun 19 2011 [email protected] 1.0.0-2- Add user account creation/deletion* Sun May 22 2011 [email protected] 1.0.0-1- Initial RPM

Page 17: 20111220 lyon jug-packaging-natif

AUTONOME

Un package est auto-suffisant

Programmes principaux et annexes (ex: logrotate)

Données

Comptes utilisateurs d’exécution

Contrôle total sur le cycle de vie ‘en situation’

Page 18: 20111220 lyon jug-packaging-natif

CYCLE DE VIE IN SITU

Contrôle total sur le cycle de vie ‘en situation’

Hooks pre/post installation

Hook lors de la mise à jour

Hooks pre/post désintallation

Hooks sur opération sur autres packages

Page 19: 20111220 lyon jug-packaging-natif

ET ENCORE

Un processus déterministe et donc réplicable

Peut être utilisé par Puppet ou Chef

Des artifacts centralisables comme pour Maven

Une approche composant d’exécution

Page 20: 20111220 lyon jug-packaging-natif

Types de RPMs

RPMs OSRPMs OSRPMs OSFournis par votre distribution Linux

RPMs ApplicatifRPMs ApplicatifRPMs ApplicatifProduits par les Devs & OpsRPMs ConfigurationRPMs ConfigurationRPMs ConfigurationRPMs Configuration

Produits par les Ops

Page 21: 20111220 lyon jug-packaging-natif

L’ASSEMBLAGE

Installer une usine à packages (Jenkins)

Créer un dépôt de packages

Apache HTTPd

Nexus/Artifactory

Préparer des images Linux (exemple: JeOS)

Page 22: 20111220 lyon jug-packaging-natif

Usine a packages

Jenkins (what else ?)

Un agent Jenkins par distribution cible

Déployer les outils de construction packages sur l’agent

rpm-build, make, autoconf (RPM)

build-essential, devscripts, ubuntu-dev-tools (DEB)

Page 23: 20111220 lyon jug-packaging-natif

dépôt de packages

Serveur Apache HTTPd

Installer createrepo (RPM), dpkg-dev (DEB)

Upload via web-dav ou ssh (plus simple)

Nexus/Artifactory

Installer createrepo (RPM), dpkg-dev (DEB)

Upload via web-dav (par Maven par exemple)

Page 24: 20111220 lyon jug-packaging-natif

JeOS

Juste les composants essentiels de l’OS

Moins de packages installés

Taux de mise à jour plus faible

Réduction des risques de failles de sécurité

Une empreinte mémoire et disque réduite

Page 25: 20111220 lyon jug-packaging-natif

De JeOS à instance

Inventaire des besoins

Pré-requis et dépendances

Spécificités applicatives

Page 26: 20111220 lyon jug-packaging-natif

Les communs

Serveur SSH

Comptes administrateur

Monitoring (SNMP)

Firewall (port 22 et SNMP autorisés)

Page 27: 20111220 lyon jug-packaging-natif

Ma petite FORGE

Subversion

Git

Jenkins

Nexus

Sonar

Page 28: 20111220 lyon jug-packaging-natif

Subversion

Apache HTTPd server

Subversion

Viewvc

Comptes utilisateurs

Page 29: 20111220 lyon jug-packaging-natif

GIT

Environnement Java (OpenJDK, Sun/Oracle ou IBM)

GitBlit

Compte utilisateur spécifique

Tomcat 7 powered & single webapp

Page 30: 20111220 lyon jug-packaging-natif

Jenkins

Environnement Java (OpenJDK, Sun/Oracle ou IBM)

Jenkins

Compte utilisateur spécifique

Tomcat 7 powered & single webapp

Page 31: 20111220 lyon jug-packaging-natif

Nexus

Environnement Java (OpenJDK, Sun/Oracle ou IBM)

Nexus

Compte utilisateur spécifique

Tomcat 7 powered & single webapp

Page 32: 20111220 lyon jug-packaging-natif

SONAR

Environnement Java (OpenJDK, Sun/Oracle ou IBM)

Sonar

Compte utilisateur spécifique

Tomcat 7 powered & single webapp

SQL backend (Derby ou MySQL)

Page 33: 20111220 lyon jug-packaging-natif

MySQL BACKEND

MySQL

Comptes utilisateurs

Configuration InnoDB

Page 34: 20111220 lyon jug-packaging-natif

Global FRONT-END

Apache HTTPd VHosts

Subversion

Git

Jenkins

Nexus

Sonar

Page 35: 20111220 lyon jug-packaging-natif

Conclusion

Une approche simpleMise en oeuvre par étapeAdaptée à de petites infrastructuresUtilisable avec Puppet ou Chef pour de grosses infrastructure

Page 36: 20111220 lyon jug-packaging-natif

RPM DevOPS

http://code.google.com/p/devops-incubator/

RPMs pour Subversion, GitBlit, Jenkins, Nexus, Sonar

Pour OpenSuse 11.4 & 12.1

Page 38: 20111220 lyon jug-packaging-natif

Des questions ?

Page 39: 20111220 lyon jug-packaging-natif

Licences et copyright

Photos et logos appartiennent à leur auteurs/propriétaires respectifs.

Contenu sous Creative Commons 3.0

http://creativecommons.org/licenses/by-nc-sa/3.0/us/