使用远程节点

时间:2017-03-02 12:34:04

标签: ansible

我有一个Playbook,可以作为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

但是剧本失败了,它正在等待特权提升提示。

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

如果sudoers条目只是

,这也会运行
ansible ALL=(oracle) NOPASSWD: ALL

我们也不希望通过oracle用户ID提供对ansible用户ID的完全访问权限。

我以详细模式运行了剧本,可以看到Ansible正在将脚本复制到remote_tmp目录,并将其作为oracle用户ID执行。在那种情况下,sudoers线应该允许它运行?

3 个答案:

答案 0 :(得分:1)

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

  

< 127.0.0.1> SSH:EXEC ssh -o ForwardAgent = yes -o StrictHostKeyChecking = no -o UserKnownHostsFile = / dev / null -o IdentitiesOnly = 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,hostbased,publickey -o PasswordAuthentication = no -o User = ansible -o ConnectTimeout = 120 -o ControlPath = / Users / techraf / .ansible / cp / ansible-ssh-%h-%p-%r -tt 127.0.0.1'/ bin / sh - c'“''' sudo -H -S -n -u oracle / bin / sh -c'”''''''''''''''''echo BECOME-SUCCESS-xoamupogqwtteubvedoscaghzmfascsr; /tmp/ansible-tmp-1488508771.72-271591203197790/db_prechecks.sh'“'''''''''''''''&&睡0'“''''

所以在sudo -u oracle实际使用/bin/sh -c启动后执行的内容。

我设法将工作字符串过滤到:

ansible ALL=(oracle) NOPASSWD: /bin/sh -c echo BECOME-SUCCESS*; * /tmp/ansible-tmp-*/db_prechecks.sh*

但它基于反复试验。我不确定为什么在*;之间以及最后需要/tmp/...,但是否则它不起作用。

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

您可以尝试使用?代替*,我稍后会测试

答案 1 :(得分:0)

回复@techraf的答案:sudo似乎会截断多余的空间,您可以使用sudo -l看到它。我可以按照sudo的手册页中的说明用\转义空格来解决此问题:

  

\ x对于任何字符“ x”,求值为“ x”。

答案 2 :(得分:0)

  

Q:”如果sudoers条目只是ansible ALL=(oracle) NOPASSWD: ALL,这也会运行”

A:引用Privilege escalation must be general

  

“您不能将特权升级权限限制为某些命令...”