我正在尝试自动化一个简单的软件包安装例程:
root
pkgadd <pkg_name>
手动执行时效果非常好,但Ansible在pkgadd
步骤中失败,出现“错误:数据库只能作为root访问”,在手动完成相同的过程时从未发生过:
---
- name: deploy JRE
synchronize: src={{jre_path}} dest={{remote_pkg_repo}}
- name: install JRE
command: pkgadd {{jre_name}} chdir={{remote_pkg_repo}}
我确定Ansible正在使用root用户,一个简单的调试语句向我显示它以uid=0(root) gid=0(root)
身份登录,但仍然发生该错误。这是怎么回事?
PS:远程计算机上没有安装sudo
可以使用。
更新
使用远程SSH命令执行pkgadd
命令时,我可以重现错误:
ssh root@<remote_host> 'cd <remote_pkg_repo>; pkgadd <pkg_name>'
此远程SSH呼叫与手动登录有什么区别?
答案 0 :(得分:0)
我终于找到了解决上述问题的方法。由于Ansible通过SSH登录到远程主机,只有一个&#34;远程shell&#34;已创建(与手动登录相比,似乎缺少某些环境配置)。
因此,为了使Ansible以root
远程登录并执行具有完整root
权限的命令,您必须在Ansible playbook中设置环境变量NONABI_SCRIPTS=true
:
---
- hosts: <your_host>
remote_user: root
vars:
# set the environment in a task to avoid a remote shell
# but enforce a real local shell:
enforce_local_shell:
NONABI_SCRIPTS: true
然后在Ansible任务中添加environment
:
- name: install JRE
command: pkgadd {{jre_name}} chdir={{remote_pkg_repo}}
environment: enforce_local_shell
有关设置Ansible环境的更多信息,请访问here。