Automação através do Ansible

Por Rogerio Eguchi  
Publicado em Junho 2018

Revisado por Ilan Salviano



Esse artigo demonstrará ao leitor como utilizar-se de ferramentas como github e ansible para automatizar a instalação e patching do Oracle Enterprise 12cR2 single instance multitenant.

Utilizar-se destas tecnologias permitirá um provisionamento ágil e padronizado das instalações de banco de dados, permitindo ao DBA focar seus esforços em tarefas mais nobres como arquitetura, segurança e performance.

O GitHub é um sistema de controle de versão distribuído e gerenciamento de código fonte criado por Linus Torvalds, utilizado inicialmente para o desenvolvimento do kernel do Linux.

O Ansible é um software que automatiza provisionamento, gerenciamento de configuração e deployment de aplicações.


Sobre o ambiente de laboratório:

Servidor Oracle:
Sistema Operacional: Oracle Linux Server release 7.4
Banco de Dados: Oracle 12c R2

Servidor de Controle (Ansible):
Sistema Operacional: Oracle Linux Server release 6.9
Ansible 2.4.2
Git client 1.7.1



Instalação do Git client

Conecte no servidor de controle e rode: yum install git –y.



Instalação do Ansible

O ansible está disponível no repositório EPEL (Extra Packages for Enterprise Linux), ou seja, precisamos instalar esse repositório.
Faça o download do rpm em http://fedoraproject.org/wiki/EPEL
e rode: rpm –i <package>

Pronto, podemos instalar o Ansible através do YUM, para isso execute:  yum install ansible –y

O Ansible se comunica com servidores remotos via SSH. Configure seu ambiente para que os servidores se comuniquem sem a necessidade de senhas.



Clone do repositório

Vamos utilizar os playbooks disponíveis no meu repositório git. Conecte no servidor de controle e clone o repositório: git clone https://github.com/reguchibr/ansible.git


O diretório ansible será criado, playbooks e demais arquivos serão disponibilizados.

 



Configuração do inventário

Crie um arquivo de inventário para o ansible ou use o inventário padrão (/etc/ansible/hosts).

Crie um grupo e defina os servidores que serão escopo da instalação Oracle.

Exemplo:

grep oralab /etc/ansible/hosts
[oralab]
oralab2

  


Arquivos de instalação

Faça o download do arquivo de instalação do Oracle 12.2.0.1 no OTN ou edelivery.

Copie o arquivo para o servidor de controle em /home/oracle/



Pré-requisitos de instalação

Siga os passos abaixo para configurar o servidor Oracle Linux para receber o Oracle 12c. Utilize o usuário root no servidor de controle.

  1. Para instalar o pacote oracle-rdbms-server-12cR2-preinstall:
    ansible oralab2 -i /etc/ansible/hosts -m yum -a 
    "name=oracle-database-server-12cR2-preinstall state=present"
      

  2. Desative o SELinux:
    ansible-playbook selinux.yml
      

  3. Ajuste o /etc/hosts:
    ansible oralab2 -i /etc/ansible/hosts -m lineinfile -a 
    "dest=/etc/hosts line='172.16.102.159 oralab2.cp.totvs.com.br oralab2'"
      

  4. Pare e desative o Firewall:
    ansible oralab2 -i /etc/ansible/hosts -m service -a "name=iptables state=stopped" 
    ansible oralab2 -i /etc/ansible/hosts -m service -a "name=iptables enabled=no"
     

  5. Crie o diretório que receberá a instalação: /u01/app/oracle/product/12.2.0.1/db_1 e ajuste os privilégios:
    ansible oralab2 -i /etc/ansible/hosts -m file -a "dest=/u01/app/oracle/product/12.2.0.1/db_1 
    state=directory owner=oracle group=oinstall"
      

  6. Crie um diretório para descompactar o arquivo de instalação no servidor de destino (oralab4)
    ansible oralab2 -i /etc/ansible/hosts -m file -a "dest=/u01/stage state=directory 
    owner=oracle group=oinstall"
      

  7. Copie o arquivo linuxx64_12201_database.zip para o servidor de destino (oralab4)
    ansible oralab2 -i /etc/ansible/hosts -m copy -a "src=/home/oracle/linuxx64_12201
    _database.zip dest=/u01/stage/linuxx64_12201_database.zip owner=oracle group=oinstall"
      

  8. Descompacte-o
    ansible oralab2 -i /etc/ansible/hosts -m unarchive -a "src=/u01/stage/linuxx64_12201
    _database.zip dest=/u01/stage/ remote_src=yes owner=oracle group=oinstall"
      

  9. Copie o arquivo de response file
    ansible oralab2 -i /etc/ansible/hosts -m copy -a "src=/home/oracle/ansible/12cR2.rsp 
    dest=/u01/stage/ owner=oracle group=oinstall"
      

