Ansible:有sudo但没有根

Ansible:有sudo但没有根,ansible,redhat,ansible-playbook,Ansible,Redhat,Ansible Playbook,我想使用Ansible来管理Hadoop集群(运行Red Hat)的配置 我有sudo访问权限,可以手动ssh进入节点执行命令。然而,当我试图运行Ansible模块来执行相同的任务时,我遇到了问题。虽然我有sudo访问权限,但我不能成为root用户。当我尝试执行需要提升权限的Ansible脚本时,会出现如下错误: 抱歉,不允许用户awoolford执行'/bin/bash-c echo' been-SUCCESS-[…]/usr/bin/python /tmp/ansible-tmp-14466

我想使用Ansible来管理Hadoop集群(运行Red Hat)的配置

我有sudo访问权限,可以手动
ssh
进入节点执行命令。然而,当我试图运行Ansible模块来执行相同的任务时,我遇到了问题。虽然我有
sudo
访问权限,但我不能成为root用户。当我尝试执行需要提升权限的Ansible脚本时,会出现如下错误:

抱歉,不允许用户awoolford执行'/bin/bash-c echo' been-SUCCESS-[…]/usr/bin/python /tmp/ansible-tmp-1446662360.01-23143552506280/副本“作为awoolford on [some_hadoop_node]

通过查看,我认为
been\u allow\u same\u user
属性可能会解决这个问题,因此我在
ansible.cfg
中添加了以下内容:

[privilege_escalation]
become_allow_same_user=yes
不幸的是,它不起作用

这表明我需要
sudo/bin/sh
(或其他shell)的权限。不幸的是,出于安全原因,这是不可能的。下面是
/etc/sudoers
中的一个片段:

root            ALL=(ALL)   ALL
awoolford       ALL=(ALL)   ALL, !SU, !SHELLS, !RESTRICT

Ansible能在这样的环境中工作吗?如果是这样,我做错了什么?

好吧,你不能像你的
/etc/sudoers
那样执行
/bin/sh
/bin/bash
。您可以做的是将ansible的默认shell更改为其他内容(变量
executable
位于
ansible.conf

由于您的sudo策略默认允许所有操作(对我来说似乎不太安全),并且我认为ansible希望有一个与sh兼容的shell,作为一个真正肮脏的黑客,您可以将
/bin/bash
复制到其他路径/名称,并相应地设置
可执行文件
变量(未测试)。

在playbook(some.yml)文件中,设置

运行此Playbook.yml

---
- hosts: label_which_will_work_on_some_servers
  sudo: yes

  roles: 
    - some_role_i_want_to_run
接下来,在角色//tasks/main.yml中,为您必须以sudo身份运行的操作指定。。使用类似于成为\u用户(其中common\u user是在某个角色的defaults\main.yml文件中定义为common\u user的变量:“this\u user\u can\u sudo”:

PS:运行ansible playbook时


ansible playbook运行thisplaybook.yml--sudo user=this\u user\u can\u sudo-i hosts.yml-u user\u将从\u source\u机器连接\u的用户\u-私钥${DEPLOYER\u key\u FILE}--extra vars“target\u svr\u type=${server\u type}部署\u环境=${deploy deploy environment}ansible\u用户=${ansible\u用户}”

我认为现在
sudo:yes
已被去除润滑油并替换为
been:yes

---
- hosts: servers_on_which_you_want_to_run
  become: yes

  roles: 
    - some_role
如果不接受
root
用户,smiplist解决方案只需在playbook目录中创建一个包含以下内容的
ansible.cfg

[defaults]
sudo_user      = UsernameToWhichYouWantToUse

希望,这将解决您的问题。

在对该主题进行研究后,从Ansible2.8开始,您似乎没有办法以不同用户的身份使用
been
在没有root权限的情况下运行命令

还有另一种方法可以实现你所要求的,而不必如此,如何说“黑客”

您可以将
shell
模块与
sudo su--c“COMMAND”
一起使用,以不同的用户身份执行命令,而无需对原始用户进行root访问

比如说,

  1 --- 
  2 - hosts: target_host
  3
  4   tasks:
  5   - shell: 'sudo su EXEC_USER -c "whoami"'
  6     register: x
  7
  8   - debug:
  9       msg: "{{ x.stdout_lines }}"   # This returns EXEC_USER
但是,如果您的游戏很复杂,则需要将其分解并仅包装需要作为不同用户执行的命令


这不是最佳实践(使用sudo+shell而不是been),但这是一个解决方案,在我看来,这比在您管理的每个节点上创建虚拟shell要好。

您说过可以手动ssh到节点并执行命令,这是哪个用户?我可以
sudo[some_command]
作为用户
awoolford
,前提是它不在
列表中(请参阅
/etc/sudoers
中的片段)。您能分享一个抛出错误的示例剧本/角色吗?
  1 --- 
  2 - hosts: target_host
  3
  4   tasks:
  5   - shell: 'sudo su EXEC_USER -c "whoami"'
  6     register: x
  7
  8   - debug:
  9       msg: "{{ x.stdout_lines }}"   # This returns EXEC_USER