ansible:尝试切换用户时失败(超时错误)
我需要能够登录到远程服务器,切换用户,然后,做任何需要的事情 我玩了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 -
- 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:“模块故障”有什么想法吗?