Olá pessoal,

Espero que estejam bem!

No meu último blog post eu mostrei como fazer o update do Oracle Enterprise Manager e seus OEM Agents do RU 13.5.0.16 para o RU 13.5.0.20. Você pode ver aqui:

Como atualizar o Oracle Enterprise Manager do RU 13.5.0.16 para o RU 13.5.0.20

No blog post mencionado acima, um dos passos mandatories é de aplicar o Release Update 13.5.0.20 nos OEM Agents depois de aplicar o Release Update no OEM/OMS.

Uma das tarefas quando estamos atualizando o OEM é aplicar o RU nos OEM Agents também, e usualmente, o pré-requisito é de ter a última versão do AgentPatcher, o qual eu mostrei como atualizar no blog post mencionado acima. Há algum tempo atrás, eu escrevi um blog post mostrando como atualizar o AgentPatcher usando um playbook Ansible, portanto, a gente consegue acelerar essa ação executando esse playbook Ansible em todos os servidores que precisamos atualizar o o OEM Agent. Você pode ver sobre esse playbook Ansible aqui:

Ansible Playbook para atualizar o AgentPatcher dos Agentes do OEM

A gente já sabe que depois de atualizar o AgentPatcher, nós precisamos aplicar o RU 13.5.0.20 nos OEM Agents usando o recurso Patches & Updates do Oracle Enterprise Manager, o qual eu mostro no primeiro blog post mencionado. Esse recurso, Patches & Updates, funciona muito bem, mas, algumas vezes, nós precisamos confirmar/listar a versão de RU que estamos usando nos OEM Agents. Por exemplo, eu gostaria de confirmar a versão de RU que estamos rodando após termos aplicado o patch. De uma maneira bastante simples, nós podemos rodar o seguinte comando com o usuário que é o dono do OEM Agent no nosso servidor:

