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
我终于找到了解决我的问题的方法,我将分享这个答案以防有人觉得它有用。
Ansible 成为模块很棒,但对我的公司来说它不起作用。正如我在问题中解释的那样,它在 sudo 的末尾添加了一个“-u root”,这使得整个命令失败。
我能够使用以下代码片段使其工作:
- name: Create empty file as sudo_userid
command: "sudo su - sudo_userid -c 'touch touchedFile.txt'"
我做了几次测试,都成功了!我什至没有收到 Ansible 警告!
那么,大家干杯!
我需要能够登录到远程服务器,切换用户,然后执行任何需要的操作。
玩了一下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
我终于找到了解决我的问题的方法,我将分享这个答案以防有人觉得它有用。
Ansible 成为模块很棒,但对我的公司来说它不起作用。正如我在问题中解释的那样,它在 sudo 的末尾添加了一个“-u root”,这使得整个命令失败。
我能够使用以下代码片段使其工作:
- name: Create empty file as sudo_userid
command: "sudo su - sudo_userid -c 'touch touchedFile.txt'"
我做了几次测试,都成功了!我什至没有收到 Ansible 警告!
那么,大家干杯!