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

ansible:尝试切换用户时失败(超时错误),ansible,sudo,Ansible,Sudo,我需要能够登录到远程服务器,切换用户,然后,做任何需要的事情 我玩了ansible并找到了“成为”工具,所以我尝试了它,毕竟。。。它允许你这么做 我的剧本是这样的: - name: Create empty file file: path=touchedFile.txt state=touch become: true become_method: dzdo become_user: userid dzdo touch touchedFile.txt dzdo su -

我需要能够登录到远程服务器,切换用户,然后,做任何需要的事情

我玩了ansible并找到了“成为”工具,所以我尝试了它,毕竟。。。它允许你这么做

我的剧本是这样的:

- name: Create  empty  file
  file: path=touchedFile.txt  state=touch
  become: true
  become_method: dzdo
  become_user: userid
dzdo touch touchedFile.txt
dzdo su - userid
- name: Create  empty  file
  shell: |
    dzdo su - userid
    touch  touchedFile.txt
我运行它并得到: “很抱歉,不允许用户someuser执行'/bin/sh-c echo been SUCCESS xklihidmxppfvxnbquvsqrgfjlyrsah;/usr/bin/python/tmp/ansible-tmp-1513185770.1-52571838933499/command.py'

嗯……我想也许它是想执行这样的事情:

- name: Create  empty  file
  file: path=touchedFile.txt  state=touch
  become: true
  become_method: dzdo
  become_user: userid
dzdo touch touchedFile.txt
dzdo su - userid
- name: Create  empty  file
  shell: |
    dzdo su - userid
    touch  touchedFile.txt
不幸的是,在我的公司,它不是这样工作的。该策略强制我们以自己的身份登录,然后切换到所需的用户,如下所示:

- name: Create  empty  file
  file: path=touchedFile.txt  state=touch
  become: true
  become_method: dzdo
  become_user: userid
dzdo touch touchedFile.txt
dzdo su - userid
- name: Create  empty  file
  shell: |
    dzdo su - userid
    touch  touchedFile.txt
我做了一些研究,并尝试在一个块中运行多个命令,我的逻辑认为,如果我首先切换用户,那么其他所有操作都将作为其他用户执行。我的playbook更新为如下所示:

- name: Create  empty  file
  file: path=touchedFile.txt  state=touch
  become: true
  become_method: dzdo
  become_user: userid
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\u userid-u root

如果我尝试在服务器上运行它(复制和粘贴),它也会失败…为什么Ansible要添加“-u根目录”,有没有办法阻止它这样做?我永远不会被授予对任何服务器的根目录访问权限

此外,我正在将ansible\u been\u pass变量设置为正确的值……但它仍然失败

顺便说一句,我检查了几个报告给Ansible的bug(比如),我的错误与之类似,但它们的解决方法不适用于我的案例


任何帮助都将不胜感激!!

这本手册在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

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

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

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

- name: Create empty file as sudo_userid
  command: "sudo su - sudo_userid -c 'touch touchedFile.txt'"
我做了几次测试,所有的测试都成功了!我甚至没有收到任何警告


所以,为大家干杯!

谢谢Phil M!我尝试了你的建议,但还是失败了…我得到了以下错误:致命:[srv]:失败!=>{“更改”:false,“失败”:true,“模块\u stderr”:“到remoteserver.com的共享连接已关闭。\r\n”,“模块\u stdout”:抱歉,不允许用户someuser执行“/bin/sh-c echo been SUCCESS zhyjbuefcexvrklzuatablpteqrjiowi;/usr/bin/python/u/users/someuser/.ansible/tmp/ansible-tmp-1614914.8-162485778/setup.py;rm-rf\”/u/users/someuser/.ansible/tmp-1614914.8-162485778/\>/dev/null 2>&1”作为远程服务器上的根用户。\r\n”、“msg:“模块故障”有什么想法吗?