Installation automatisée d'IRIS à l'aide d'Ansible
Le déploiement de nouvelles instances IRIS peut être une tâche fastidieuse, en particulier lors de la mise en place de plusieurs environnements avec des configurations en miroir.
J'ai fait face à ce problème très souvent et je souhaite partager mon expérience et mes recommandations concernant l'utilisation d'Ansible pour rationaliser le processus d'installation d'IRIS. Mon approche inclut également la gestion des tâches supplémentaires généralement effectuées avant et après l'installation d'IRIS.
Ce manuel suppose que vous disposez d'une compréhension de base du fonctionnement d'Ansible, je ne détaillerai donc pas ses principes fondamentaux. Toutefois, si vous avez des questions sur les points abordés ici, n'hésitez pas à les poser dans les commentaires ci-dessous.
Les exemples fournis dans ce manuel ont été testés à l'aide d' Ansible 3.6 sur un serveur Red Hat 8, avec IRIS 2023.1.1 et Red Hat 8 comme environnement client. D'autres versions d'Ansible, de Red Hat (ou d'autres variantes d'UNIX) et d'IRIS peuvent également fonctionner, mais les résultats peuvent varier.
Installation d'Ansible
Le serveur Ansible nécessite une distribution Linux. Nous utilisons Red Hat 8 dans cet article, mais d'autres distributions et versions Linux devraient également fonctionner.
Pour installer les paquets Ansible, il faut d'abord installer EPEL:
[ansible@auto01 ansible]$ yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
Ensuite, il faut installer Ansible:
[ansible@auto01 ansible]$ yum install ansible
En plus des paquets, Ansible nécessite un accès SSH aux serveurs distants. Je recommande de créer une paire de clés SSH, ce qui est plus sûr que l'utilisation de mots de passe traditionnels. De plus, l'utilisateur servant à se connecter aux serveurs distants doit disposer de privilèges administratifs (c'est-à-dire faire partie du groupe wheel).
Fichiers et dossiers
Pour préserver une structure organisée, je recommande les fichiers et dossiers suivants dans le répertoire ansible:
[ansible@auto01 ansible]$ ls -l
total 4
-rw-r--r--. 1 ansible ansible 247 Dec 5 00:57 ansible.cfg
drwxrwxr-x. 2 ansible ansible 6 Dec 5 00:56 files
drwxrwxr-x. 2 ansible ansible 6 Dec 5 00:56 inventory
drwxrwxr-x. 2 ansible ansible 6 Dec 5 00:56 library
drwxrwxr-x. 2 ansible ansible 6 Dec 5 00:56 playbooks
drwxrwxr-x. 2 ansible ansible 6 Dec 5 00:56 templates
drwxrwxr-x. 2 ansible ansible 6 Dec 5 00:56 vars
drwxrwxr-x. 2 ansible ansible 6 Dec 5 00:56 vault
| Fichier/Dossier | Description |
|---|---|
| ansible.cfg | Fichier de configuration d'Ansible. Contient des directives sur le comportement d'Ansible. |
| files | Contient les fichiers supplémentaires nécessaires aux playbooks, tels que le fichier tar.gz d'installation d'IRIS. |
| inventory | Contient les fichiers d'inventaire de l'hôte. Vous pouvez avoir un seul fichier d'inventaire volumineux ou plusieurs fichiers de moindre taille. Le fractionnement de l'inventaire nécessite davantage d'efforts lorsque vous exécutez des playbooks sur plusieurs hôtes. |
| library | Contient des fichiers de bibliothèque supplémentaires d'Ansible. Non requis pour ces exemples, mais utile pour de futures extensions. |
| playbooks | Contient tous les playbooks développés, y compris le playbook d'installation IRIS décrit ci-dessous. |
| templates | Contient les fichiers modèles utilisés par les playbooks. Ceux-ci sont transférés vers les serveurs et instanciés avec les paramètres corrects. |
| vars | Contient les variables disponibles pour tous les playbooks. |
| vault | Contient des variables sensibles accessibles uniquement via la commande ansible-vault. Utile pour gérer les mots de passe. |
Après avoir configuré cette structure de dossiers, copiez le programme d'installation IRIS et la clé de licence IRIS dans le dossier files. Le résultat devrait apparaître comme suit:
[ansible@auto01 ansible]$ ls -l files/
total 759976
-rw-rw-r--. 1 ansible ansible 778207913 Dec 5 14:32 IRISHealth-2023.1.1.380.0.22870-lnxrh8x64.tar.gz
-rw-rw-r--. 1 ansible ansible 1160 Sep 5 19:13 iris.key
Inventaire
Pour exécuter des playbooks dans Ansible, il est nécessaire de définir l'inventaire des serveurs. Il existe plusieurs méthodes pour ce faire, et chacune présente ses propres avantages. Dans cet article, nous utiliserons un seul fichier pour définir tous les serveurs.
Le ficher servers.yml contiendra l'inventaire complet, répertoriant chaque serveur ainsi que les variables requises pour l'installation d'IRIS. Voici un exemple:
[ansible@auto01 ansible]$ cat inventory/servers.yml
---
all:
hosts:
test01.mydomain:
iris_user: irisusr
iris_group: irisgrp
mgr_user: irisown
mgr_group: irismgr
platform: lnxrh8x64
iris_cmd: iris
iris_instances:
- name: TEST01
superserver_port: 51773
webserver_port: 52773
binary_file: IRISHealth-2023.1.1.380.0.22870-lnxrh8x64
key_file: iris.key
install_dir: /test/iris
jrnpri_dir: /test/jrnpri
jrnsec_dir: /test/jrnsec
config_globals: 16384
config_errlog: 10000
config_routines: "0,128,0,128,0,1024"
config_gmheap: 1048576
config_locksiz: 128057344
Fichier coffre-fort
Pour sécuriser les mots de passe, créez un fichier coffre-fort contenant les mots de passe des comptes IRIS SuperUser et CSPSystem.
Pour modifier le fichier coffre-fort par défaut, utilisez la commande suivante:
[ansible@auto01 ansible]$ ansible-vault edit vault/defaults.yml
---
# Default passwords
iris_user_passwd: "Ch4ngeTh!s"
Playbook
Pour effectuer une installation IRIS, il est nécessaire d'exécuter plusieurs tâches sur le serveur cible. Ces tâches sont regroupées et classées dans un fichier appelé playbook.
Un playbook consiste essentiellement en une liste de tâches qui sont exécutées de manière séquentielle sur les hôtes distants.
Vous trouverez ci-dessous le playbook que j'ai développé pour installer IRIS:
[ansible@auto01 ansible]$ cat playbooks/install_iris.yml
#
# Playbook to install Iris
#
- hosts: all
become: yes
gather_facts: no
tasks:
- name: "Load default passwords"
include_vars: "../vault/defaults.yml"
### PRE-INSTALL TASKS:
- name: "Install required packets"
yum:
name: "{{ item }}"
state: latest
loop:
- "httpd"
- "java-1.8.0-openjdk"
- "mod_auth_mellon"
- "mod_ssl"
- name: "Create iris group"
group:
name: "{{ iris_group }}"
gid: 5005
- name: "Create iris mgr group"
group:
name: "{{ mgr_group }}"
gid: 5006
- name: "Create iris owner user"
user:
name: "{{ mgr_user }}"
uid: 5006
group: "{{ iris_group }}"
groups: "{{ mgr_group }}"
- name: "Create iris user"
user:
name: "{{ iris_user }}"
uid: 5005
group: "{{ iris_group }}"
- name: "Create mgr folder"
file:
path: "{{ item.install_dir }}/mgr"
state: directory
owner: "{{ iris_user }}"
group: "{{ iris_group }}"
mode: 0775
loop: "{{ iris_instances }}"
loop_control:
label: "{{ item.name }}"
- name: "Copy license key"
copy:
src: "../files/{{ item.key_file }}"
dest: "{{ item.install_dir }}/mgr/iris.key"
owner: "{{ iris_user }}"
group: "{{ iris_group }}"
backup: yes
loop: "{{ iris_instances }}"
loop_control:
label: "{{ item.name }}"
- name: "Create /install folder"
file:
path: "/install"
state: directory
mode: 0777
- name: "Create Instances install folders"
file:
path: "/install/{{ item.name }}"
state: directory
mode: 0777
loop: "{{ iris_instances }}"
loop_control:
label: "{{ item.name }}"
- name: "Copy IRIS installer"
copy:
src: "../files/{{ item.binary_file }}.tar.gz"
dest: "/install/{{ item.name }}/"
loop: "{{ iris_instances }}"
loop_control:
label: "{{ item.name }}"
- name: "Untar IRIS installer"
command:
cmd: "tar -xzf /install/{{ item.name }}/{{ item.binary_file }}.tar.gz"
chdir: "/install/{{ item.name }}/"
loop: "{{ iris_instances }}"
loop_control:
label: "{{ item.name }}"
### IRIS INSTALL:
- name: "Install Iris"
command:
cmd: "./irisinstall_silent"
chdir: "/install/{{ item.name }}/{{ item.binary_file }}"
environment:
ISC_PACKAGE_INSTANCENAME: "{{ item.name }}"
ISC_PACKAGE_INSTALLDIR: "{{ item.install_dir }}"
ISC_PACKAGE_PLATFORM: "{{ platform }}"
ISC_PACKAGE_UNICODE: "Y"
ISC_PACKAGE_INITIAL_SECURITY: "Normal"
ISC_PACKAGE_MGRUSER: "{{ mgr_user }}"
ISC_PACKAGE_MGRGROUP: "{{ mgr_group }}"
ISC_PACKAGE_USER_PASSWORD: "{{ iris_user_passwd }}"
ISC_PACKAGE_CSPSYSTEM_PASSWORD: "{{ iris_user_passwd }}"
ISC_PACKAGE_IRISUSER: "{{ iris_user }}"
ISC_PACKAGE_IRISGROUP: "{{ iris_group }}"
ISC_PACKAGE_SUPERSERVER_PORT: "{{ item.superserver_port }}"
ISC_PACKAGE_WEBSERVER_PORT: "{{ item.webserver_port }}"
ISC_PACKAGE_CLIENT_COMPONENTS: "standard_install"
ISC_PACKAGE_STARTIRIS: "N"
loop: "{{ iris_instances }}"
loop_control:
label: "{{ item.name }}"
- name: "Remove installers"
file:
path: "/install/{{ item.name }}"
state: absent
loop: "{{ iris_instances }}"
loop_control:
label: "{{ item.name }}"
### IRIS CUSTOMIZATIONS:
- name: "Change iris.cpf"
lineinfile:
path: "{{ item[0].install_dir }}/iris.cpf"
regexp: "{{ item[1].from }}"
line: "{{ item[1].to }}"
backup: yes
with_nested:
- "{{ iris_instances }}"
- [ { from: "^TerminalPrompt=.", to: "TerminalPrompt=8,3,2" },
{ from: "^FreezeOnError=0", to: "FreezeOnError=1" },
{ from: "^AutoParallel=.", to: "AutoParallel=0" },
{ from: "^FastDistinct=.", to: "FastDistinct=0" },
{ from: "^LockThreshold=.", to: "LockThreshold=10000" },
{ from: "^EnsembleAutoStart=.", to: "EnsembleAutoStart=1" },
{ from: "^MaxIRISTempSizeAtStart=.", to: "MaxIRISTempSizeAtStart=300" } ]
loop_control:
label: "{{ item[0].name }}: {{ item[1].to }}"
- name: "Change Journal Current Dir"
lineinfile:
path: "{{ item.install_dir }}/iris.cpf"
regexp: "^CurrentDirectory=."
line: "CurrentDirectory={{ item.jrnpri_dir }}"
backup: yes
loop: "{{ iris_instances }}"
loop_control:
label: "{{ item.name }}"
- name: "Change Journal Alternate Dir"
lineinfile:
path: "{{ item.install_dir }}/iris.cpf"
regexp: "^AlternateDirectory=."
line: "AlternateDirectory={{ item.jrnsec_dir }}"
backup: yes
loop: "{{ iris_instances }}"
loop_control:
label: "{{ item.name }}"
- name: "Change Journal Prefix name"
lineinfile:
path: "{{ item.install_dir }}/iris.cpf"
regexp: "^JournalFilePrefix=."
line: "JournalFilePrefix={{ item.name }}_"
backup: yes
loop: "{{ iris_instances }}"
loop_control:
label: "{{ item.name }}"
- name: "Change Globals memory"
lineinfile:
path: "{{ item.install_dir }}/iris.cpf"
regexp: "^globals=."
line: "globals=0,0,{{ item.config_globals }},0,0,0"
backup: yes
loop: "{{ iris_instances }}"
loop_control:
label: "{{ item.name }}"
- name: "Change errlog memory"
lineinfile:
path: "{{ item.install_dir }}/iris.cpf"
regexp: "^errlog=."
line: "errlog={{ item.config_errlog }}"
backup: yes
loop: "{{ iris_instances }}"
loop_control:
label: "{{ item.name }}"
- name: "Change routines memory"
lineinfile:
path: "{{ item.install_dir }}/iris.cpf"
regexp: "^routines=."
line: "routines={{ item.config_routines }}"
backup: yes
loop: "{{ iris_instances }}"
loop_control:
label: "{{ item.name }}"
- name: "Change gmheap memory"
lineinfile:
path: "{{ item.install_dir }}/iris.cpf"
regexp: "^gmheap=."
line: "gmheap={{ item.config_gmheap }}"
backup: yes
loop: "{{ iris_instances }}"
loop_control:
label: "{{ item.name }}"
- name: "Change locksiz memory"
lineinfile:
path: "{{ item.install_dir }}/iris.cpf"
regexp: "^locksiz=."
line: "locksiz={{ item.config_locksiz }}"
backup: yes
loop: "{{ iris_instances }}"
loop_control:
label: "{{ item.name }}"
### START IRIS:
- name: "Start Iris"
command: "iris start {{ item.name }}"
loop: "{{ iris_instances }}"
loop_control:
label: "{{ item.name }}"
...
Comme vous pouvez le constater, ce playbook comporte plusieurs tâches, dont la plupart sont explicites d'après leur nom. Les commentaires indiquent les tâches à effectuer avant l'installation, l'installation proprement dite et les personnalisations à effectuer après l'installation. Après avoir exécuté ce playbook, vous disposerez d'une nouvelle instance IRIS installée sur le système cible, dont la mémoire et d'autres paramètres auront été personnalisés.
Lancez l'installation!
Après avoir configuré l'inventaire, le ficheir coffre-fort et les playbooks, vous êtes prêt à exécuter l'installation IRIS à l'aide d'Ansible.
Pour ce faire, exécutez la commande suivante:
[ansible@auto01 ansible]$ ansible-playbook -K --ask-vault-pass -i inventory/servers.yml playbooks/install_iris.yml
BECOME password:
Vault password:
PLAY [all] **************************************************************************************************************************************************
. . .
Lorsque l'exécution du playbook est terminée, vous recevez un résumé de statuts des tâches qui vous permet de vérifier que tout a été exécuté avec succès.
Et voilà, vous venez d'installer IRIS à l'aide d'Ansible! 😁