Observação:

Provisionar um Cluster de Máquina Virtual do Oracle Exadata Database Service on Cloud@Customer com o Ansible

Introdução

Este tutorial explica como usar a coleção do OCI Ansible para provisionar clusters de máquina virtual (VM) do Oracle Exadata Database Service on Cloud@Customer. Para criar um cluster de VMs do Oracle Exadata Database Service on Cloud@Customer, é obrigatório criar a rede de clusters de VMs correspondente primeiro.

Objetivos

Pré-requisitos

Para obter mais informações, consulte Pré-requisitos para Usar o Ansible com o Oracle Cloud Infrastructure.

Tarefa 1: Criar um Inventário

  1. Conecte-se ao nó de controle do Ansible configurado corretamente.

  2. Crie um arquivo de inventário chamado inventory_exacc.yml com o conteúdo a seguir.

    localhost ansible_connection=local
    

Tarefa 2: Criar um Arquivo de Variável

Crie um arquivo de variável chamado variables_exacc.yml com todas as variáveis descritas no conteúdo a seguir.

# Your variables file

your_region: "eu-frankfurt-1"   # The OCI region where your resources will reside - This parameter is optional
your_exa_infra_id: "ocid1.exadatainfrastructure.oc1.eu-frankfurt-1.xxx"   # The OCI of your Exadata infrastructure

## Variables related to your VM cluster network

your_vm_net_comp_id: "ocid1.compartment.oc1..xxx"   # The compartment OCID of your VM cluster network
your_vm_net_name: "my_vm_cluster_network_name"   # The display name of your VM cluster network
your_vm_net_dns: "10.109.10.2"   # The list of your DNS server IP addresses. Maximum of 3 allowed.
your_vm_net_ntp: "10.109.10.3"   # The list of your NTP server IP addresses. Maximum of 3 allowed.
your_vm_net_scan_ips: ["203.101.10.123", "203.101.10.124", "203.101.10.125"]   # The list of your SCAN IP addresses. Three addresses should be provided.
your_vm_net_scan_listener_port_tcp: "1521"   # Your SCAN TCPIP port. Default is 1521.

### Variables related to your CLIENT network

your_cli_nodes_hostname_1: "your_1st_hostname"   # The hostname of your 1st node on the CLIENT network
your_cli_nodes_ip_1: "203.101.10.101"   # The IP address of your 1st node on the CLIENT network
your_cli_nodes_vip_hostname_1: "your_1st_hostname-vip"   # The node virtual IP (VIP) host name of your 1st node on the CLIENT network
your_cli_nodes_vip_1: "203.101.10.102"   # The node virtual IP (VIP) address of your 1st node on the CLIENT network
your_db_server_ocid_1: "ocid1.dbserver.oc1.eu-frankfurt-1.xxx"   # The Db server OCID associated with your 1st node on the CLIENT network

your_cli_nodes_hostname_2: "your_2nd_hostname"   # The hostname of your 2nd node on the CLIENT network
your_cli_nodes_ip_2: "203.101.10.103"   # The IP address of your 2nd node on the CLIENT network
your_cli_nodes_vip_hostname_2: "your_2nd_hostname-vip"   # The node virtual IP (VIP) host name of your 2nd node on the CLIENT network
your_cli_nodes_vip_2: "203.101.10.104"   # The node virtual IP (VIP) address of your 2nd node on the CLIENT network
your_db_server_ocid_2: "ocid1.dbserver.oc1.eu-frankfurt-1.yyy"   # The Db server OCID associated with your 2nd node on the CLIENT network

your_cli_vm_net_vlan_id: "123"   # Your CLIENT network VLAN ID
your_cli_vm_net_netmask: "your_client_netmask"   # Your CLIENT network netmask
your_cli_vm_net_gateway: "your_client_gateway_ip"   # Your CLIENT network gateway
your_cli_vm_net_domain_name: "your_client_network_domain_name"   # Your CLIENT network domain name

### Variables related to your BACKUP network

your_bck_nodes_hostname_1: "your_1st_hostname-bk"   # The hostname of your 1st node on the BACKUP network
your_bck_nodes_ip_1: "10.108.10.3"   # The IP address of your 1st node on the BACKUP network
your_bck_nodes_hostname_2: "your_2nd_hostname-bk"   # The hostname of your 2nd node on the BACKUP network
your_bck_nodes_ip_2: "10.108.10.4"   # The IP address of your 2nd node on the BACKUP network

