在远程节点上使用sudoers限制Ansible脚本模块

在远程节点上使用sudoers限制Ansible脚本模块,ansible,Ansible,我有一个剧本,作为Oracle用户对数据库执行一些预检查。远程节点是AIX服务器,因此我创建了一个通过playbook运行的shell脚本 --- - hosts: db var_files: - ansible_var.yml tasks: - name: "DB Checks" become: True become_user: oracle script: "{ db_prechk }" 在AIX服务器上,我向sudoers文件添加了以下

我有一个剧本,作为Oracle用户对数据库执行一些预检查。远程节点是AIX服务器,因此我创建了一个通过playbook运行的shell脚本

---
- hosts: db
  var_files:
    - ansible_var.yml

  tasks:
    - name: "DB Checks"
    become: True
    become_user: oracle
    script: "{ db_prechk }"
在AIX服务器上,我向sudoers文件添加了以下条目

 ansible ALL=(oracle) NOPASSWD: /tmp/ansible-tmp-*/db_prechecks.sh
但是playbook失败,错误是它正在等待特权升级提示

如果以root用户身份运行,则运行良好。但是,我们不希望Ansible控制器和远程节点之间存在无密码根。因此,我们在控制器和远程节点上创建了ansible user,并交换了SSH密钥

如果sudoers条目只是

ansible ALL=(oracle) NOPASSWD: ALL
我们也不希望通过
ansible
用户id提供对
oracle
用户id的完全访问


我在详细模式下运行了playbook,可以看到Ansible正在将脚本复制到
remote\u tmp
dir,并以
oracle
userid的身份执行它。在这种情况下,sudoers行应该允许它运行?

如果查看详细模式输出,您将看到实际命令与您在
sudoers
文件中指定的命令不同:

SSH:EXEC SSH-o ForwardAgent=yes-o StrictHostKeyChecking=no-o UserKnownHostsFile=/dev/null-o identiesonly=yes-o ControlMaster=auto-o ControlPersist=60s-o StrictHostKeyChecking=no-o Port=2202-o'IdentityFile=“/Users/techraf/devops/testground/debian/.vagrant/machines/debian/virtualbox/private_key”“-o KbdInteractiveAuthentication=no-o PreferredAuthentications=gssapi with mic、gssapi keyex、基于主机、公钥-o PasswordAuthentication=no-o User=ansible-o ConnectTimeout=120-o ControlPath=/Users/techraf/.ansible/cp/ansible ssh-%p-%r-tt 127.0.0.1'/bin/sh-c'''“echo成功”xoamupogqwtteubvedoscaghzmfascsr/tmp/ansible-tmp-1488508771.72-271591203197790/db_prechecks.sh'''''''''''''''''''''''和&sleep 0''''''

因此,在
sudo-uoracle
之后执行的操作实际上是从
/bin/sh-c
开始的

我设法将工作字符串筛选为:

ansible ALL=(oracle) NOPASSWD: /bin/sh -c echo BECOME-SUCCESS*; * /tmp/ansible-tmp-*/db_prechecks.sh*
但它是建立在反复试验的基础上的。我还不确定为什么在
之间需要
*
/tmp/…
最后,但在其他方面它不起作用

在这两个地方,Ansible都添加了多余的空格字符,这似乎是原因,因为在shell命令中添加空格(在
sudoers
文件中指定)会影响
sudo
的功能


您可以尝试使用
而不是
*
,稍后我将测试回复@techraf的答案:sudo似乎会截断多余的空间,您可以使用
sudo-l
看到它。按照sudo手册中的说明,我可以通过使用
\
逃离空格来绕过这个问题:

\对于任何字符“x”,x的计算结果为“x”

问:“如果sudoers条目只是
ansible ALL=(oracle)NOPASSWD:ALL
,则也会运行此命令。”

答:引述自:

“您不能将权限提升权限限制为某些命令…”


有时/tmp与noexec一起安装。看/等/fstab@bodo这并不能解释为什么它可以使用
NOPASSWD:ALL
。我试过使用
[a-z]
,但它不起作用。我返回到
*
并将继续检查