Ansible:有sudo但没有root

时间:2015-11-04 18:54:32

标签: ansible redhat ansible-playbook

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

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

  

抱歉,用户awoolford不允许执行'/ bin / bash -c echo   BECOME-SUCCESS- [...] / usr / bin / python   /tmp/ansible-tmp-1446662360.01-231435525506280/copy'as awoolford on   [some_hadoop_node]。

仔细阅读documentation,我认为become_allow_same_user属性可能会解决此问题,因此我将以下内容添加到ansible.cfg

[privilege_escalation]
become_allow_same_user=yes

不幸的是,它没有用。

post表明我需要sudo /bin/sh(或其他一些shell)的权限。不幸的是,出于安全原因,这是不可能的。以下是/etc/sudoers的摘录:

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

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

4 个答案:

答案 0 :(得分:1)

好吧,您根本无法在/bin/sh节目中执行/bin/bash/etc/sudoers。您可以做的是将ansible的默认shell更改为其他内容(executable中的变量ansible.conf)。

由于你的sudo策略默认允许所有内容(对我来说似乎不太安全),并且我认为ansible期望一个sh兼容的shell,作为一个非常脏的黑客你可以将/bin/bash复制到其他路径/ name并相应地设置executable变量(未测试)。

答案 1 :(得分:0)

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

<强> runthisplaybook.yml

---
- hosts: label_which_will_work_on_some_servers
  sudo: yes

  roles: 
    - some_role_i_want_to_run

接下来,在您必须以sudo身份运行的操作的角色// tasks / main.yml中使用类似 become_user 的内容(其中common_user是在某个角色中定义的变量&#39 ; s默认为\ main.yml文件为common_user:&#34; this_user_can_sudo&#34;:

- name: Run chkconfig on init script
  command: "sudo -u root /sbin/chkconfig --add tomcat" 

# Set execute permission on run_jmeter_test.sh
- name: Set execute permission on run_jmeter_test.sh
  command: "chmod -R 755 {{ jmeter_perf_tests_results }}"
  become_user: "{{ common_user }}"

# OR Set execute permission on run_jmeter_test.sh
- name: Set execute permission on run_jmeter_test.sh
  command: "sudo -u firstuser sudo -u seconduser chmod -R 755 {{ jmeter_perf_tests_results }}"
  become_user: "{{ common_user }}"

# OR Set execute permission on run_jmeter_test.sh
- name: Set execute permission on run_jmeter_test.sh
  command: "chmod -R 755 {{ jmeter_perf_tests_results }}"
  become_user: "{{ common_user }}"

PS :在运行ansible-playbook时,

ansible-playbook runthisplaybook.yml - sudo-user = this_user_can_sudo -i hosts.yml -u user_which_will_connect_from_source_machine --private-key $ {DEPLOYER_KEY_FILE} --extra-vars&#34; target_svr_type = $ {server_type} deploy_environment = $ {DEPLOY_ENVIRONMENT} ansible_user = $ {ANSIBLE_USER}&#34;

答案 2 :(得分:0)

经过对该主题的研究,从Ansible 2.8 开始,您似乎没有办法在没有root权限的情况下使用become以其他用户身份运行命令。

还有另一种方法可以解决您的问题,即如何使其变得“ hacky”。​​

您可以将shell模块与sudo su - <user> -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而不是成为),但这是一种解决方案,在我看来,这比在您管理的每个节点上创建虚拟shell更好。

答案 3 :(得分:-1)

我认为现在sudo: yes已被删除并替换为become: yes

---
- hosts: servers_on_which_you_want_to_run
  become: yes

  roles: 
    - some_role

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

[defaults]
sudo_user      = UsernameToWhichYouWantToUse

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