You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible oracle_user模块在19c PDB环境中无法正确设置Vault密码

Ansible oracle_user模块在Oracle 19c PDB环境中无法正确设置Vault存储的密码

问题详情

在Oracle 19c CDB/PDB环境中通过Ansible自动化创建数据库用户时出现异常:数据库和用户创建过程无报错,但使用Ansible Vault中存储的密码登录数据库时触发ORA-1017错误,手动设置相同密码则可正常登录。

所用Ansible任务代码

- name: create deploy user DPLUS_%
  connection: local
  no_log: true
  oracle_user:
    hostname:                "{{ db_hostname }}"
    service_name:            "{{ rcs_pdb_service }}"
    user:                    "{{ db_connect_user }}"
    password:                "{{ db_connect_password }}"
    mode:                    "{{ db_connect_mode }}"
    schema:                  "{{ item.username }}"
    schema_password:         "{{ item.password_vault }}"
    default_tablespace:      "{{ rcs_db_deploy_default_tablespace }}"
    default_temp_tablespace: "{{ rcs_db_deploy_temporary_tablespace }}"
  with_items:
    - "{{ rcs_db_deploy_users }}"
  loop_control:
    label: "{{ item.username }}"

Vault密码条目示例

- username: DPLUS_APPL
    password_hash: S:ABDED382253DB7932BCBCC93C6D3B6E742B664C5D9F1E737D5AB373714D8;T:89F040CEB67D2AD5B57DC0C8B62B60C308F9A10BEA45E0081FB6C70D664D6AFE584E67022A501C679CE8A78968A5F7F63359690728B27C92C33AEE77D0FCCCFAEA0E6DF37A46AEDC3B41BB04393BC755
    password_vault: !vault |
      $ANSIBLE_VAULT;1.1;AES256
      66326561616635303135306638333136643532363533376234633932303833316230653164353234
      3765373433633836643631343035643539313838303063630a376465393635356663393338626632
      61306135303363623038656562353939356465396331373466323131633434373832666363323436
      6534613839373966300a613838613731616465633931323164343464316264613233366562653662
      6631

已完成排查

  • Ansible剧本执行全程无报错,但密码未在数据库中正确生效
  • 通过ansible-vault view验证Vault解密后的密码完全正确
  • 使用oracle_sql模块手动设置相同密码可正常登录,但此方式存在安全风险
  • 该Vault配置在单实例数据库环境(AWS及内部VM)中稳定运行多年,仅在CDB/PDB环境中出现此问题
  • 尝试重新加密包含特殊字符、大小写混合的复杂密码,问题依旧

解决方案

1. 适配oracle_user模块的PDB密码处理逻辑

Oracle 19c PDB环境的密码规则(如大小写敏感性、特殊字符转义)可能与单实例不同,可尝试:

  • 若模块支持,添加password_case_sensitive: yes参数显式开启密码大小写敏感
  • 对原始密码中的特殊字符(如@、#)用反斜杠转义后再存入Vault

2. 用oracle_sql模块安全替换oracle_user

通过no_log参数规避安全风险,直接执行标准SQL创建用户:

- name: create deploy user DPLUS_% with secure password
  connection: local
  no_log: true
  oracle_sql:
    hostname: "{{ db_hostname }}"
    service_name: "{{ rcs_pdb_service }}"
    user: "{{ db_connect_user }}"
    password: "{{ db_connect_password }}"
    mode: "{{ db_connect_mode }}"
    sql: |
      CREATE USER {{ item.username }} IDENTIFIED BY "{{ item.password_vault }}"
      DEFAULT TABLESPACE {{ rcs_db_deploy_default_tablespace }}
      TEMPORARY TABLESPACE {{ rcs_db_deploy_temporary_tablespace }};
      -- 按需添加GRANT语句
  with_items: "{{ rcs_db_deploy_users }}"
  loop_control:
    label: "{{ item.username }}"

3. 验证连接模式与权限配置

确保db_connect_mode设置为SYSDBA或合适模式,且连接用户拥有PDB内创建用户的权限:

  • 若使用CDB级用户,需确保其在目标PDB中被授予CREATE USER权限
  • 优先使用PDB本地管理员用户执行创建操作

4. 检查PDB密码验证规则

查询PDB的密码配置,确认Vault中的密码符合复杂度要求:

SELECT profile, resource_name, limit FROM dba_profiles WHERE resource_name LIKE 'PASSWORD%';

部分Oracle版本会静默拒绝不符合规则的密码设置,且不返回错误。


内容的提问来源于stack exchange,提问作者uwe A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:33:19