Inscreva-se no feed

A capacidade de oferecer serviços aos clientes de forma contínua e com mínima ou nenhuma interrupção é essencial no mundo de hoje. O Red Hat Enterprise Linux (RHEL) High Availability Add-On ajuda você a atingir esse objetivo oferecendo mais confiabilidade, escalabilidade e disponibilidade aos sistemas de produção. Os clusters de alta disponibilidade (HA) fazem isso eliminando pontos únicos de falha e realizando failover de serviços de um nó de cluster para outro, caso um nó fique inoperante.

Neste post, demonstro o uso da função do sistema RHEL ha_cluster para configurar um cluster de HA executando um Servidor HTTP Apache com armazenamento compartilhado no modo ativo/passivo.

As funções do sistema RHEL são uma coleção de funções e módulos do Ansible inclusos no RHEL para oferecer fluxos de trabalho consistentes e simplificar a execução de tarefas manuais. Para obter mais informações sobre o cluster de HA do RHEL, consulte a documentação "Configuração e gerenciamento de clusters de alta disponibilidade."

Visão geral do ambiente

Em meu ambiente de exemplo, tenho um sistema de nós de controle nomeado controlnode e dois nós gerenciados, rhel8-node1 e rhel8-node2, todos executando RHEL 8.6. Os dois nós gerenciados são alimentados por um switch de alimentação da APC, cujo nome do host é apc-switch.

Quero criar um cluster denominado rhel8-cluster, que consiste nos nós rhel8-node1 e rhel8-node2. O cluster deve executar um Servidor HTTP Apache no modo ativo/passivo com um endereço IP flutuante servindo páginas de um sistema de arquivos ext4 montado em um volume lógico de LVM (gerenciamento de volume lógico). O apc-switch disponibiliza o fencing.

Os nós do cluster estão conectados ao armazenamento compartilhado com um sistema de arquivos ext4 montado em um volume lógico de LVM. Um Servidor HTTP Apache foi instalado e configurado em ambos os nós. Consulte os capítulos Configuração de um volume LVM com um sistema de arquivos ext4 em um cluster Pacemaker e Configuração de um Servidor HTTP Apache na documentação Configuração e gerenciamento de clusters de alta disponibilidade.

Já configurei uma conta de serviço do Ansible nos três servidores, intitulada ansible. Tenho a autenticação de chaves SSH configurada para que a conta Ansible no controlnode possa acessar cada um dos nós. Além disso, a conta de serviço Ansible foi configurada com acesso à conta raiz por meio de sudo em cada nó. Também instalei os pacotes rhel-system-roles e ansible no controlnode. Para obter mais informações sobre essas tarefas, consulte o post Introdução às funções do sistema RHEL.

Definição do arquivo de inventário e das variáveis de função

No sistema controlnode, a primeira etapa é criar uma nova estrutura de diretórios:

[ansible@controlnode ~]$ mkdir -p ha_cluster/group_vars

Esses diretórios serão usados da seguinte maneira:

  • O diretório ha_cluster conterá o playbook e o arquivo de inventário.
  • O arquivo ha_cluster/group_vars conterá arquivos de variáveis para grupos de inventários que vão ser aplicados aos hosts nos respectivos grupos de inventário do Ansible.

Preciso definir um arquivo de inventário do Ansible para listar e agrupar os hosts que a função do sistema ha_cluster deve configurar. Criarei o arquivo de inventário em ha_cluster/inventory.yml com este conteúdo:

---
all:
  children:
    rhel8_cluster:
      hosts:
        rhel8-node1:
        rhel8-node2:

O inventário define um grupo de inventários denominado rhel8_cluster e atribui os dois nós gerenciados a esse grupo.

Em seguida, definirei as variáveis de função que controlarão o comportamento da função do sistema ha_cluster durante a execução. O arquivo README.md da função ha_cluster está disponível em /usr/share/doc/rhel-system-roles/ha_cluster/README.md e contém informações importantes sobre a função, incluindo uma lista de variáveis de função disponíveis e como usá-las.

Uma das variáveis que precisa ser definida para a função ha_cluster é a variável ha_cluster_hacluster_password. Ela define a senha para o usuário do hacluster. Usarei o Ansible Vault para criptografar o valor dela para que ele não seja armazenado em texto simples.

