Oct 22, 2015

Patching του Weblogic με την βοήθεια του Ansible

To Ansible είναι από τα εργαλεία αυτοματισμού που με απλό και δομημένο τρόπο λύνουν τα χέρια των DevOps και γλυτώνουν κυριολεκτικά πάρα πολλές ώρες επαναλαμβανόμενων εργασιών. Ως προς τα προϊόντα της Oracle θαυμάσιες πηγές παραδειγμάτων Ansible είναι για την Oracle Database (και το RAC) το oravirt, ενώ για το μεσαίο επίπεδο το Middleware Snippets. H πρόσφατη μάλιστα εξαγορά του από την RedHat αναμένεται να δώσει ακόμα μεγαλύτερη ώθηση στο προϊόν.

Σε αυτό το άρθρο θα ήθελα να δώσω ένα παράδειγμα patching του Weblogic με την χρήση του Ansible. Για να κάνουμε τα πράγματα πιο δύσκολα, παλαιότερες εκδόσεις του Weblogic χρησιμοποιούσαν για αυτήν την δουλειά το Smart Update (bsu) ενώ νεότερες εκδόσεις (συμπεριλαμβανομένης και της 12c) το opatch. Για την απλότητα των πραγμάτων θα κατασκευάσουμε έναν Ansible ρόλο, έστω weblogic-patching. Στον κατάλογο vars/ ας φτιάξουμε το αρχείο weblogic_patches.yml με έστω τα περιεχόμενα:

patches:
- { patch_id: '19637454', patch_dist: 'p19637454_121300_Generic.zip', patch_type
: 'opatch', flags: 'apply', oh: "{{ mw_home }}" }
- { patch_id: '19637463', patch_dist: 'p19637463_1036_Generic.zip', patch_type:
'bsu', flags: '', oh: "{{ mw_home }}" }

H μεταβλητή patches ορίζεται λοιπόν ως ένα collection, που περιλαμβάνει δυο στοιχεία: τα δυο patches που θέλουμε να εφαρμόσουμε. Μπορούμε φυσικά να βάλουμε όσες εγγραφές (patches) χρειαζόμαστε. Στον τύπο αυτών των στοιχείων έχουμε ορίσει το patch_id, την τοποθεσία του στον Ansible host καθώς και ένα attribute, το patch_type, που διακρίνεται σε opatch ή bsu. Επίσης, υπάρχει μια άλλη ιδιότητα που ονομάζεται flags και αφορά πρόσθετες παραμέτρους για το patching.

To playbook μας θα ενσωματώσει το αρχείο των μεταβλητών και θα τις χρησιμοποιήσει για να καλέσει τον κατάλληλο ρόλο:

# hosts could come from tags
- name: Patch Weblogic
  hosts: all
  vars_files:
    - vars/weblogic_patches.yml
  remote_user: root
  gather_facts: no

  roles:
    - {role: weblogic-patching, patch_list: "{{ patches }}" }

Ενώ ο weblogic-patching ρόλος θα κάνει διάσχιση του patches collection και θα αποφασίσει τι θα κάνει ανάλογα με την τιμή του patch_type. Σε αυτό θα μας βοηθήσει η εντολή when του Ansible:

...
- name: launch OPatch
  su: yes
  su_user: oracle
  shell: "export ORACLE_HOME={{ item.oh }};export PATH={{ item.oh }}/OPatch:$PATH;opatch {{ item.flags }} < {{ oracle_base }}/patches/silent.iss"
  args:
     chdir: "{{ oracle_base }}/patches/current/{{ item.patch_id }}"
  with_items: patches
  when: item.patch_type == 'opatch'

- name: launch bsu
  su: yes
  su_user: oracle
  shell: "./bsu.sh -install -patch_download_dir={{ mw_home }}/utils/bsu/cache_dir -patchlist={{ item.patch_id }} -prod_dir={{ mw_home }}/{{ wl_home_11g }}"
  args:
     chdir: "{{ mw_home }}/utils/bsu"
  with_items: patches
  when: item.patch_type == 'bsu'
 

2 comments:

chris said...

Nice post, thanks for sharing!

Serafeim Karapatis said...

Thanks Chris !

I always anticipate for your blog postings !

Serafeim.