your_bck_vm_net_vlan_id: "456"   # Your BACKUP network VLAN ID
your_bck_vm_net_netmask: "your_backup_netmask"   # Your BACKUP network netmask
your_bck_vm_net_gateway: "your_backup_gateway_ip"   # Your BACKUP network gateway
your_bck_vm_net_domain_name: "your_backup_network_domain_name"   # Your BACKUP network domain name

## Variables related to your VM cluster

your_vm_cluster_comp_id: "ocid1.compartment.oc1..yyy"   # The compartment OCID of your VM cluster
your_vm_cluster_name: "my_vm_cluster_name"
your_vm_clus_ssh_public_keys: [ "ssh-rsa AAAAB3NzaC...qScP4xMPQ9L5xWsqs" ]
your_license_model: "LICENSE_INCLUDED"   # The Oracle license model that applies to the VM cluster. The default is BRING_YOUR_OWN_LICENSE.

Tarefa 3: Criar um Playbook para Provisionar uma Rede de Clusters de VMs

  1. Crie um arquivo de playbook chamado playbook_exacc_vmCluster_network_creation.yml com o conteúdo a seguir.

    - hosts: localhost
      collections:
        - oracle.oci
      vars_files:
        - variables_exacc.yml
      tasks:
        - name: Create VM cluster network
          oci_database_vm_cluster_network:
            region: "{{ your_region }}"
            compartment_id: "{{ your_vm_net_comp_id }}"
            exadata_infrastructure_id: "{{ your_exa_infra_id }}"
            display_name: "{{ your_vm_net_name }}"
            dns: "{{ your_vm_net_dns }}"
            ntp: "{{ your_vm_net_ntp }}"
            scans:
            - hostname: "{{ your_vm_clus_name }}-scan"
              ips: "{{ your_vm_net_scan_ips }}"
              scan_listener_port_tcp: "{{ your_vm_net_scan_listener_port_tcp }}"
            vm_networks:
            - network_type: CLIENT
              nodes:
              - hostname: "{{ your_cli_nodes_hostname_1 }}"
                ip: "{{ your_cli_nodes_ip_1 }}"
                vip_hostname: "{{ your_cli_nodes_vip_hostname_1 }}"
                vip: "{{ your_cli_nodes_vip_1 }}"
                db_server_id: "{{ your_db_server_ocid_1 }}"
              - hostname: "{{ your_cli_nodes_hostname_2 }}"
                ip: "{{ your_cli_nodes_ip_2 }}"
                vip_hostname: "{{ your_cli_nodes_vip_hostname_2 }}"
                vip: "{{ your_cli_nodes_vip_2 }}"
                db_server_id: "{{ your_db_server_ocid_2 }}"
              vlan_id: "{{ your_cli_vm_net_vlan_id }}"
              netmask: "{{ your_cli_vm_net_netmask }}"
              gateway: "{{ your_cli_vm_net_gateway }}"
              domain_name: "{{ your_cli_vm_net_domain_name }}"
            - network_type: BACKUP
              nodes:
              - hostname: "{{ your_bck_nodes_hostname_1 }}"
                ip: "{{ your_bck_nodes_ip_1 }}"
                vip_hostname: "{{ your_bck_nodes_vip_hostname_1 }}"
                vip: "{{ your_bck_nodes_vip_1 }}"
                db_server_id: "{{ your_db_server_ocid_1 }}"
              - hostname: "{{ your_bck_nodes_hostname_2 }}"
                ip: "{{ your_bck_nodes_ip_2 }}"
                vip_hostname: "{{ your_bck_nodes_vip_hostname_2 }}"
                vip: "{{ your_bck_nodes_vip_2 }}"
                db_server_id: "{{ your_db_server_ocid_2 }}"
              vlan_id: "{{ your_bck_vm_net_vlan_id }}"
              netmask: "{{ your_bck_vm_net_netmask }}"
              gateway: "{{ your_bck_vm_net_gateway }}"
              domain_name: "{{ your_bck_vm_net_domain_name }}"
            wait: true
          register: new_vmClusterNetwork
    

    Observe a palavra-chave da tarefa register, no final da chamada do módulo oci_database_vm_cluster_network: significa que a saída do módulo será registrada na variável new_vmClusterNetwork. Essa variável conterá todos os detalhes da rede de clusters de VMs recém-criada, incluindo seu OCID.

    Observação: Para este tutorial, há apenas dois dicionários de nós para cada tipo de rede, porque a infraestrutura subjacente do Exadata contém dois db servers. Para criar um cluster de VMs com quatro ou oito nós, é necessário fornecer o número adequado de dicionários de nós para cada tipo de rede.

  2. No playbook playbook_exacc_vmCluster_network_creation.yml, adicione a tarefa a seguir para recuperar o OCID da rede de clusters de VMs recém-criada.

    - name: Get OCID of newly created VM cluster network
      set_fact:
        your_vm_net_ocid: "{{ item.id }}"
      loop:
      - "{{ new_vmClusterNetwork.vm_cluster_network }}"
      loop_control:
        label: "{{ item.display_name }}"
    
  3. No playbook, playbook_exacc_vmCluster_network_creation.yml, adicione as tarefas a seguir para validar a rede de clusters de VMs recém-criada e fazer download de sua configuração.

        - name: Validate VM cluster network
          oci_database_vm_cluster_network_actions:
            exadata_infrastructure_id: "{{ your_exa_infra_id }}"
            vm_cluster_network_id: "{{ your_vm_net_ocid }}"
            region: "{{ your_region }}"
            action: validate
    
    
        - name: Download network configuration file of VM cluster network
          oci_database_vm_cluster_network_actions:
            exadata_infrastructure_id: "{{ your_exa_infra_id }}"
            vm_cluster_network_id: "{{ your_vm_net_ocid }}"
            action: download_vm_cluster_network_config_file
            config_file_dest: "/tmp/net_config_my_vm_cluster_network.json"
            region: "{{ your_region }}"
    
  4. No playbook playbook_exacc_vmCluster_network_creation.yml, adicione as tarefas a seguir para exibir os detalhes da rede de clusters de VMs recém-criada depois que sua validação tiver ocorrido.

        - name: Get facts of newly created VM cluster network
          oci_database_vm_cluster_network_facts:
            exadata_infrastructure_id: "{{ your_exa_infra_id }}"
            vm_cluster_network_id: "{{ your_vm_net_ocid }}"
            region: "{{ your_region }}"
          register: newly_created_VM_cluster_network_facts
    
    
        - name: Display details of newly created VM cluster network
          debug:
            msg : "{{ newly_created_VM_cluster_network_facts.vm_cluster_networks }}"
    

