ansible:尝试切换用户时失败(超时错误)

ansible: become fails when trying to switch user (timeout error)

我需要能够登录到远程服务器,切换用户,然后执行任何需要的操作。

玩了一下ansible,发现了"become"这个工具,于是试了一下,毕竟……允许dzdo。

我的剧本变成了这样:

- name: Create  empty  file
  file: path=touchedFile.txt  state=touch
  become: true
  become_method: dzdo
  become_user: userid

我运行 它得到了: “抱歉,不允许用户 someuser 执行 '/bin/sh -c echo BECOME-SUCCESS-xklihidlmxpfvxxnbquvsqrgfjlyrsah; /usr/bin/python /tmp/ansible-tmp-1513185770.1-52571838933499/command.py'

嗯...我想也许它正在尝试执行这样的事情:

dzdo touch touchedFile.txt

不幸的是,我的公司不是这样的。该政策强制我们以自己的身份登录,然后像这样切换到所需的用户:

dzdo su - userid

我做了一些研究并尝试 运行在一个块中执行多个命令,我的逻辑认为如果我先切换用户,那么其他所有内容都会以其他用户的身份执行。我的剧本已更新为如下所示:

- name: Create  empty  file
  shell: |
    dzdo su - userid
    touch  touchedFile.txt

它失败了,然后我尝试了这个:

- name: Create  empty  file
  command: "{{ item }}"
  with_items:
    - dzdo su - userid
    - touch  touchedFile.txt

又失败了...这两种方法都创建了 touchedFile.txt 但作为我的用户而不是他们应该的用户...

有没有办法直接用 Ansible 做我需要的事情?还是我需要开始寻找更复杂的替代方案? 过去,我使用主要使用 "expect" 的脚本实现了我现在尝试做的事情,但它很容易出错......这就是为什么我正在寻找更好的替代方案。

编辑 2018-01-08: 我现在可以在不需要密码的情况下使用“sudo su - userid”;但不知何故,Ansible 总是期待用户的输入,发生超时,我的游戏失败了:

fatal: [240]: FAILED! => {
    "failed": true, 
    "msg": "Timeout (12s) waiting for privilege escalation prompt: "
}

我注意到的一件事是 Ansible 正在执行以下操作:

EXEC ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no
 -o 'IdentityFile="./.ssh/fatCamel"' -o KbdInteractiveAuthentication=no
 -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey
 -o PasswordAuthentication=no -o User=login_userid -o ConnectTimeout=10
 -o ControlPath=/Users/local_userid/.ansible/cp/446eee77f4
 -tt server_url '/bin/sh -c '"'"'sudo su - sudo_userid -u root /bin/sh
 -c '"'"'"'"'"'"'"'"'echo BECOME-SUCCESS-hsyxhtaoxiepyjexaffecfiblmjezopu;
 /usr/bin/python /u/users/login_userid/.ansible/tmp/ansible-tmp-1515438271.05-219108659465262/command.py;
 rm -rf "/u/users/login_userid/.ansible/tmp/ansible-tmp-1515438271.05-219108659465262/"
 > /dev/null 2>&1'"'"'"'"'"'"'"'"' && sleep 0'"'"''

这部分是我引起注意的地方sudo su - sudo_userid -u root

如果我尝试在服务器中 运行 它(复制和粘贴)它也会失败... 为什么 Ansible 添加“-u root”,有没有办法阻止它这样做?我永远不会被 g运行ted ROOT 访问任何服务器。

此外,我正在将 ansible_become_pass 变量设置为正确的值...但它仍然失败。

顺便说一下,我检查了几个报告给 Ansible 的错误(比如 https://github.com/ansible/ansible/issues/23921),我的错误是相似的,但他们的变通方法不适用于我的情况。

任何帮助将不胜感激!!

这本剧本在 ansible 2.4 中适用于我的有限测试用例,我不确定它在处理更大/更复杂的任务或模块时效果如何。它基本上可以解决您网站的 dzdo/sudo 限制。

---

- hosts: 127.0.0.1
  become: yes
  become_method: dzdo
  become_flags: "su - root -c"
  gather_facts: no
  tasks:
  - name: Create  empty  file
    file: path=touchedFile.txt  state=touch

我终于找到了解决我的问题的方法,我将分享这个答案以防有人觉得它有用。

A​​nsible 成为模块很棒,但对我的公司来说它不起作用。正如我在问题中解释的那样,它在 sudo 的末尾添加了一个“-u root”,这使得整个命令失败。

我能够使用以下代码片段使其工作:

- name: Create empty file as sudo_userid
  command: "sudo su - sudo_userid -c 'touch touchedFile.txt'"

我做了几次测试,都成功了!我什至没有收到 Ansible 警告!

那么,大家干杯!