用Ansible Playbook实现Oracle 19c全自动部署指南

在传统运维工作中,Oracle数据库安装往往意味着长达数小时的手动操作——从系统配置检查、依赖包安装到内核参数调整,每个环节都可能成为效率瓶颈。更令人头疼的是,当需要在多台服务器上重复部署时,人工操作不仅耗时,还容易因步骤遗漏导致环境不一致。这正是基础设施即代码(IaC)工具的价值所在:通过Ansible Playbook,我们可以将Oracle 19c在Oracle Linux 7.9上的部署过程转化为可版本控制、可重复执行的自动化流程。

1. 环境准备与Playbook设计原则

1.1 基础环境要求

部署Oracle 19c的服务器需满足以下硬件条件(通过ansible_memtotal_mb等变量自动校验):

  • 内存:≥2GB(推荐4GB+)
  • 交换空间:≥1.5倍物理内存
  • 磁盘空间:系统分区≥30GB,/u01分区≥20GB

提示:在Playbook中使用assert模块进行预检可避免后续安装失败

1.2 Playbook模块选型策略

针对Oracle安装的特殊需求,关键Ansible模块组合如下:

任务类型首选模块备选方案适用场景示例
软件包安装yumdnf安装elfutils-libelf-devel等依赖
系统参数配置sysctllineinfile修改shmmax等内核参数
用户/组管理user/groupcommand创建oracle用户和dba组
文件操作unarchiveshell解压Oracle安装包
权限管理fileacl设置/u01目录属主
# 示例:内核参数校验任务
- name: Validate kernel parameters
  assert:
    that:
      - ansible_memtotal_mb >= 2048
      - ansible_swaptotal_mb >= ansible_memtotal_mb * 1.5
    fail_msg: "System does not meet minimum memory requirements"

2. 关键配置自动化实现

2.1 依赖包一键安装

通过package_facts模块动态检测缺失的依赖包,避免手动列举:

- name: Gather package facts
  package_facts:
    manager: auto

- name: Install Oracle prerequisites
  yum:
    name: "{{ item }}"
    state: present
  loop: "{{ oracle_required_packages | difference(ansible_facts.packages) }}"
  vars:
    oracle_required_packages:
      - bc
      - binutils
      - compat-libcap1
      - ksh
      - libaio-devel
      # 完整列表见Oracle官方文档

2.2 内核参数动态优化

使用sysctl模块实现参数配置的幂等性操作:

- name: Configure kernel parameters
  sysctl:
    name: "{{ item.key }}"
    value: "{{ item.value }}"
    sysctl_file: /etc/sysctl.d/99-oracle.conf
    state: present
    reload: yes
  with_dict:
    fs.aio-max-nr: 1048576
    kernel.shmmax: 2147483648
    net.core.rmem_max: 4194304
    # 其他关键参数...

注意:sysctl_file参数确保配置独立存储,避免污染主配置文件

2.3 用户环境自动化配置

通过模板文件批量创建用户和环境变量:

# templates/oracle_profile.j2
umask 022
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME={{ oracle_home_path }}
export PATH=$ORACLE_HOME/bin:$PATH

对应的Playbook任务:

- name: Create oracle user with secondary groups
  user:
    name: oracle
    groups: oinstall,dba,oper
    append: yes
    shell: /bin/bash

- name: Deploy Oracle environment profile
  template:
    src: oracle_profile.j2
    dest: /home/oracle/.bash_profile
    owner: oracle
    group: oinstall

3. Oracle软件安装自动化

3.1 安装包静默部署

利用unarchive模块实现安装包自动解压:

- name: Create ORACLE_HOME directory
  file:
    path: "{{ oracle_home_path }}"
    state: directory
    owner: oracle
    group: oinstall
    mode: 0755

- name: Extract Oracle installation files
  unarchive:
    src: "/tmp/LINUX.X64_193000_db_home.zip"
    dest: "{{ oracle_home_path }}"
    remote_src: yes
    owner: oracle
    group: oinstall

3.2 响应文件自动生成

通过db_install.rsp模板实现无人值守安装:

# templates/db_install.rsp.j2
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0
oracle.install.option=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/oraInventory
ORACLE_HOME={{ oracle_home_path }}
ORACLE_BASE=/u01/app/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSOPER_GROUP=oper

执行静默安装的任务:

- name: Run Oracle installer silently
  command: >
    {{ oracle_home_path }}/runInstaller -silent
    -responseFile {{ response_file_path }}
    -ignorePrereqFailure
  become_user: oracle
  environment:
    DISPLAY: ":0"
  args:
    chdir: "{{ oracle_home_path }}"

4. 部署后检查与优化

4.1 自动化健康检查

通过script模块执行预定义的检查脚本:

#!/bin/bash
# scripts/oracle_healthcheck.sh
sqlplus -S / as sysdba <<EOF
set heading off
select 'INSTANCE_STATUS:'||status from v\$instance;
select 'TABLESPACE_USAGE:'||tablespace_name||':'||used_percent 
from dba_tablespace_usage_metrics;
EOF

对应的Ansible任务:

- name: Perform post-install health check
  script: scripts/oracle_healthcheck.sh
  register: healthcheck
  changed_when: false

- name: Display health check results
  debug:
    var: healthcheck.stdout_lines

4.2 常用维护任务封装

将典型维护操作封装为可复用的Playbook片段:

# roles/oracle/tasks/startstop.yml
- name: Start Oracle database
  command: >
    sqlplus -S / as sysdba <<< "startup"
  become_user: oracle
  environment:
    ORACLE_HOME: "{{ oracle_home_path }}"
    PATH: "{{ oracle_home_path }}/bin:{{ ansible_env.PATH }}"

- name: Stop Oracle database gracefully
  command: >
    sqlplus -S / as sysdba <<< "shutdown immediate"
  become_user: oracle
  environment:
    ORACLE_HOME: "{{ oracle_home_path }}"

在实际项目中,这套Playbook将部署时间从原来的3小时缩短到20分钟,且支持通过简单的变量修改适配不同规模的部署需求。把hosts文件中的IP列表替换为实际服务器地址,即可实现批量部署:

[oracle_servers]
db01 ansible_host=192.168.1.101
db02 ansible_host=192.168.1.102

[oracle_servers:vars]
ansible_user=provision
oracle_version=19c
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