{"id":2161,"date":"2019-12-22T20:51:57","date_gmt":"2019-12-22T19:51:57","guid":{"rendered":"http:\/\/clemente.pamplona.name\/dba\/?p=2161"},"modified":"2020-02-06T09:41:50","modified_gmt":"2020-02-06T08:41:50","slug":"creacion-de-discos-y-asm-con-ansible","status":"publish","type":"post","link":"http:\/\/clemente.pamplona.name\/dba\/creacion-de-discos-y-asm-con-ansible\/","title":{"rendered":"Creaci\u00f3n de Discos y ASM  con Ansible"},"content":{"rendered":"<p>Siguiendo con las entradas de <a href=\"http:\/\/clemente.pamplona.name\/dba\/aprovisionamiento-de-una-base-de-datos-con-ansible\/\" rel=\"noopener noreferrer\" target=\"_blank\">Aprovisionamiento de una base de datos con ansible<\/a> vamos a ver la manera de automatizar la configuracion de discos de ASM mediante ansible.<\/p>\n<p>Supongamos tenemos los prerrequisitos:<\/p>\n<ul>\n<li> Un servidor OEL7 con el CRS instalado y el listener en marcha tal y como explicabamos en <a href=\"http:\/\/clemente.pamplona.name\/dba\/instalando-el-grid-infraesturcure-con-ansible\/\" rel=\"noopener noreferrer\" target=\"_blank\">Instalando el grid infraesturcure con Ansible<\/a>\n<ul>\n<li> Dos discos para nuestro diskgroup DATA\n<li> un disco para nuestro diskgroup FRA\n<li> un disco para nuestro diskgroup REDO1\n<li> un disco para nuestro diskgroup REDO2\n<ul>\n<p>Para la ejecucion de nuestro taller de creacion de asm usaremos los siguientes ficheros del repositorio <\/p>\n<pre>\r\nRaiz\r\n|\r\n|- vars:\r\n     |- oracle_standard.yaml      Fichero con los estandares del departamento\r\n|\r\n|- templates\r\n|\r\n |- files\r\n |-REQ01_asm_create_disks.yaml  Ejemplo de informacon de  provisionamiento de discos para el ASM \r\n|  \r\n| asmlib_configure.yaml         Playbook que configura el asmlib\r\n| asmlib_create_disks.yaml      Playbook que configura los discos de ASM \r\n| asm_create.yaml               Playbook que crea una instancia +ASM con en el GRID y con los discos previamente instalados\r\n<\/pre>\n<h1> Ficheros de variables <\/h1>\n<p>Al igual que en el resto de ejecuciones del taller vamos a necesitar el fichero <i>oracle_standard.yaml <\/i>que contiene todas la estandarizacion de nuestro departamento <\/p>\n<h1> Ficheros informacion <\/h1>\n<p>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 <b>files<\/b>, que va a ser el unico directorio donde deberemos\/podremos modificar los ficheros .<\/p>\n<p>El formato del fichero sera el de una lista en <i>yaml<\/i> en el que indicaremos el nombre del dispositivo para cada uno de los diskgroups.<br \/>\n[code lang=\u00bbpy\u00bb]<br \/>\nDATA:<br \/>\n  &#8211; \/dev\/sda<br \/>\n  &#8211; \/dev\/sdb<br \/>\nFRA:<br \/>\n  &#8211; \/dev\/sdc<br \/>\nREDO1:<br \/>\n  &#8211; \/dev\/sdd<br \/>\nREDO2:<br \/>\n  &#8211; \/dev\/sde<br \/>\n[\/code]<\/p>\n<p>El nomre del fichero sera <b>[REQ]<\/b>_asm_create_disks. Donde REQ es el valor en mayusculas de la variable <b>req<\/b> 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\u00f1ia.<\/p>\n<h1> Creacion de los discos <\/h1>\n<p>Una vez tenemos claros los ficheros  de fuentes y variables ejecutaremos nuestros playbooks.<\/p>\n<h2> asmlib_configure.yaml<\/h2>\n<p>El playbook  asmlib_configure.yaml vieje a ser el equialente a la ejecucion manual de <i> oracleasm configure -i <\/i><br \/>\nComo 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<\/p>\n<p>[code lang=\u00bbpy\u00bb]<br \/>\n# Pamplona 2019<br \/>\n#  Playbook which configures_asmlib<br \/>\n#<br \/>\n#  requires<br \/>\n#    env:                             name of the server  which should be in the inventory<br \/>\n#    vars\/oracle_standard.yaml        configuration file with all the deppartment values<br \/>\n&#8212;<br \/>\n&#8211; hosts: &quot;{{env}}&quot;<br \/>\n  remote_user: ansible<br \/>\n  become: yes<br \/>\n  become_user: root<br \/>\n  tasks:<br \/>\n   &#8211; fail: msg=&quot;Error no server definied, please define the env variable in the job&quot;<br \/>\n     when: env is not defined<\/p>\n<p>   &#8211; name: &quot;Including standard variables&quot;<br \/>\n     include_vars:<br \/>\n       file: &quot;vars\/oracle_standard.yaml&quot;<br \/>\n   &#8211; name:    configirando usuario<br \/>\n     command: \/usr\/sbin\/oracleasm configure -u &quot;{{oracle_user}}&quot;<\/p>\n<p>   &#8211; name:     configurando grupo<br \/>\n     command:  \/usr\/sbin\/oracleasm configure -g  &quot;{{oracle_group}}&quot;<\/p>\n<p>   &#8211; name:     seteamos al arranque<br \/>\n     command: \/usr\/sbin\/oracleasm configure -e<\/p>\n<p>   &#8211; name:    activamos el logical block<br \/>\n     command:   \/usr\/sbin\/oracleasm configure -b <\/p>\n<p>   &#8211; name:    arrancamos<br \/>\n     command:   \/usr\/sbin\/oracleasm init<\/p>\n<p>   &#8211; name:         estado<br \/>\n     command:      \/usr\/sbin\/oracleasm status<br \/>\n     register:     oasm_status<\/p>\n<p>[\/code]<\/p>\n<h2> asmlib_create_disks.yaml<\/h2>\n<p>El segundo paso es la creacion de los discos en el asmlib .<br \/>\nEste es el playbook que va a requerir de ese fichero externo <b>[REQ]<\/b>_asm_create_disks, para cada uno de los discos fisios incluidos.<\/p>\n<p>[code lang=\u00bbpy\u00bb]<br \/>\n# Pamplona 2019<br \/>\n#  Playbook which checks if the hosts has all the requested prerequisites<br \/>\n#<br \/>\n#  requires<br \/>\n#    env:                             name of the server  which should be in the inventory<br \/>\n#    REQ:                             number of request<br \/>\n#    vars\/oracle_standard.yaml        configuration file with all the department values<br \/>\n&#8212;<br \/>\n&#8211; hosts: &quot;{{env}}&quot;<br \/>\n  remote_user: ansible<br \/>\n  become: yes<br \/>\n  become_user: root<br \/>\n  tasks:<br \/>\n  &#8211; fail: msg=&quot;Error no server definied, please define the env variable or de request number in the job&quot;<br \/>\n    when: env is not defined or req is not defined<\/p>\n<p>  &#8211; name: &quot;Including standard variables&quot;<br \/>\n    include_vars:<br \/>\n     file: &quot;vars\/oracle_standard.yaml&quot;<\/p>\n<p>  &#8211; name: &quot;Including So {{version}} requisites&quot;<br \/>\n    include_vars:<br \/>\n     file: &quot;files\/{{req|upper}}_asm_create_disks.yaml&quot;<\/p>\n<p>  &#8211; name: creating DATA disks<br \/>\n    shell:<br \/>\n     cmd: &quot;\/usr\/sbin\/asmtool -C -l \/dev\/oracleasm -n {{oracle_hostname|upper}}_DATA0{{ansible_loop.index}} -s {{item}} -a  force=yes &quot;<br \/>\n    loop: &quot;{{DATA}}&quot;<br \/>\n    loop_control:<br \/>\n     extended: yes<\/p>\n<p>  &#8211; name: Creating  FRA disks<br \/>\n    shell:<br \/>\n     cmd: &quot;\/usr\/sbin\/asmtool -C -l \/dev\/oracleasm -n {{oracle_hostname|upper}}_FRA0{{ansible_loop.index}} -s {{item}} -a  force=yes &quot;<br \/>\n    loop: &quot;{{FRA}}&quot;<br \/>\n    loop_control:<br \/>\n     extended: yes<\/p>\n<p>  &#8211; name: Creating REDO1 disks<br \/>\n    shell:<br \/>\n     cmd: &quot;\/usr\/sbin\/asmtool -C -l \/dev\/oracleasm -n {{oracle_hostname|upper}}_REDO1_{{ansible_loop.index}} -s {{item}} -a force=yes &quot;<br \/>\n    loop: &quot;{{REDO1}}&quot;<br \/>\n    loop_control:<br \/>\n     extended: yes<\/p>\n<p>  &#8211; name: Creating REDO2 disks<br \/>\n    shell:<br \/>\n     cmd: &quot;\/usr\/sbin\/asmtool -C -l \/dev\/oracleasm -n {{oracle_hostname|upper}}_REDO2_{{ansible_loop.index}} -s {{item}} -a force=yes &quot;<br \/>\n    loop: &quot;{{REDO2}}&quot;<br \/>\n    loop_control:<br \/>\n     extended: yes<\/p>\n<p>  &#8211; name: scanning disks<br \/>\n    shell:<br \/>\n     cmd: &quot;\/usr\/sbin\/oracleasm scandisks&quot;<\/p>\n<p>[\/code]<br \/>\n<font color=red> debilidades <\/font><br \/>\n-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.<br \/>\n-Este playbook solamente puede usarse para provisionamiento y no para a\u00f1adir nuevos discos a un diskgroup ya exsistente ya que numerara los discos empezando desde cero. (uso del fact <i>ansible_loop.index<\/i>)<\/p>\n<h2> Creacion del asm <\/h2>\n<p>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<br \/>\nEl siguiente playbook simplemente va a llevar a cabo una creacion del ASM en modo command line silent y a\u00f1adirle los discos a sus respectivos diskgroups <\/p>\n<p>[code lang=\u00bbpy\u00bb]<br \/>\n#  Pamplona 2020<br \/>\n#  Playbook which creates a database<br \/>\n#<br \/>\n# requires<br \/>\n#   env:                                     name of the server  which should be in the inventory<br \/>\n#   vars\/oracle_standard.yaml                 standard values for Oracle<br \/>\n#<br \/>\n&#8212;<br \/>\n&#8211; hosts: &quot;{{env}}&quot;<br \/>\n  vars:<br \/>\n    type: asm<br \/>\n  remote_user: ansible<br \/>\n  tasks:<\/p>\n<p> # checking prerequisites<br \/>\n   &#8211; fail:<br \/>\n       msg: &quot;Error no server defined, please define the env variable in the job&quot;<br \/>\n     when: env is not defined <\/p>\n<p># Loading env<br \/>\n   &#8211; name: Including Standard_values<br \/>\n     include_vars:<br \/>\n      file: &quot;vars\/oracle_standard.yaml&quot;<\/p>\n<p>   &#8211; name: checking oratab<br \/>\n     shell:<br \/>\n       cmd: &quot;cat \/etc\/oratab|grep +ASM |sed -e &#8216;s\/# line added by Agent\/ \/g&#8217; -e &#8216;s\/:\/ \/g&#8217;|awk &#8216;{ print $1}&#8217; &quot;<br \/>\n     register: count<\/p>\n<p>   &#8211; fail:<br \/>\n       msg: &quot;ERROR: The chain {{item}} exists at  {{env}}  \/etc\/oratab file &quot;<br \/>\n     when: item ==  &quot;+ASM&quot;<br \/>\n     with_items:<br \/>\n      &#8211; &quot;{{count.stdout_lines}}&quot;<\/p>\n<p>   &#8211; set_fact:<br \/>\n      oracle_home: &quot;{{oracle_home_directory.asm}}&quot;<br \/>\n     when: type == &#8216;asm&#8217;<\/p>\n<p>   &#8211; name: Creating syslog file<br \/>\n     copy:<br \/>\n      dest: \/etc\/rsyslog.d\/30-oracle.conf<br \/>\n      content: |<br \/>\n       &quot;local0.info {{oracle_home}}\/rdbms\/audit\/asmaudit.log<br \/>\n       &amp;~&quot;<br \/>\n      force: yes<br \/>\n     become: yes<br \/>\n     become_user: root  <\/p>\n<p>   &#8211; name: Creating logrotate file<br \/>\n     copy:<br \/>\n       dest: \/etc\/logrotate.d\/30-oracle_logs<br \/>\n       content: |<br \/>\n         &quot;{{oracle_home}}\/rdbms\/audit\/asmaudit.log {<br \/>\n           weekly<br \/>\n           rotate 4<br \/>\n           compress<br \/>\n           copytruncate<br \/>\n           delaycompress<br \/>\n           notifyempty<br \/>\n          }&quot;<br \/>\n       force: yes<br \/>\n     become: yes<br \/>\n     become_user: root<\/p>\n<p>   &#8211; name: create ASM<br \/>\n     become: yes<br \/>\n     become_user: &quot;{{oracle_user}}&quot;<br \/>\n     shell:<br \/>\n       cmd: &quot;{{ oracle_home }}\/bin\/asmca  -silent<br \/>\n         -configureASM<br \/>\n         -sysAsmPassword {{sysasm_passd}}<br \/>\n         -asmsnmpPassword {{asmdbsnmp_passwd}}<br \/>\n         -diskString \\&quot;\/dev\/oracleasm\/disks\/*\\&quot;<br \/>\n         -diskGroupName {{oracle_hostname|upper}}_DATA<br \/>\n         -disk \\&quot;\/dev\/oracleasm\/disks\/{{oracle_hostname|upper}}_DATA*\\&quot;<br \/>\n         -param ASM_POWER_LIMIT=1<br \/>\n         -param DIAGNOSTIC_DEST={{oracle_base}}<br \/>\n         -param AUDIT_SYSLOG_LEVEL=&#8217;local0.info&#8217;<br \/>\n         -param AUDIT_SYS_OPERATIONS=TRUE<br \/>\n         -redundancy EXTERNAL&quot;<\/p>\n<p>   &#8211; name:  Create  FRA, REDO1 and REDO2<br \/>\n     become: yes<br \/>\n     become_user: &quot;{{oracle_user}}&quot;<br \/>\n     shell:<br \/>\n       cmd: &quot;{{ oracle_home }}\/bin\/asmca  -silent<br \/>\n         -createDiskGroup<br \/>\n         -sysAsmPassword {{sysasm_passd}}<br \/>\n         -diskString \\&quot;\/dev\/oracleasm\/disks\/*\\&quot;<br \/>\n         -diskGroupName {{oracle_hostname|upper}}_{{item}}<br \/>\n         -disk \\&quot;\/dev\/oracleasm\/disks\/{{oracle_hostname|upper}}_{{item}}*\\&quot;<br \/>\n         -redundancy EXTERNAL  &quot;<br \/>\n     with_items:<br \/>\n       &#8211; FRA<br \/>\n       &#8211; REDO1<br \/>\n       &#8211; REDO2<br \/>\n[\/code]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Siguiendo con las entradas de Aprovisionamiento de una base de datos con ansible vamos a ver la manera de automatizar la configuracion de discos de ASM mediante ansible. Supongamos tenemos los prerrequisitos: Un servidor OEL7 con el CRS instalado y &hellip; <a href=\"http:\/\/clemente.pamplona.name\/dba\/creacion-de-discos-y-asm-con-ansible\/\">Sigue leyendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[975,976,43],"tags":[980,132,37,993],"class_list":["post-2161","post","type-post","status-publish","format-standard","hentry","category-19c","category-ansible","category-grid","tag-ansible","tag-asm-2","tag-asmlib","tag-provisionamiento"],"_links":{"self":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/2161","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/comments?post=2161"}],"version-history":[{"count":10,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/2161\/revisions"}],"predecessor-version":[{"id":2175,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/2161\/revisions\/2175"}],"wp:attachment":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/media?parent=2161"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/categories?post=2161"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/tags?post=2161"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}