[ansible@controlnode ~]$ ansible-vault encrypt_string 'your-hacluster-password' --name ha_cluster_hacluster_password
New Vault password:
Confirm New Vault password:
ha_cluster_hacluster_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256 376135336466646132313064373931393634313566323739363365616439316130653539656265373663636632383930323230343731666164373766353161630a303434316333316264343736336537626632633735363933303934373666626263373962393333316461616136396165326339626639663437626338343530360a39366664336634663237333039383631326263326431373266616130626333303462386634333430666333336166653932663535376538656466383762343065
Encryption successful

Substitua your-hacluster-password pela senha de sua escolha. Após executar o comando, ele solicita uma senha do Vault que pode ser usada para descriptografar a variável durante a execução do playbook. Após digitar e confirmar a senha do Vault, a variável criptografada é exibida na saída. A variável será colocada no arquivo de variáveis, que será criado na próxima etapa.

Agora, criarei um arquivo para definir variáveis para os nós de cluster listados no grupo de inventários rhel8_cluster criando um arquivo em ha_cluster/group_vars/rhel8_cluster.yml com o seguinte conteúdo:

---
ha_cluster_cluster_name: rhel8-cluster
ha_cluster_hacluster_password: !vault |
       $ANSIBLE_VAULT;1.1;AES256
       3761353364666461323130643739313936343135663237393633656164393161306535
       39656265373663636632383930323230343731666164373766353161630a3034343163
       3331626434373633653762663263373536393330393437366662626337396239333331
       6461616136396165326339626639663437626338343530360a39366664336634663237
       3330393836313262633264313732666161306263333034623866343334306663333361
       66653932663535376538656466383762343065
ha_cluster_fence_agent_packages:
  - fence-agents-apc-snmp
ha_cluster_resource_primitives:
  - id: myapc
    agent: stonith:fence_apc_snmp
    instance_attrs:
      - attrs:
          - name: ipaddr
            value: apc-switch
          - name: pcmk_host_map
            value: rhel8-node1:1;rhel8-node2:2
          - name: login
            value: apc
          - name: passwd
            value: apc
  - id: my_lvm
    agent: ocf:heartbeat:LVM-activate
    instance_attrs:
      - attrs:
          - name: vgname
            value: my_vg
          - name: vg_access_mode
            value: system_id
  - id: my_fs
    agent: ocf:heartbeat:Filesystem
    instance_attrs:
      - attrs:
          - name: device
            value: /dev/my_vg/my_lv
          - name: directory
            value: /var/www
          - name: fstype
            value: ext4
  - id: VirtualIP
    agent: ocf:heartbeat:IPaddr2
    instance_attrs:
      - attrs:
          - name: ip
            value: 198.51.100.3
          - name: cidr_netmask
            value: 24
  - id: Website
    agent: ocf:heartbeat:apache
    instance_attrs:
      - attrs:
          - name: configfile
            value: /etc/httpd/conf/httpd.conf
          - name: statusurl
            value: http://127.0.0.1/server-status
ha_cluster_resource_groups:
  - id: apachegroup
    resource_ids:
      - my_lvm
      - my_fs
      - VirtualIP
      - Website

Isso faz com que a função ha_cluster crie um cluster nomeado rhel8-cluster nos nós.

Haverá um dispositivo com fencing, myapc, do tipo stonith:fence_apc_snmp, definido no cluster. O dispositivo pode ser acessado no endereço IP do apc-switch com o login apc e a senha apc. Os nós de cluster são alimentados por meio deste dispositivo: rhel8-node1 está conectado ao soquete 1, e rhel8-node2 está conectado ao soquete 2. Como nenhum outro dispositivo com fencing será usado, especifiquei a variável ha_cluster_fence_agent_packages. Isso substitui o valor padrão e impede a instalação de outros agentes de fencing.

Quatro recursos serão executados no cluster:

  • O grupo de volumes LVM my_vg será ativado pelo recurso my_lvm do tipo ocf:heartbeat:LVM-activate.
  • O sistema de arquivos ext4 será montado a partir do dispositivo de armazenamento compartilhado /dev/my_vg/my_lv em /var/www pelo recurso my_fs do tipo ocf:heartbeat:Filesystem.
  • O endereço IP flutuante 198.51.100.3/24 para o servidor HTTP será gerenciado pelo recurso VirtualIP do tipo ocf:heartbeat:IPaddr2.
  • O servidor HTTP será representado por um recurso Website do tipo ocf:heartbeat:apache, com o respectivo arquivo de configuração armazenado em /etc/httpd/conf/httpd.conf e a página de status para monitoramento disponível em http://127.0.0.1/server-status.

