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.
- 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" - Desative o SELinux:
ansible-playbook selinux.yml - 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'" - 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" - 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" - 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" - 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" - 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" - 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.