Tarefa 4: Executar o Playbook para Provisionar uma Rede de Clusters de VMs

  1. Execute o playbook de criação da rede de clusters de VMs com a opção detalhada.

    ansible-playbook playbook_exacc_vmCluster_network_creation.yml -i inventory_exacc.yml -vvv
    

    Observação: O uso da opção detalhada -vvv aumentará a verbosidade e ajudará você a entender todas as etapas subjacentes enquanto o playbook está em execução.

  2. Após alguns minutos, uma execução bem-sucedida do módulo oci_database_vm_cluster_network deverá retornar a saída a seguir.

    changed: [localhost] => {
    [...],
        "vm_cluster_network": {
            "compartment_id": "ocid1.compartment.oc1..xxx",
            "defined_tags": {
                "Oracle-Tags": {
                    "CreatedBy": "creation_user",
                    "CreatedOn": "2025-01-09T09:30:30.631Z"
                }
            },
            "display_name": "my_vm_cluster_network_name",
            "dns": [
                "10.109.10.2"
            ],
            "dr_scans": null,
            "exadata_infrastructure_id": "ocid1.exadatainfrastructure.oc1.eu-frankfurt-1.xxx",
            "freeform_tags": {},
            "id": "ocid1.vmclusternetwork.oc1.eu-frankfurt-1.xxx",
            "lifecycle_details": null,
            "lifecycle_state": "REQUIRES_VALIDATION",
            "ntp": [
                "10.109.10.3"
            ],
            "scans": [
                {
                    "hostname": "name_of_your-scan",
                    "ips": [
                        "203.101.10.123",
                        "203.101.10.124",
                        "203.101.10.125"
                    ],
                    "port": 1521,
                    "scan_listener_port_tcp": 1521,
                    "scan_listener_port_tcp_ssl": 2484
                }
            ],
            "time_created": "2025-01-09T09:30:30.818000+00:00",
            "vm_cluster_id": null,
            "vm_networks": [
                {
                    "domain_name": "your_client_network_domain_name",
                    "gateway": "your_client_gateway_ip",
                    "netmask": "your_client_netmask",
                    "network_type": "CLIENT",
                    "nodes": [
                        {
                            "db_server_id": "ocid_of_your_1st_db_server",
                            "hostname": "your_1st_hostname",
                            "ip": "203.101.10.101",
                            "lifecycle_state": "REQUIRES_VALIDATION",
                            "vip": "203.101.10.102",
                            "vip_hostname": "your_1st_hostname-vip"
                        },
                        {
                            "db_server_id": "ocid_of_your_2nd_db_server",
                            "hostname": "your_2nd_hostname",
                            "ip": "203.101.10.103",
                            "lifecycle_state": "REQUIRES_VALIDATION",
                            "vip": "203.101.10.104",
                            "vip_hostname": "your_2nd_hostname-vip"
                        }
                    ],
                    "vlan_id": "123"
                },
                {
                    "domain_name": "your_backup_network_domain_name",
                    "gateway": "your_backup_gateway_ip",
                    "netmask": "your_backup_netmask",
                    "network_type": "BACKUP",
                    "nodes": [
                        {
                            "db_server_id": "ocid_of_your_1st_db_server",
                            "hostname": "your_1st_hostname-bk",
                            "ip": "10.108.10.3",
                            "lifecycle_state": "REQUIRES_VALIDATION",
                        },
                        {
                            "db_server_id": "ocid_of_your_2nd_db_server",
                            "hostname": "your_2nd_hostname-bk",
                            "ip": "10.108.10.4",
                            "lifecycle_state": "REQUIRES_VALIDATION",
                        }
                    ],
                    "vlan_id": "456"
                }
            ]
        }
    }
    