ORACLE_HOME=$(ps -ef |grep ‘emwd.pl agent’ | grep -v grep | awk ‘{print $8}’ | sed ‘s/\/perl\/bin\/perl//g’)

${ORACLE_HOME}/AgentPatcher/agentpatcher lspatches | grep ‘oracle.sysman.top.agent/13.’ | awk ‘{for (i=5; i<=NF; i++) printf “%s “, $i; printf “\n”}’

Oracle Enterprise Manager 13c Release 5 Platform Update 20 (13.5.0.20) for Oracle Management Agent

Perfeito! Mas, imagine que nós temos dezenas ou centenas de servidores. Seria péssimo ter que gastar tempo rodando esse comando manualmente em todos os servidores, não?

Se você possui Ansible no seu ambiente, você pode automatizar isso. Eu vou mostrar nesse blog post um simples Playbook Ansible para realizar essa tarefa. Portanto, com o Ansible, não importa se você possui um servidor ou milhares de servidores para realizar a atividade. O tempo que você gastará será aproximadamente o mesmo!

Nota importante: esse playbook é uma versão “0”. Basicamente, o único módulo que estou usando do Ansible é o shell.

Eu não vou explicar os arquivos compartilhados abaixo em detalhes, até porque muitos são fáceis de serem compreendidos. Os arquivos ansible.cfg e check_Agent_Patch.yml possuem alguns parâmetros necessários para o funcionamento do Ansible, eu te encorajo a ler a documentação do Ansible para maiores detalhes. Será um prazer te ajudar caso tenha alguma dúvida, mas por favor, tenha em mente que eu não sou um grant expert em Ansible!

Abaixo temos uma estrutura de diretórios básica para esse playbook:

Explicando um pouco sobre a estrutura de diretórios acima:

  • ansible.cfg: parâmetros básicos do Ansible. Nesse arquivo a gente pode descrever qual será o nome do arquivo de log que será gerado, qual será o usuário que se conectará via SSH do servidor do Ansible para os servidores onde temos os agentes de OEM sendo executados, e alguns outros parâmetros;
  • main.log: o arquivo para o log de execuções do Ansible;
  • check_Agent_patch.yml: o arquivo de playbook, nesse arquivo, nós temos alguns outros pâmetros que o Ansible, também temos as roles que o Ansible executará. Nesse caso, o Ansible executará uma única role chamada check_Agent_Patch;
  • inventories/OEM_Agents/hosts: a lista dos hosts onde o Ansible precisará se conectar para executar as atividades;
  • roles/check_Agent_Patch/tasks/main.yml: todas as tarefas que a role check_Agent_Patch realizará.

Portanto, abaixo, temos o conteúdo na íntegra de cada arquivo descrito acima, exceto o arquivo de log.

ansible.cfg:


[defaults]

# output
display_skipped_hosts = no
stdout_callback = default

# allow new fingerprints
host_key_checking = false

# inventory
inventory = inventories/OEM_Agents/hosts

# logging
log_path = main.log

# retry
retry_files_enabled = False

# default ssh user
remote_user = svc_ansible

# general settings
timeout = 120
forks = 50

[ssh_connection]
pipelining = true
scp_if_ssh = true

check_Agent_Patch:


---

- hosts: all
  gather_facts: true
  any_errors_fatal: true
  become: true
  pre_tasks:

 
  roles:

    - { role: check_Agent_Patch } 

inventories/OEM_Agents/hosts:


SERVER01
SERVER02
SERVER03
SERVER04
SERVER05
SERVER06
SERVER07
SERVER08
SERVER09
SERVER10
SERVER11
SERVER12
SERVER13
SERVER14
SERVER15
SERVER16
SERVER17
SERVER18
SERVER19
SERVER20
SERVER21
SERVER22
SERVER23
SERVER24
SERVER25
SERVER26
SERVER27
SERVER28
OEM-01

roles/check_Agent_Patch/tasks/main.yml:


---

- name: get the AGENT_OWNER
  shell: |
    ps -ef |grep agent_13 | grep -v grep | grep emw | awk '{print $1}'
  register: agent_owner_ps
  become_user: root

- name: get the AGENT_HOME
  shell: |
    ps -ef |grep 'emwd.pl agent' | grep -v grep | awk '{print $8}' | sed 's/\/perl\/bin\/perl//g
  register: agent_home_ps
  become_user: root


- name: set facts
  set_fact:
    agent_home: '{{ agent_home_ps.stdout }}'
    agent_owner: '{{ agent_owner_ps.stdout }}'

- name: get the main patch applied
  shell: |
    ${ORACLE_HOME}/AgentPatcher/agentpatcher lspatches | grep 'oracle.sysman.top.agent/13.' | awk '{for (i=5; i<=NF; i++) printf "%s ", $i; printf "\n"}
  environment:
    ORACLE_HOME: "{{ agent_home }}"
    PATH: "{{ agent_home }}/bin;/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin"
  register: agentpatcher_lspatches
  become_user: "{{ agent_owner }}"

- name: show the main patch applied on Agent
  debug:
    msg: "{{ agentpatcher_lspatches.stdout }}"


Como você pode ver no arquivo acima, estou definindo o owner do OEM Agent através do processo no Sistema Operacional, também estou definindo o ORACLE_HOME à partir do processo no SO, rodando o utilitário agentpatcher e salvando seu output numa variável chamada agentpatcher_lspatches, e, como último passo, mostrando o output/saída para essa variável.

Para executar o playbook, você primeiro precisa definir qual ansible.cfg você gostaria de usar. A gente pode usar o mesmo arquivo que está no nosso diretório.

Abaixo estou mostrando como executar o playbook e também mostrando apenas uma parte do output (que foi truncado para facilitar a leitura):

export ANSIBLE_CONFIG=`pwd`/ansible.cfg

ansible-playbook check_Agent_Patch.yml


TASK [update_AgentPatcher : show the new version of AgentPatcher] ************************************************
ok: [SERVER01] => {
“msg”: “Oracle Enterprise Manager 13c Release 5 Platform Update 20 (13.5.0.20) for Oracle Management Agent”
}
ok: [SERVER02] => {
“msg”: “Oracle Enterprise Manager 13c Release 5 Platform Update 20 (13.5.0.20) for Oracle Management Agent”
}
ok: [SERVER03] => {
“msg”: “Oracle Enterprise Manager 13c Release 5 Platform Update 20 (13.5.0.20) for Oracle Management Agent”
}

PLAY RECAP *******************************************************************************************************
SERVER01 : ok=9 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
SERVER02 : ok=9 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
SERVER03 : ok=9 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

PS: o playbook só retornará valores se você já tiver algum RU instalado no seu agente. Se você ainda não tiver nenhum RU instalado, o resultado será em branco.

Espero que seja útil!

Um abraço!

Vinicius