为什么ansible become_user oracle不运行用户配置文件脚本

时间:2016-09-22 09:53:54

标签: oracle ansible

我需要以oracle用户身份登录远程主机(Linux 2.6.39-400.210.2.el6uek.x86_64)并通过sqlplus实用程序运行一些sql脚本。使用Ansible配置:

 tasks:
     - name: Running oracle script
       shell: "sqlplus / as sysdba @test.sql"
       become: yes
       become_method: sudo
       become_user: oracle

但似乎登录后不会执行/ etc / profile和〜/ .profile。在oracle环境中导致设置不正确并且sqlplus不起作用。 显示错误:

fatal: [wh1.db]: FAILED! => {"changed": true, "cmd": "sqlplus / as sysdba @test.sql", "delta": "0:00:00.002729", "end": "2016-09-22 10:37:31.033209", "failed": true, "invocation": {"module_args": {"_raw_params": "sqlplus / as sysdba @test.sql", "_uses_shell": true, "chdir": null, "creates": null, "executable": null, "removes": null, "warn": true}, "module_name": "command"}, "rc": 127, "start": "2016-09-22 10:37:31.030480", "stderr": "/bin/sh: sqlplus: command not found", "stdout": "", "stdout_lines": [], "warnings": []}

如果我以oracle用户身份手动登录该框,则sqlplus工作正常。 任何想法如何使其有效? 建议设置oracle env变量并手动运行配置文件脚本,但它看起来不是很好的解决方法。

3 个答案:

答案 0 :(得分:1)

您需要通过shell模块获取配置文件。尝试将shell命令更新为:

var date=/^[0-9]{1,2}\-[0-9]{1,2}\-[0-9]{1,4}$/;

if(!date.test(form.date.value))

alert("Enter correct date");

else
alert(" working");

我相信,一旦任务运行,配置文件就会终止。

您也可以尝试通过shell运行sudo;

shell: source /home/username/.profile && "sqlplus / as sysdba @test.sql"

根据sudo手册页:

shell: sudo -iu oracle "sqlplus / as sysdba @test.sql"

答案 1 :(得分:0)

尝试使用'su'代替'sudo'作为begin_method,并传递su的'--login'选项:

tasks:
 - name: Running oracle script
   command: "sqlplus / as sysdba @test.sql"
   become: yes
   become_method: su
   become_flags: "--login"
   become_user: oracle

那对我有用,但是有了Db2 ;-) 我试图运行一个Db2命令,该命令要求提供db2profile,通常是通过.profile ...发生的,并且强制登录shell通常会提供您的配置文件。

答案 2 :(得分:0)

尝试在您的剧本中使用标志“-i”:

tasks:
 - name: Running oracle script
   shell: "sqlplus / as sysdba @test.sql"
   become: yes
   become_method: sudo
   become_flags: -i
   become_user: oracle

-i sudo 的选项将目标用户的 shell 指定条目作为登录 shell 运行。这意味着 shell 将读取特定于登录名的资源文件,例如 .profile 或 .login。