【问题标题】:Ansible: have sudo but no rootAnsible:有 sudo 但没有 root
【发布时间】:2016-02-05 10:04:03
【问题描述】:

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

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

抱歉,awoolford 用户不允许执行 '/bin/bash -c echo 成为成功- […] /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的sn-p:

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

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

【问题讨论】:

  • 你说你可以手动ssh到节点并执行命令,那是哪个用户?
  • 我可以sudo [some_command] 作为用户awoolford,前提是它不在! 列表之一中(参见/etc/sudoers 的sn-p)。
  • 你能分享一个抛出错误的示例播放/角色吗?

标签: ansible redhat ansible-playbook


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    runthisplaybook.yml

    ---
    - hosts: label_which_will_work_on_some_servers
      sudo: yes
    
      roles: 
        - some_role_i_want_to_run
    

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

    - 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 "target_svr_type=${ server_type} deploy_environment=${DEPLOY_ENVIRONMENT} ansible_user=${ANSIBLE_USER}"

    【讨论】:

      【解决方案3】:

      在对该主题进行研究后,从 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 而不是 become),但这是一种解决方案,在我看来,这比在您管理的每个节点上创建虚拟 shell 更好。

      【讨论】:

        【解决方案4】:

        我认为现在sudo: yes 已被贬低并替换为become: yes

        ---
        - hosts: servers_on_which_you_want_to_run
          become: yes
        
          roles: 
            - some_role
        

        smiplist 的解决方案是在你的 playbook 目录中创建一个 ansible.cfg ,如果它不接受 root 用户:

        [defaults]
        sudo_user      = UsernameToWhichYouWantToUse
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-22
          • 2020-05-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-03
          • 1970-01-01
          • 1970-01-01
          • 2019-05-17
          相关资源
          最近更新 更多