Tarefa 5: Criar um Playbook para Provisionar um Cluster de VMs

  1. Crie um arquivo de playbook chamado playbook_exacc_vmCluster_creation.yml com o conteúdo a seguir.

    - hosts: localhost
      collections:
        - oracle.oci
      vars_files:
        - variables_exacc.yml
      tasks:
    
        - name: Get all existing VM cluster networks
          oci_database_vm_cluster_network_facts:
            exadata_infrastructure_id: "{{ your_exa_infra_id }}"
            compartment_id: "{{ your_vm_net_comp_id }}"
            region: "{{ your_region }}"
          register: get_all_vmClusterNetworks
    
    
        - name: Get OCID of the newly created VM cluster network
          set_fact:
            your_vm_net_ocid: "{{ item.id }}"
          loop: "{{ get_all_vmClusterNetworks.vm_cluster_networks }}"
          loop_control:
            label: "{{ item.display_name }}"
          when: item.display_name == your_vm_net_name
    

    Essas 2 tarefas são usadas para recuperar o OCID da rede de clusters de VMs recém-criada, porque ela será necessária para a criação do cluster de VMs.

  2. Adicione a tarefa de criação do cluster de VMs no playbook, playbook_exacc_vmCluster_creation.yml.

    - name: Create VM cluster
      oci_database_vm_cluster:
        region: "{{ your_region }}"
        compartment_id: "{{ your_vm_cluster_comp_id }}"
        display_name: "{{ your_vm_cluster_name }}"
        exadata_infrastructure_id: "{{ your_exa_infra_id }}"
        vm_cluster_network_id: "{{ your_vm_net_ocid }}"
        gi_version: "19.0.0.0.0"
        cpu_core_count: "4"
        ssh_public_keys: "{{ your_vm_clus_ssh_public_keys }}"
        time_zone: "Europe/Zurich"
        memory_size_in_gbs: "60"
        db_node_storage_size_in_gbs: "120"
        data_storage_size_in_tbs: "2"
        license_model: "{{ your_license_model }}"
        is_sparse_diskgroup_enabled: "false"
        is_local_backup_enabled: "false"
        data_collection_options:
          is_diagnostics_events_enabled: "false"
          is_health_monitoring_enabled: "false"
          is_incident_logs_enabled: "false"
        wait: true
        wait_timeout: 18000
    

    Observe que os valores aceitos atuais para o parâmetro gi_version são 19.0.0.0.0 e 23.0.0.0.0. Caso contrário, você receberá o seguinte erro: Cannot create VM cluster because Oracle Grid Infrastructure version is invalid. Valid versions are: [19.0.0.0.0, 23.0.0.0.0].

    Observação: A criação do cluster de VMs geralmente leva até 3 horas. É por isso que as instruções wait: true e wait_timeout: 18000 são adicionadas ao código.