Veja que utilizei nessa etapa (exceto o passo 2) somente Ansible Ad-Hoc Commands. Já na instalação vou demonstrar como utilizar os playbooks.

Outra opção seria executar o preInstR2.yml, playbook que reúne todos os ad-hoc commands executados anteriormente.




Instalação

Faremos a instalação do banco em modo command line. Utilize o usuário oracle no servidor de controle.

Rode ansible-playbook ./ansible/runInstR2.yml -i /etc/ansible/hosts, onde o conteúdo do arquivo (ansible playbook) runInstR2.yml consiste em:

- hosts: oralab2
  vars:
    oracle_base: /u01/app/oracle
    oracle_home: /u01/app/oracle/product/12.2.0.1/db_1/
    patch_dir: /u01/stage
  remote_user: oracle
  tasks:
  - name: execute run installer
    action: shell export ORACLE_HOME={{ oracle_home }}; /u01/stage/database/runInstaller 
    -ignoreSysPrereqs -ignorePrereq -waitforcompletion -showProgress -silent -responseFile 
    /u01/stage/12cR2.rsp oracle.install.option=INSTALL_DB_SWONLY ORACLE_HOSTNAME=`hostname` 
    UNIX_GROUP_NAME=oinstall INVENTORY_LOCATION=/u01/app/oraInventory SELECTED_LANGUAGES=en 
    ORACLE_HOME=/u01/app/oracle/product/12.2.0.1/db_1 ORACLE_BASE=/u01/app/oracle 
    oracle.install.db.InstallEdition=EE oracle.install.db.OSDBA_GROUP=dba 
    oracle.install.db.OSBACKUPDBA_GROUP=dba oracle.install.db.OSDGDBA_GROUP=dba 
    oracle.install.db.OSKMDBA_GROUP=dba oracle.install.db.OSRACDBA_GROUP=dba 
    SECURITY_UPDATES_VIA_MYORACLESUPPORT=false DECLINE_SECURITY_UPDATES=true

Exemplo:

 



Vamos executar os scripts orainstRoot.sh e root.sh via ansible, conectado como root.

ansible oralab2 -i /etc/ansible/hosts -a "/u01/app/oraInventory/orainstRoot.sh"

 

ansible oralab2 –i /etc/ansible/hosts –a "/u01/app/oracle/product/12.2.0.1/db_1/root.sh"



Netca via playbook:

ansible-playbook ./ansible/netcaR2.yml -i  /etc/ansible/hosts
 
      

Código do playbook netcaR2.yml:

 
---
- hosts: oralab2
  vars:
    oracle_base: /u01/app/oracle
    oracle_home: /u01/app/oracle/product/12.2.0.1/db_1/
    patch_dir: /u01/stage
  remote_user: oracle
  tasks:

  - name: executing netca
    action: shell export ORACLE_HOME={{ oracle_home }}; $ORACLE_HOME/bin/netca -silent 
    -responseFile /u01/app/oracle/product/12.2.0.1/db_1/assistants/netca/netca.rsp



Vamos iniciar o listener usando:

 ansible-playbook ./ansible/start_LIS_R2.yml -i /etc/ansible/hosts
 



Código do playbook start_LIS_R2.yml:

---
- hosts: oralab2
  vars:
    oracle_base: /u01/app/oracle
    oracle_home: /u01/app/oracle/product/12.2.0.1/db_1/
    patch_dir: /u01/stage
  remote_user: oracle
  tasks:

  - name: executing netca
    action: shell export ORACLE_HOME={{ oracle_home }}; $ORACLE_HOME/bin/lsnrctl start



Criando o Banco via DBCA:

ansible-playbook  ./ansible/createdbR2.yml -i /etc/ansible/hosts



Código do playbook ./ansible/createdbR2.yml:

---
- hosts: oralab2
  vars:
    oracle_base: /u01/app/oracle
    oracle_home: /u01/app/oracle/product/12.2.0.1/db_1/
    patch_dir: /u01/stage
  remote_user: oracle
  tasks:

  - name: create oradata dir
    file: path=/u01/app/oracle/oradata state=directory  owner=oracle group=oinstall mode=0755

  - name: execute run installer
    action: shell export ORACLE_HOME={{ oracle_home }}; /u01/app/oracle/product/12.2.0.1/
    db_1/bin/dbca -silent -createDatabase -templateName General_Purpose.dbc -gdbname cdb3 -sid 
    cdb3 -responseFile NO_VALUE -characterSet AL32UTF8 -sysPassword welcome1    
    -systemPassword welcome1 -createAsContainerDatabase true -numberOfPDBs 1 -pdbName pdb1 
    -pdbAdminPassword welcome1 -databaseType MULTIPURPOSE    -automaticMemoryManagement false 
    -totalMemory 1536 -storageType FS -datafileDestination "/u01/app/oracle/oradata/" 
    -redoLogFileSize 50 -emConfiguration NONE -ignorePreReqs