Todos os recursos serão colocados em um grupo apachegroup para serem executados em um único nó e iniciados em uma ordem especificada: my_lvm, my_fs, VirtualIP, Website.

Criação do playbook

A próxima etapa é criar o arquivo de playbook em ha_cluster/ha_cluster.yml com o seguinte conteúdo:

---
- name: Deploy a cluster
  hosts: rhel8_cluster
  roles:
    - rhel-system-roles.ha_cluster

Esse playbook chama a função do sistema ha_cluster para todos os sistemas definidos no grupo de inventários rhel8_cluster.

Como executar o playbook

Neste momento, tudo está no lugar e pronto para executar o playbook. Para esta demonstração, estou usando um nó de controle do RHEL. Executarei o playbook a partir da linha de comando. Também vou usar o comando cd para entrar no diretório ha_cluster e, depois, o comando ansible-playbook para executar o playbook.

[ansible@controlnode ~]$ cd ha_cluster/
[ansible@controlnode ~]$ ansible-playbook -b -i inventory.yml --ask-vault-pass ha_cluster.yml

Especifico que o playbook ha_cluster.yml deve ser executado como raiz (o sinalizador -b), o arquivo inventory.yml deve ser usado como meu inventário do Ansible (o sinalizador -i) e que devo inserir a senha do Vault para descriptografar a variável ha_cluster_hacluster_password (o sinalizador --ask-vault-pass).

Após a conclusão do playbook, preciso verificar se não houve falhas nas tarefas:

Screenshot of a Linux terminal showing no failed tasks

Validação da configuração

Para validar a configuração e a execução de recursos do cluster, vou acessar rhel8-node1 e exibir o status do cluster:

Screenshot of a linux terminal displaying the cluster status of rhel8-node1

Também verifico isso no rhel8-node2, que exibe a mesma saída.

Em seguida, abro um navegador da web e o conecto ao IP 198.51.100.3 para verificar se o site está acessível.

Para testar o failover, puxo um cabo de rede de rhel8-node1. Depois de um tempo, o cluster realiza o failover e implementa fencing em rhel8-node1. Acesso rhel8-node2 e exibo o status do cluster. Ele mostra que todos os recursos foram migrados de rhel8-node1 para rhel8-node2. Também recarrego o site no navegador para verificar se ainda está acessível.

Screenshot of a linux terminal displaying the cluster status of rhel8-node2

Reconecto rhel8-node1 à rede e o reinicializo outra vez para que ele se junte novamente ao cluster.

Conclusão

A função do sistema RHEL ha_cluster pode ajudar você a configurar de forma rápida e consistente os clusters de HA do RHEL, executando uma variedade de cargas de trabalho. Neste post, abordei como usar a função para configurar um Servidor HTTP Apache executando um site a partir de um armazenamento compartilhado em um modo ativo/passivo.

A Red Hat oferece muitas funções do sistema RHEL que podem ajudar a automatizar outros aspectos importantes do seu ambiente RHEL. Para explorar outras funções, confira esta lista de funções disponíveis do sistema RHEL e comece agora a gerenciar seus servidores RHEL de maneira mais eficiente, consistente e automatizada.

Quer descobrir mais informações sobre o Red Hat Ansible Automation Platform? Confira nosso ebook, Manual do arquiteto de automação.

 


Sobre o autor

Tomas Jelinek is a Software Engineer at Red Hat with over seven years of experience with RHEL High Availability clusters.

Read full bio
UI_Icon-Red_Hat-Close-A-Black-RGB

Navegue por canal

automation icon

Automação

Últimas novidades em automação de TI para empresas de tecnologia, equipes e ambientes

AI icon

Inteligência artificial

Descubra as atualizações nas plataformas que proporcionam aos clientes executar suas cargas de trabalho de IA em qualquer ambiente

open hybrid cloud icon

Nuvem híbrida aberta

Veja como construímos um futuro mais flexível com a nuvem híbrida

security icon

Segurança

Veja as últimas novidades sobre como reduzimos riscos em ambientes e tecnologias

edge icon

Edge computing

Saiba quais são as atualizações nas plataformas que simplificam as operações na borda

Infrastructure icon

Infraestrutura

Saiba o que há de mais recente na plataforma Linux empresarial líder mundial

application development icon

Aplicações

Conheça nossas soluções desenvolvidas para ajudar você a superar os desafios mais complexos de aplicações

Original series icon

Programas originais

Veja as histórias divertidas de criadores e líderes em tecnologia empresarial