Introduction
Le précédent billet présentait l'installation d'un serveur Oracle 19c en mode stand-alone. Il peut être intéressant d'utiliser ansible pour des déploiement massifs. C'est ce que détaille cet article. Le système d'exploitation est Red Hat / CentOS 7.
Pré-requis
Il faut dans un premier temps disposer du fichier des binaires oracle 19c -> LINUX.X64_193000_db_home.zip ( voir site oracle ou billet précédent )
Il est également nécessaire de prévoir certains fichiers qui seront utilisés soit par le module copy, soit par le module template.
Le playbook fait référence à des machines regroupées dans l'inventaire sous le nom oracle.
Fichier db19c.rsp ( installation silencieuse oracle )
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0 oracle.install.option=INSTALL_DB_SWONLY UNIX_GROUP_NAME=oinstall INVENTORY_LOCATION=/ora01/app/oraInventory ORACLE_HOME=/ora01/app/oracle/product/19/DB ORACLE_BASE=/ora01/app/oracle oracle.install.db.InstallEdition=EE oracle.install.db.OSDBA_GROUP=dba oracle.install.db.OSOPER_GROUP=oper oracle.install.db.OSBACKUPDBA_GROUP=backupdba oracle.install.db.OSDGDBA_GROUP=dgdba oracle.install.db.OSKMDBA_GROUP=kmdba oracle.install.db.OSRACDBA_GROUP=racdba oracle.install.db.rootconfig.executeRootScript=false
Fichier listener.j2 ( module template )
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS=(PROTOCOL = TCP)(HOST = {{ansible_fqdn}} )(PORT = 1521)) ) )
On utilise ici la variable ansible_fqdn qui donne le nom complet du serveur.
Fichier login.sql ( Paramétrage sqlplus )
define _editor=vi set sqlprompt '&_user.@&_connect_identifier. >' set linesize 250 set pagesize 50
Fichier oracle.service ( Demarrage via systemctl )
[Unit] Description=oracle After=syslog.target After=network.target [Service] Type=forking Environment=ORACLE_HOME=/ora01/app/oracle/product/19/DB User=oracle Group=oinstall ExecStart=/ora01/app/oracle/product/19/DB/bin/dbstart ${ORACLE_HOME} ExecStop=/ora01/app/oracle/product/19/DB/bin/dbshut ${ORACLE_HOME} [Install] WantedBy=multi-user.target
Le playbook
--- - name: "Configuration Oracle 19c stand-alone" hosts: oracle tasks: - name: Packages oracle19c pour CentOS 7 ( obligatoires ) yum: name: ['compat-libcap1','gcc','gcc-c++','ksh','libaio-devel','nfs-utils','sysstat','unzip','bind-utils','smartmontools','libXtst'] state: present - name: Packages oracle19c pour CentOS 7 ( optionnels ) yum: name: ['vim-enhanced','psmisc','net-tools','perl-TermReadKey'] state: present - name : Parametrage noyau oracle19c sysctl: name: "{{ item.name }}" value: "{{ item.value }}" loop: - { name: 'kernel.shmall',value: '2097152' } - { name: 'kernel.shmmax',value: '8589934592' } - { name: 'kernel.shmmni',value: '4096' } - { name: 'kernel.sem',value: '250 32000 100 128' } - { name: 'kernel.panic_on_oops',value: '1' } - { name: 'fs.file-max',value: '6815744' } - { name: 'fs.aio-max-nr',value: '1048576' } - { name: 'net.ipv4.ip_local_port_range',value: '9000 65500' } - { name: 'net.core.rmem_default',value: '262144' } - { name: 'net.core.rmem_max',value: '4194304' } - { name: 'net.core.wmem_default',value: '262144' } - { name: 'net.core.wmem_max',value: '1048576' } - { name: 'net.ipv6.conf.all.disable_ipv6',value: '1' } - { name: 'net.ipv6.conf.default.disable_ipv6',value: '1' } - { name: 'vm.swappiness',value: '1' } - { name: 'vm.dirty_background_ratio',value: '3' } - { name: 'vm.dirty_ratio',value: '80' } - { name: 'vm.dirty_expire_centisecs',value: '500' } - { name: 'vm.dirty_writeback_centisecs',value: '100' } - name: Parametrage limites pour oracle 19c pam_limits: domain: "{{item.domain}}" limit_type: "{{item.limit_type}}" limit_item: "{{item.it}}" value: "{{item.value}}" loop: - { domain: 'oracle', limit_type: 'soft', it: 'nproc', value: '16384' } - { domain: 'oracle', limit_type: 'hard', it: 'nproc', value: '16384' } - { domain: 'oracle', limit_type: 'soft', it: 'nofile', value: '1024' } - { domain: 'oracle', limit_type: 'hard', it: 'nofile', value: '65536' } - { domain: 'oracle', limit_type: 'soft', it: 'stack', value: '10240' } - { domain: 'oracle', limit_type: 'hard', it: 'stack', value: '32768' } - name : Creation des groupes group: name: "{{ item.name }}" gid: "{{ item.gid }}" loop: - { name: 'oinstall', gid: '1001' } - { name: 'dba', gid: '1002' } - { name: 'oper', gid: '1003' } - { name: 'backupdba', gid: '1004' } - { name: 'dgdba', gid: '1005' } - { name: 'kmdba', gid: '1006' } - { name: 'racdba', gid: '1007' } - { name: 'asmadmin', gid: '1008' } - { name: 'asmdba', gid: '1009' } - { name: 'asmoper', gid: '1010' } - name: Creation user oracle user: name: oracle uid: 1001 group: oinstall groups: dba,oper,backupdba,dgdba,kmdba,racdba,asmdba password: orPMdIdQOZmn. # Le mot de passe oracle est oracle01 - name: Suppression fichier profile file: path: /etc/profile.d/oracle.sh state: absent - name: Profile oracle blockinfile: path: /etc/profile.d/oracle.sh create: yes block: | if [ $USER = "oracle" ]; then if [ $SHELL = "/bin/ksh" ]; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fi fi - name: Suppresion repertoire file: path: /ora01 state: absent - name: Suppression de /etc/oraInst.loc file: path: /etc/oraInst.loc state: absent - name: Création répertoire file: path: /ora01/app/oracle/product/19/DB state: directory owner: oracle group: oinstall - name: Repertoire INSTALL file: path: /INSTALL state: directory mode: 1777 - name: Copie fichier zip copy: src: LINUX.X64_193000_db_home.zip dest: /INSTALL - name: Extraction du binaire unarchive: src: /INSTALL/LINUX.X64_193000_db_home.zip dest: /ora01/app/oracle/product/19/DB owner: oracle group: oinstall remote_src: yes - name: Fichier réponse copy: src: db19c.rsp dest: /home/oracle owner: oracle group: oinstall - name: Configuration pare-feu firewalld: port: 1521/tcp permanent: yes state: enabled immediate: yes - name: Installation command: /ora01/app/oracle/product/19/DB/runInstaller -silent -responsefile /home/oracle/db19c.rsp -waitforcompletion become: yes become_user: oracle - name: Changement des droits command: /ora01/app/oraInventory/orainstRoot.sh - name: Suppression bash_profile de oracle file: path: /home/oracle/.bash_profile state: absent - name: Configuration bash_profile oracle blockinfile: path: /home/oracle/.bash_profile block: | if [ -f ~/.bashrc ]; then . ~/.bashrc fi export ORACLE_BASE=/ora01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/19/DB export LD_LIBRARY_PATH=$ORACLE_HOME/lib export ORACLE_OWNER=oracle export PATH=$PATH:$ORACLE_HOME/bin export NLS_LANG=FRENCH_FRANCE.UTF8 export NLS_DATE_FORMAT='DD/MM/YYYY HH24:MI:SS' export SQLPATH=$HOME/sql export ORACLE_PATH=$SQLPATH export TNS_ADMIN=$ORACLE_HOME/network/admin create: yes owner: oracle group: oinstall - name: Configuration listener template: src: /home/listener.j2 dest: /ora01/app/oracle/product/19/DB/network/admin/listener.ora owner: oracle group: oinstall - name: Script demmarage oracle copy: src: oracle.service dest: /usr/lib/systemd/system - name: Activation script oracle service: name: oracle enabled: yes - name: Fichier /etc/oratab file: path: /etc/oratab owner: oracle group: oinstall mode: 0664 state: touch - name: Repertoire SQL file: path=/home/oracle/sql state=directory owner=oracle group=oinstall - name: Copie login.sql copy: src=login.sql dest=/home/oracle/sql owner=oracle group=oinstall
Conclusion
Ce playbook utilise le compte root pour déployer sur les serveurs distants. Il est facilement modifiable pour y ajouter toute autre configuration ...