如何用Ansible在Linux上连接Oracle DB并执行启停及查看PDB操作
Ansible操作Oracle数据库:查看PDB、启停数据库的修复方案
错误原因分析
你之前的代码直接将Shell循环逻辑写入command模块,同时违反了YAML语法规则:
command模块不支持Shell的管道、循环、重定向等特性,需改用shell模块- YAML中多行脚本需用
|标记声明,否则会触发映射值不允许的语法错误
修复后的完整任务代码
以下是实现提取Oracle路径、查看PDB、关闭数据库、启动数据库的完整Ansible任务:
1. 提取/etc/oratab中的CDB信息
- name: 提取/etc/oratab中的CDB条目(排除ASM和注释行) shell: cat /etc/oratab | egrep -v '^#|^$' | grep -v ASM | grep -v agent register: cdb_list
2. 查看所有CDB的可插拔数据库(PDB)
- name: 执行show pdbs命令查看PDB信息 shell: | # 从条目解析ORACLE_HOME和ORACLE_SID ORACLE_HOME=$(echo {{ item }} | awk -F":" '{print $2}') ORACLE_SID=$(echo {{ item }} | awk -F":" '{print $1}') # 设置Oracle环境变量 export ORACLE_HOME ORACLE_SID # 静默模式执行sqlplus命令 $ORACLE_HOME/bin/sqlplus -s / as sysdba <<EOF show pdbs; exit; EOF loop: "{{ cdb_list.stdout_lines }}" register: show_pdbs_result - name: 打印PDB查询结果 debug: var: show_pdbs_result.results
3. 关闭所有CDB数据库
- name: 执行shutdown immediate关闭数据库 shell: | ORACLE_HOME=$(echo {{ item }} | awk -F":" '{print $2}') ORACLE_SID=$(echo {{ item }} | awk -F":" '{print $1}') export ORACLE_HOME ORACLE_SID $ORACLE_HOME/bin/sqlplus -s / as sysdba <<EOF shutdown immediate; exit; EOF loop: "{{ cdb_list.stdout_lines }}" register: shutdown_result - name: 打印数据库关闭结果 debug: var: shutdown_result.results
4. 启动所有CDB数据库
- name: 执行startup启动数据库 shell: | ORACLE_HOME=$(echo {{ item }} | awk -F":" '{print $2}') ORACLE_SID=$(echo {{ item }} | awk -F":" '{print $1}') export ORACLE_HOME ORACLE_SID $ORACLE_HOME/bin/sqlplus -s / as sysdba <<EOF startup; exit; EOF loop: "{{ cdb_list.stdout_lines }}" register: startup_result - name: 打印数据库启动结果 debug: var: startup_result.results
关键优化点说明
- 使用
shell模块替代command:支持Shell语法特性(管道、循环、Here Document) - 单独提取CDB列表并注册变量:避免重复解析/etc/oratab,提升可维护性
- 显式设置环境变量:确保sqlplus能正确定位目标数据库实例
- 静默模式(
-s参数):减少sqlplus的冗余输出,便于结果解析 - 循环遍历CDB条目:自动处理oratab中所有符合条件的数据库实例
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

