un disco para nuestro diskgroup REDO2
Para la ejecucion de nuestro taller de creacion de asm usaremos los siguientes ficheros del repositorio
Raiz
|
|- vars:
|- oracle_standard.yaml Fichero con los estandares del departamento
|
|- templates
|
|- files
|-REQ01_asm_create_disks.yaml Ejemplo de informacon de provisionamiento de discos para el ASM
|
| asmlib_configure.yaml Playbook que configura el asmlib
| asmlib_create_disks.yaml Playbook que configura los discos de ASM
| asm_create.yaml Playbook que crea una instancia +ASM con en el GRID y con los discos previamente instalados
Ficheros de variables
Al igual que en el resto de ejecuciones del taller vamos a necesitar el fichero oracle_standard.yaml que contiene todas la estandarizacion de nuestro departamento
Ficheros informacion
La creacion de discos necesita de la informacion de que discos del sistema operativo van a ir dedicados a que diskgroup, esta informacion la depositaremos en el directorio files, que va a ser el unico directorio donde deberemos/podremos modificar los ficheros .
El formato del fichero sera el de una lista en yaml en el que indicaremos el nombre del dispositivo para cada uno de los diskgroups.
[code lang=»py»]
DATA:
– /dev/sda
– /dev/sdb
FRA:
– /dev/sdc
REDO1:
– /dev/sdd
REDO2:
– /dev/sde
[/code]
El nomre del fichero sera [REQ]_asm_create_disks. Donde REQ es el valor en mayusculas de la variable req que es el identificador unico de nuestro fichero, este identificador en un entorno de produccion real podria corresponderse con el numero de peticion del sistema gestion de la compañia.
Creacion de los discos
Una vez tenemos claros los ficheros de fuentes y variables ejecutaremos nuestros playbooks.
asmlib_configure.yaml
El playbook asmlib_configure.yaml vieje a ser el equialente a la ejecucion manual de oracleasm configure -i
Como podeis ver en el codigo que es bastante basico, ejecuta la configuracion del oracleasm para cada uno de los campos obteniendo la informacion del fichero de variables generico
[code lang=»py»]
# Pamplona 2019
# Playbook which configures_asmlib
#
# requires
# env: name of the server which should be in the inventory
# vars/oracle_standard.yaml configuration file with all the deppartment values
—
– hosts: "{{env}}"
remote_user: ansible
become: yes
become_user: root
tasks:
– fail: msg="Error no server definied, please define the env variable in the job"
when: env is not defined
– name: "Including standard variables"
include_vars:
file: "vars/oracle_standard.yaml"
– name: configirando usuario
command: /usr/sbin/oracleasm configure -u "{{oracle_user}}"
– name: configurando grupo
command: /usr/sbin/oracleasm configure -g "{{oracle_group}}"
– name: seteamos al arranque
command: /usr/sbin/oracleasm configure -e
– name: activamos el logical block
command: /usr/sbin/oracleasm configure -b
– name: arrancamos
command: /usr/sbin/oracleasm init
– name: estado
command: /usr/sbin/oracleasm status
register: oasm_status
[/code]
asmlib_create_disks.yaml
El segundo paso es la creacion de los discos en el asmlib .
Este es el playbook que va a requerir de ese fichero externo [REQ]_asm_create_disks, para cada uno de los discos fisios incluidos.
[code lang=»py»]
# Pamplona 2019
# Playbook which checks if the hosts has all the requested prerequisites
#
# requires
# env: name of the server which should be in the inventory
# REQ: number of request
# vars/oracle_standard.yaml configuration file with all the department values
—
– hosts: "{{env}}"
remote_user: ansible
become: yes
become_user: root
tasks:
– fail: msg="Error no server definied, please define the env variable or de request number in the job"
when: env is not defined or req is not defined
– name: "Including standard variables"
include_vars:
file: "vars/oracle_standard.yaml"
– name: "Including So {{version}} requisites"
include_vars:
file: "files/{{req|upper}}_asm_create_disks.yaml"
– name: creating DATA disks
shell:
cmd: "/usr/sbin/asmtool -C -l /dev/oracleasm -n {{oracle_hostname|upper}}_DATA0{{ansible_loop.index}} -s {{item}} -a force=yes "
loop: "{{DATA}}"
loop_control:
extended: yes
– name: Creating FRA disks
shell:
cmd: "/usr/sbin/asmtool -C -l /dev/oracleasm -n {{oracle_hostname|upper}}_FRA0{{ansible_loop.index}} -s {{item}} -a force=yes "
loop: "{{FRA}}"
loop_control:
extended: yes
– name: Creating REDO1 disks
shell:
cmd: "/usr/sbin/asmtool -C -l /dev/oracleasm -n {{oracle_hostname|upper}}_REDO1_{{ansible_loop.index}} -s {{item}} -a force=yes "
loop: "{{REDO1}}"
loop_control:
extended: yes
– name: Creating REDO2 disks
shell:
cmd: "/usr/sbin/asmtool -C -l /dev/oracleasm -n {{oracle_hostname|upper}}_REDO2_{{ansible_loop.index}} -s {{item}} -a force=yes "
loop: "{{REDO2}}"
loop_control:
extended: yes
– name: scanning disks
shell:
cmd: "/usr/sbin/oracleasm scandisks"
[/code]
debilidades
-Como curiosidad podeis ver que en mi taller no sigo las normativa de oracle, llamando a los diskgroups HOSTNAME_DATA en ved de DATA y manteniendo 2 grupos de REDO en ved e uno.
-Este playbook solamente puede usarse para provisionamiento y no para añadir nuevos discos a un diskgroup ya exsistente ya que numerara los discos empezando desde cero. (uso del fact ansible_loop.index)
Creacion del asm
Llegados a este punto, tenemos el grid corriendo, el listener arriba y los dispositivos creados , por lo que solamente nos queda el crear el ASM
El siguiente playbook simplemente va a llevar a cabo una creacion del ASM en modo command line silent y añadirle los discos a sus respectivos diskgroups
[code lang=»py»]
# Pamplona 2020
# Playbook which creates a database
#
# requires
# env: name of the server which should be in the inventory
# vars/oracle_standard.yaml standard values for Oracle
#
—
– hosts: "{{env}}"
vars:
type: asm
remote_user: ansible
tasks:
# checking prerequisites
– fail:
msg: "Error no server defined, please define the env variable in the job"
when: env is not defined
# Loading env
– name: Including Standard_values
include_vars:
file: "vars/oracle_standard.yaml"
– name: checking oratab
shell:
cmd: "cat /etc/oratab|grep +ASM |sed -e ‘s/# line added by Agent/ /g’ -e ‘s/:/ /g’|awk ‘{ print $1}’ "
register: count
– fail:
msg: "ERROR: The chain {{item}} exists at {{env}} /etc/oratab file "
when: item == "+ASM"
with_items:
– "{{count.stdout_lines}}"
– set_fact:
oracle_home: "{{oracle_home_directory.asm}}"
when: type == ‘asm’
– name: Creating syslog file
copy:
dest: /etc/rsyslog.d/30-oracle.conf
content: |
"local0.info {{oracle_home}}/rdbms/audit/asmaudit.log
&~"
force: yes
become: yes
become_user: root
– name: Creating logrotate file
copy:
dest: /etc/logrotate.d/30-oracle_logs
content: |
"{{oracle_home}}/rdbms/audit/asmaudit.log {
weekly
rotate 4
compress
copytruncate
delaycompress
notifyempty
}"
force: yes
become: yes
become_user: root
– name: create ASM
become: yes
become_user: "{{oracle_user}}"
shell:
cmd: "{{ oracle_home }}/bin/asmca -silent
-configureASM
-sysAsmPassword {{sysasm_passd}}
-asmsnmpPassword {{asmdbsnmp_passwd}}
-diskString \"/dev/oracleasm/disks/*\"
-diskGroupName {{oracle_hostname|upper}}_DATA
-disk \"/dev/oracleasm/disks/{{oracle_hostname|upper}}_DATA*\"
-param ASM_POWER_LIMIT=1
-param DIAGNOSTIC_DEST={{oracle_base}}
-param AUDIT_SYSLOG_LEVEL=’local0.info’
-param AUDIT_SYS_OPERATIONS=TRUE
-redundancy EXTERNAL"
– name: Create FRA, REDO1 and REDO2
become: yes
become_user: "{{oracle_user}}"
shell:
cmd: "{{ oracle_home }}/bin/asmca -silent
-createDiskGroup
-sysAsmPassword {{sysasm_passd}}
-diskString \"/dev/oracleasm/disks/*\"
-diskGroupName {{oracle_hostname|upper}}_{{item}}
-disk \"/dev/oracleasm/disks/{{oracle_hostname|upper}}_{{item}}*\"
-redundancy EXTERNAL "
with_items:
– FRA
– REDO1
– REDO2
[/code]