Aplicando Release Update Combo Patch (OJVM + RU) de Janeiro 2018


Logue no MOS e faça o download dos patches 27010695




e 6880880,



Copie para o servidor de controle em /home/oracle e rode o playbook ./ansible/rupatchoct2017.yml:

ansible-playbook rupatchjan2018.yml  -i /etc/ansible/hosts

Exemplo:



Código do playbook rupatch.yml:

---
- hosts: oralab2
  vars:
   oracle_base: /u01/app/oracle
   oracle_home: /u01/app/oracle/product/12.2.0.1/db_1
   patch_dir: /u01/stage
  remote_user: oracle
  tasks:

  - name: create directory for installation files
    action: file dest={{ patch_dir }} state=directory owner=oracle group=oinstall

  - name: copy opatch and ru
    copy: src=/home/oracle/{{ item }} dest={{ patch_dir }} owner=oracle group=oinstall mode=0644
    with_items:
      - p6880880_121010_Linux-x86-64.zip
      - p26636004_122010_Linux-x86-64.zip
      - ocm.rsp
      - startup_upg.sql
      - startup.sql
      - shutdown.sql

  - name: install opatch in database home
    action: unarchive src={{ patch_dir }}/p6880880_121010_Linux-x86-64.zip dest={{ oracle_home }} 
    remote_src=yes

  - name: unzip combo patch (ru+ovjm)
    action: unarchive src={{ patch_dir }}/p26636004_122010_Linux-x86-64.zip dest={{ patch_dir }} 
    remote_src=yes

  - name: stop listener
    action: shell export ORACLE_HOME={{ oracle_home }}; {{ oracle_home }}/bin/lsnrctl stop

  - name: shutdown db
    action: shell export ORACLE_HOME={{ oracle_home }}; export ORACLE_SID=cdb3; 
    {{ oracle_home }}/bin/sqlplus / as sysdba @{{ patch_dir }}/shutdown.sql

  - name: opatch apply ru
    action: shell export ORACLE_HOME={{ oracle_home }}; cd {{ patch_dir }}/26636004/26710464 ; 
    $ORACLE_HOME/OPatch/opatch apply -silent -ocmrf {{ patch_dir }}/ocm.rsp

  - name: opatch apply ojvm
    action: shell export ORACLE_HOME={{ oracle_home }}; cd {{ patch_dir }}/26636004/26635944 ; 
    $ORACLE_HOME/OPatch/opatch apply -silent -ocmrf {{ patch_dir }}/ocm.rsp

  - name: startup upgrade
    action: shell export ORACLE_HOME={{ oracle_home }}; export ORACLE_SID=cdb3; 
    {{ oracle_home }} /bin/sqlplus / as sysdba @{{ patch_dir }}/startup_upg.sql

  - name: running datapatch
    action: shell export ORACLE_HOME={{ oracle_home }}; export ORACLE_SID=cdb3; cd 
    {{ oracle_home }}/OPatch; ./datapatch -verbose

  - name: shutdown db
    action: shell export ORACLE_HOME={{ oracle_home }}; export ORACLE_SID=cdb3; 
    {{ oracle_home }}/bin/sqlplus / as sysdba @{{ patch_dir }}/shutdown.sql

  - name: starting listener
    action: shell export ORACLE_HOME={{ oracle_home }}; {{ oracle_home }}/bin/lsnrctl start

  - name: startup normal
    action: shell export ORACLE_HOME={{ oracle_home }}; export ORACLE_SID=cdb3; 
    {{ oracle_home }}/bin/sqlplus / as sysdba @{{ patch_dir }}/startup.sql



Patches aplicados com sucesso e sem atuação do DBA:





Agora que você conheceu um pouco sobre automação usando Ansible, acesso o repositório https://github.com/oravirt/ansible-oracle e aproveite os playbooks prontos para instalação de Oracle RAC.



Referências

Ansible Docs - https://docs.ansible.com/
MOS 1585822.1 - Datapatch: Database 12c Post Patch SQL Automation
README.html dos patches 27105253 e 27001739



Rogerio Bacchi Eguchi é um DBA Oracle Sênior com extensa experiência em ambientes OLTP de missão crítica e que empregam as tecnologias da "Oracle Maximum Availability Architecture". Atuou como DBA em empresas como Oracle, UOL, UOLDiveo, PagSeguro e atualmente atua como DBA/DMA na TOTVS. Possui as certificações Oracle OCP 8i, 9i, 10g, 11g, 12c e OCE Exadata. Atua também como SysAdmin/DEVOPS onde é certificado Linux RHCE. Entusiata de novas tecnologias como big data, automações e cloud computing. Compartilha conhecimento no blog reguchi.wordpress.com e twitter @reguchi_br.

Este artigo foi revisto pela equipe de produtos Oracle e está em conformidade com as normas e práticas para o uso de produtos Oracle.