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 ...