一、场景
近期在编写微服务的ansible部署脚本,有些需要使用root权限,所以就使用了ansible的become功能。本篇博客主要讲述关于 become 的相关用法。
二、环境
软件  | 版本  | 
Ansible  | 2.9.4  | 
Python  | 2.7.5  | 
Centos  | 7  | 
三、介绍
Ansible使用现有的以root权限或其他用户的权限的权限升级系统来执行任务。由于此功能使您可以“成为(become)”另一个用户,而该用户不同于登录计算机的用户(远程用户(remote_user)),因此我们将其称为become。 become关键字利用了现有的特权升级工具,例如sudo,su,pfexec,doas,pbrun,dzdo,ksu,runas,machinectl等
四、参数介绍
您可以设置控制become进入play或task级别的指令。您可以通过设置连接变量来覆盖这些变量,而连接变量通常在一台主机之间会有所不同。这些变量和指令是独立的。比如,可以单独设置become_user,而不设置become。
参数  | 默认  | 含义  | 是否必需  | 
become  | 是否进行提权操作。如果需要,设置为  | 是  | |
become_user  | root  | 设置为具有所需特权的用户-您想要成为的用户,而不是您登录时使用的用户  | 否  | 
become_method  | sudo  | 权限工具,如  | 否  | 
become_flags  |   | 否  | 
五、样例
- 官方提供
 
# 要以非root用户身份连接管理系统服务(需要root特权),可以使用默认值begin_user
- name: Ensure the httpd service is running
service:
name: httpd
state: started
become: yes
# 以apache用户身份运行命令
- name: Run a command as the apache user
command: somecommand
become: yes
become_user: apache
# 要在shell程序不登录时以nobody用户身份执行操作
- name: Run a command as nobody
command: somecommand
become: yes
become_method: su
become_user: nobody
become_flags: '-s /bin/sh'
- 个人样例
 
- name: 修改配置文件-/etc/ld.so.conf
shell: sh -c 'echo -e "\n{{lboso_install_path}}" >> /etc/ld.so.conf'
become: yes
tags:
- micro_install_clean
说明
功能点  | 用途  | 
become  | 使用  | 
tags  | 标签,适合通过标签实现一个  | 
六、问题
6.1、使用become好像不生效,一直报权限不足的问题或者需要输入密码
是因为没有设置对应的密码,在这里有两种方式可以设置
1. 启动脚本设置
启动脚本加入参数-K,这个是强制要求输入密码,在脚本启动的时候,就会要求填写
2. hosts文件里面的主机列表设置
需要执行become的地方,设置ansible_become_password参数,如下图:
[test_server]
10.13.4.[48:51] ansible_ssh_user="test" ansible_ssh_pass='111111' ansible_sudo_pass='111111' ansible_become_password='111111'
6.2、使用sudo echo a >>  权限文件会报权限不足的问题
这个是权限问题,可以有两种方式解决:
1. 切换到root用户即可解决
2. 使用脚本sudo sh -c 'echo a >> 权限文件'
七、总结
ansible是一门强大的工具,集成了很多不错的功能模块。学习这些东西,可以减少我们重复的工作,提高工作效率。实际工作中,是会遇到需要提权的时候,而become可以帮忙解决这些问题。

八、参考链接
user_guide/become
 plugins/become/sudo 
become.html#become-plugins
随缘求赞
如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;如果有好的讨论,可以留言;












