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
相关产品推荐
相关产品推荐

