{"id":2141,"date":"2020-02-02T21:28:20","date_gmt":"2020-02-02T20:28:20","guid":{"rendered":"http:\/\/clemente.pamplona.name\/dba\/?p=2141"},"modified":"2020-04-15T16:26:59","modified_gmt":"2020-04-15T14:26:59","slug":"plataformando-el-sistema-operativo-con-ansible","status":"publish","type":"post","link":"http:\/\/clemente.pamplona.name\/dba\/plataformando-el-sistema-operativo-con-ansible\/","title":{"rendered":"Plataformando el sistema operativo con Ansible"},"content":{"rendered":"<p>Hoy vamos a recuperar la entrada de como preparar el sitema operativo (en este caaso un OEL 7)para una instalacion de Oracle.<\/p>\n<p>Para esto vamos a usar el role  <a href=\"https:\/\/github.com\/pamplonaDBA\/provisioning\/tree\/master\/roles\/so_check\" rel=\"noopener noreferrer\" target=\"_blank\">so_check<\/a> del que podemos encontrar la ultima version en nuestro <a href=\"https:\/\/github.com\/pamplonaDBA\/provisioning\" rel=\"noopener noreferrer\" target=\"_blank\">GitHub<\/a><\/p>\n<p>Este Playbok no hace nada del otro mundo, ya que simplemente traslada a Ansible los pasos que llevamos a cabo una y otra vez cada vez que preparamos un servidor, como vereis lo mas complicado del mismo es la sintaxsis.<\/p>\n<p>Veamos el codigo completo y luego lo analizaremos por partes <\/p>\n<p>[code lang=\u00bbpy\u00bb]<br \/>\n# Pamplona 2019<br \/>\n#  Playbook which checks if teh hosts has all the requested prereequisites<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#    vars\/so_[version]_requisites.yaml        configuration file with the packages required for this version of the software<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;<\/p>\n<p>  &#8211; name: &quot;Including So {{version}} requisites&quot;<br \/>\n    include_vars:<br \/>\n     file: &quot;vars\/so_{{version}}_requisites.yaml&quot;<\/p>\n<p>  &#8211; name: Chequeamos the group<br \/>\n    group:<br \/>\n     name: &quot;{{oracle_group}}&quot;<br \/>\n     gid: &quot;{{oracle_gid}}&quot;<br \/>\n     state: present<br \/>\n    tags: oragroup<\/p>\n<p>  &#8211; name: Check the oracle user<br \/>\n    user:<br \/>\n      name: &quot;{{oracle_user}}&quot;<br \/>\n      uid:  &quot;{{oracle_uid}}&quot;<br \/>\n      group: &quot;{{oracle_group}}&quot;<br \/>\n      shell: \/bin\/bash<br \/>\n    tags: orauser    <\/p>\n<p>  &#8211; name: check required packages<br \/>\n    yum:<br \/>\n     name:  &quot;{{package_name}}&quot;<br \/>\n     state: latest<br \/>\n    tags: packages   <\/p>\n<p>  &#8211; name : Kernel values<br \/>\n    sysctl:<br \/>\n      name: &quot;{{ item.name }}&quot;<br \/>\n      value: &quot;{{item.value}}&quot;<br \/>\n      state: present<br \/>\n      ignoreerrors: yes<br \/>\n      sysctl_file: \/etc\/sysctl.d\/30-oracle.conf<br \/>\n    with_items: &quot;{{kernel_values}}&quot;<br \/>\n    tags: sysctl<\/p>\n<p>  ##We execute Huge Pages separately<br \/>\n  &#8211; name: Huge Pages<br \/>\n    sysctl:<br \/>\n        name: vm.nr_hugepages<br \/>\n        value: &quot;{{huge_pages}}&quot;<br \/>\n        sysctl_set: yes<br \/>\n        state: present<br \/>\n        sysctl_file: \/etc\/sysctl.d\/30-oracle.conf<br \/>\n        ignoreerrors: yes<br \/>\n    tags: huge_pages<\/p>\n<p>  &#8211; name: Limits para el usuario<br \/>\n    pam_limits:<br \/>\n      domain: oracle<br \/>\n      use_max: yes<br \/>\n      limit_type: &quot;{{ item.tipo }}&quot;<br \/>\n      limit_item: &quot;{{ item.name }}&quot;<br \/>\n      value: &quot;{{item.value}}&quot;<br \/>\n      dest: \/etc\/security\/limits.d\/30-oracle.conf<br \/>\n    with_items: &quot;{{limits}}&quot;<br \/>\n    tags: limits <\/p>\n<p>  &#8211; name: Disable firewall<br \/>\n    service:<br \/>\n      name: firewalld<br \/>\n      state: stopped<br \/>\n      enabled: no<br \/>\n    tags: firewall<\/p>\n<p>  &#8211; name:  disabling SElinux<br \/>\n    selinux:<br \/>\n     policy: targeted<br \/>\n     state: disabled<br \/>\n    tags: SELinux<br \/>\n[\/code]<\/p>\n<h1> Comprobamos usuarios y grupos <\/h1>\n<p>Lo primero que hacemos es la comprobacion de que tenemos los usuarios y grupos que necesitamos.<br \/>\nEn nuestro taller usamos la configuracion mas basica , que es <i> oracle:dba<\/i> para toda la instalacion <\/p>\n<h1> Comprobamos los paquetes del sistema operativo<\/h1>\n<p>En este bloque comprobamos los paquetes del sistema operativo.<br \/>\nPara ello usuaremos el modulo <b>yum<\/b> de Ansible con una lista de los paquetes, esta lista los vamos a leer de un fichero de variables en el que tendremos reflejado todo lo necesario para la plataformacion de un servidor para la version especifica de Oracle que tenemos.<\/p>\n<p>El conenido de este fichero refrente a  los paquetes es una simple lista<br \/>\n[code lang=\u00bbpy\u00bb]<br \/>\npackage_name :<br \/>\n  &#8211; binutils<br \/>\n  &#8211; oracleasm<br \/>\n  &#8211; oracleasm-support<br \/>\n  &#8211; compat-libcap1<br \/>\n  &#8211; compat-libstdc++-33<br \/>\n  &#8211; elfutils-libelf-devel<br \/>\n  &#8211; fontconfig-devel<br \/>\n  &#8211; glibc<br \/>\n  &#8211; glibc-devel<br \/>\n[\/code]<\/p>\n<h1> Valores del Kernel <\/h1>\n<p>El siguiente paso es el configurar los parametros del kernel que queremos.<br \/>\nPara este paso vamos a usar el modulo <b> sysctl<\/b>, aplicando tantos valores como queramos de nuestro fichero de requerimientos<br \/>\nLa sintaxsis de estos requerimientos es <\/p>\n<p>[code lang=\u00bbpy\u00bb]<br \/>\nkernel_values:<br \/>\n  &#8211; { name: fs.file-max, value: 6815744 }<br \/>\n  &#8211; { name: kernel.sem, value:  &quot;250 32000 100 128&quot; }<br \/>\n  &#8211; { name: kernel.shmmni, value: 4096 }<br \/>\n[\/code]<\/p>\n<h1> Huge Pages<\/h1>\n<p>Las Huge pages es un parametro del kernel como cualquier otro, podriamos haberlo incluido dentro de los kernel parameters pero a mi personalmente me gusta tenerlo separado .<br \/>\nEn nuestro caso no estamos dandole un valor fijo, sino que le asignamos el 60% del total del servidor <\/p>\n<p>[code lang=\u00bbpy\u00bb]<br \/>\n#60 percent huge pages<br \/>\nhuge_pages: &quot;{{((0.6 * ansible_memtotal_mb)*1024\/2)|round|int }}&quot;<br \/>\n[\/code]<\/p>\n<h1> Limites<\/h1>\n<p>El siguiente paso en la plataformacion del sistema operativo es ajustar los soft y hard limits para el usuario Oracle.<br \/>\nPara esto usaremos el modulo <b>pam_limits<\/b>. El codigo asociado del fichero de variables es muy similar al que usamos en el kernel y, al igual que haciamos con las huge pages obtendremos alguno de estos valores dinamicamente en funcion de los recursos del servidor que vayamos a plataformar <\/p>\n<p>[code lang=\u00bbpy\u00bb]<br \/>\nlimits:<br \/>\n  &#8211; { tipo: &#8216;soft&#8217; ,name: &#8216;nproc&#8217;, value: 16384 }<br \/>\n  &#8211; { tipo: &#8216;hard&#8217; ,name: &#8216;nproc&#8217;, value: 16384 }<br \/>\n  &#8211; { tipo: &#8216;soft&#8217; ,name: &#8216;memlock&#8217;, value: &quot;{{ ((0.9 * ansible_memtotal_mb)*1024)|round|int }}&quot; }<br \/>\n  &#8211; { tipo: &#8216;hard&#8217; ,name: &#8216;memlock&#8217;, value: &quot;{{ ((0.9 * ansible_memtotal_mb)*1024)|round|int }}&quot; }<br \/>\n[\/code]<\/p>\n<h1> Desabilitar SElinux y Firewall<\/h1>\n<p>Este ultimo paso es mas bien opcional, ya que no deberia de ser un requisito, pero, en la mayoria de las plataformaciones la seguridad suele estar delegada en los elementos de red y el SELinux se deshabilita, por lo que, lo hemos incluido en nuestro playbook <\/p>\n<p>[code lang=\u00bbpy\u00bb]<br \/>\n &#8211; name: Disable firewall<br \/>\n    service:<br \/>\n      name: firewalld<br \/>\n      state: stopped<br \/>\n      enabled: no<br \/>\n    tags: firewall<\/p>\n<p>  &#8211; name:  disabling SElinux<br \/>\n    selinux:<br \/>\n     policy: targeted<br \/>\n     state: disabled<br \/>\n    tags: SELinux<br \/>\n[\/code]<\/p>\n<p>Como habeis podido ver,como os comentaba al principio  no es nada del otro mundo, simplemente es trasladar a lenguaje de ansible los pasos que llevamos a cabo manualmente 1000 veces .<\/p>\n<p>Como siempre, esta entrada es solamente un taller basico, no dudeis en encontrar la ultima y valida version del role en <a href=\"https:\/\/github.com\/pamplonaDBA\/provisioning\">proyecto provisioning e GitHub<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoy vamos a recuperar la entrada de como preparar el sitema operativo (en este caaso un OEL 7)para una instalacion de Oracle. Para esto vamos a usar el role so_check del que podemos encontrar la ultima version en nuestro GitHub &hellip; <a href=\"http:\/\/clemente.pamplona.name\/dba\/plataformando-el-sistema-operativo-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":[921,975,976,8,41],"tags":[992,990,991,993],"class_list":["post-2141","post","type-post","status-publish","format-standard","hentry","category-18c","category-19c","category-ansible","category-parametrizacion","category-sistema-operativo","tag-automatizacion","tag-implantacion","tag-parametrizacion","tag-provisionamiento"],"_links":{"self":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/2141","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=2141"}],"version-history":[{"count":12,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/2141\/revisions"}],"predecessor-version":[{"id":2184,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/2141\/revisions\/2184"}],"wp:attachment":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/media?parent=2141"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/categories?post=2141"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/tags?post=2141"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}