date: 2020-03-28title: ansible普通用户执行root权限 #标题
tags: ansible提权 #标签
categories: ansible # 分类

最近有小伙伴问我关于ansible提权的问题,虽然网上的文档很多,但可能有一些没有提及的问题,小伙伴他自己没琢磨出来,这里我就把这个提权的问题总结一下。

环境

主机名 IP 是否拥有sudo权限 登录用户
ansible 192.168.20.2 zhangsan
client 192.168.20.3 lisi

需求

ansible使用zhangsan用户登录,去通过client端的lisi用户启动client主机上的httpd服务(启动httpd服务需要使用sudo权限)。

实现过程

对zhangsan和lisi用户进行sudo授权

zhangsan的授权如下
  1. [zhangsan@ansible ~]$ sudo cat /etc/sudoers | grep zhangsan
  2. zhangsan ALL=(ALL) NOPASSWD:ALL

lisi的授权如下
  1. [lisi@client ~]$ sudo cat /etc/sudoers | grep lisi
  2. lisi ALL=(ALL) NOPASSWD:ALL

ansible上的zhangsan用户配置免密登录客户端的lisi用户

  1. [zhangsan@ansible ~]$ ssh-keygen -t rsa # 生成zhangsan的密钥
  2. [zhangsan@ansible ~]$ ssh-copy-id lisi@192.168.20.3 # 以lisi的用户角色发送到client主机上
  3. # 注:ansible主机上是没有lisi这个用户的
  4. [zhangsan@ansible ~]$ ssh lisi@192.168.20.3 # 测试以lisi的身份可以免密登录client主机

ansible定义主机组

  1. [zhangsan@ansible ~]$ egrep -v '^$|^#' /etc/ansible/hosts # host主机组配置如下
  2. [test] # 定义test主机组
  3. 192.168.20.3
  4. [test:vars] # 定义test主机组相关变量
  5. ansible_ssh_user="lisi" # 定义使用哪个用户去连接客户端
  6. ansible_ssh_port=22 # 定义客户端ssh监听的端口

编写playbook文件

  1. [zhangsan@ansible ~]$ cat /etc/ansible/start_httpd.yml # playbook文件如下
  2. ---
  3. - hosts: test
  4. become: yes
  5. become_method: sudo
  6. gather_facts: no
  7. tasks:
  8. - name: Start httpd
  9. service:
  10. name: httpd
  11. state: started
  12. enabled: yes

执行测试

  1. # 执行yml文件(zhangsan用户执行ansible-playbook指令无需提权)
  2. [zhangsan@ansible ~]$ ansible-playbook /etc/ansible/start_httpd.yml
  3. PLAY [test] *********************************************************************
  4. TASK [Start httpd] **************************************************************
  5. changed: [192.168.20.3]
  6. PLAY RECAP **********************************************************************
  7. 192.168.20.3 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  8. # 任务执行成功!!!