Tarefa 6: Executar o Playbook para Provisionar um Cluster de VMs

  1. Execute o playbook de criação de cluster de VMs com a opção detalhada.

    ansible-playbook playbook_exacc_vmCluster_creation.yml -i inventory_exacc.yml -vvv
    

    Observação: O uso da opção detalhada -vvv aumentará a verbosidade e ajudará você a entender todas as etapas subjacentes enquanto o playbook está em execução.

  2. Após alguns minutos, uma execução bem-sucedida do módulo oci_database_vm_cluster deverá retornar a saída a seguir.

    changed: [localhost] => {
    [...],
        "vm_clusters": [
            {
                "availability_domain": "your_availability_domain",
                "compartment_id": "ocid1.compartment.oc1..yyy",
                "cpus_enabled": 4,
                "data_collection_options": {
                    "is_diagnostics_events_enabled": false,
                    "is_health_monitoring_enabled": false,
                    "is_incident_logs_enabled": false
                },
                "data_storage_size_in_gbs": null,
                "data_storage_size_in_tbs": 2.0,
                "db_node_storage_size_in_gbs": 120,
                "db_servers": [
                    "ocid1.dbserver.oc1.eu-frankfurt-1.xxx",
                    "ocid1.dbserver.oc1.eu-frankfurt-1.yyy"
                ],
                "defined_tags": {
                    "Oracle-Tags": {
                        "CreatedBy": "creation_user",
                        "CreatedOn": "2025-01-09T12:40:17.201Z"
                    }
                },
                "display_name": "my_vm_cluster_name",
                "exadata_infrastructure_id": "ocid1.exadatainfrastructure.oc1.eu-frankfurt-1.xxx",
                "file_system_configuration_details": [
                    {
                        "file_system_size_gb": 15,
                        "mount_point": "/"
                    },
                    [...],
                    {
                        "file_system_size_gb": 16,
                        "mount_point": "swap"
                    }
                ],
                "freeform_tags": {},
                "gi_software_image_id": null,
                "gi_version": "19.24.0.0.0",
                "id": "ocid1.vmcluster.oc1.eu-frankfurt-1.xxx",
                "is_local_backup_enabled": false,
                "is_sparse_diskgroup_enabled": false,
                "last_patch_history_entry_id": null,
                "license_model": "your_license_model",
                "lifecycle_details": null,
                "lifecycle_state": "AVAILABLE",
                "memory_size_in_gbs": 60,
                "ocpus_enabled": null,
                "shape": "your_ExadataCC_shape",
                "ssh_public_keys": null,
                "system_version": "24.1.6.0.0.241115",
                "time_created": "2025-01-09T12:40:17.256000+00:00",
                "time_zone": "Europe/Zurich",
                "vm_cluster_network_id": "your_newly_created_vmCluster_network_OCID"
            }
        ]
    }
    

Tarefa 7: Criar um Playbook para Verificar o Estado do Cluster de VMs Recém-Criado

Crie um arquivo de playbook chamado playbook_exacc_vmCluster_post_creation_checks.yml com o conteúdo a seguir.

- hosts: localhost
  collections:
    - oracle.oci
  vars_files:
    - variables_exacc.yml
  tasks:
    - name: Get newly created vmCluster facts
      oci_database_vm_cluster_facts:
        region: "{{ your_region }}"
        compartment_id: "{{ your_vm_cluster_comp_id }}"
        exadata_infrastructure_id: "{{ your_exa_infra_id }}"
        display_name: "{{ your_vm_cluster_name }}"
      register: output_cluster_facts


    - name: Set vmCluster facts
      set_fact:
        your_vm_cluster_id: "{{ item.id }}"
        your_vm_cluster_state: "{{ item.lifecycle_state }}"
      loop: "{{ output_cluster_facts.vm_clusters }}"
      loop_control:
        label: "{{ item.display_name }}"
      when: item.display_name == your_vm_cluster_name


    - name: Check VM cluster state
      debug:
        msg: "The VM cluster  your_vm_cluster_name  is in lifecycle state  your_vm_cluster_state ."

Tarefa 8: Executar o Playbook para Verificar o Estado do Cluster de VMs Recém-Criado

  1. Execute o playbook de verificação de cluster de VMs com a opção detalhada.

    ansible-playbook playbook_exacc_vmCluster_post_creation_checks.yml -i inventory_exacc.yml -vvv
    

    Observação: O uso da opção detalhada -vvv aumentará a verbosidade e ajudará você a entender todas as etapas subjacentes enquanto o playbook está em execução.

  2. Após alguns segundos, uma execução bem-sucedida do playbook playbook_exacc_vmCluster_post_creation_checks.yml deve retornar a saída a seguir.

    ok: [localhost] => {
        "msg": "The VM cluster your_vm_cluster_name is in lifecycle state AVAILABLE."
    }
    

Confirmações

Mais Recursos de Aprendizagem

Explore outros laboratórios em docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal Oracle Learning YouTube. Além disso, visite education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.

Para obter a documentação do produto, visite o Oracle Help Center.