在之前我曾总结了一点ansible系列博文,本篇还承接之前的篇幅吧。在现网应用中,安全加固后的主机是不允许直接以root用户登陆的,而很多命令又需要root用户来执行,在不改造现网的情况下。希望通过一个普通用户先登陆,再su切到root执行。而且每台主机的普通用户和root用户的密码又不同。希望在通过ansible执行的时候不需要交互输入密码,而是直接执行后输出结果。
一、ansible hosts配置文件
在之前的系列文章中我们提到,可以把密码写到hosts配置文件,通过查询官网的相关信息了解了,其除了ansible_ssh_user、ansible_ssh_pass变量外,还为su切换提供了ansible_su_pass变量,通过该变量我们可以把root密码直接写到配置文件中。具体如下:
- [root@361way.com ~]# cat /etc/ansible/hosts
- [test01]
- 10.212.52.14 ansible_ssh_user=test ansible_ssh_pass=111111 ansible_su_pass=*I2145
- 10.212.52.16 ansible_ssh_user=test ansible_ssh_pass=xyz123 ansible_su_pass=mn1Pokm
- 10.212.52.252 ansible_ssh_user=amos ansible_ssh_pass=asdf ansible_su_pass=xyzp)okm
注:我测试使用的ansible版本是1.9版的,在新的2.0版本中,变量也做了变化ansible_become_pass替换了之前的ansible_sudo_pass or ansible_su_pass ,具体可以参看官方文档。
二、ansible命令参数
在执行ansible -h查看时,会看到如下条目:
- -S, --su run operations with su (deprecated, use become)
- -R SU_USER, --su-user=SU_USER
- run operations with su as this user (default=root)
- (deprecated, use become)
三、su切换执行
所以结合上面两块,我们做下简单的测试:
- [root@361way.com ~]# ansible all -S -R root -m shell -a "uptime"
- 10.212.52.252 | success | rc=0 >>
- 16:13pm up 34 days 5:40, 2 users, load average: 0.08, 0.21, 0.30
- 10.212.52.16 | success | rc=0 >>
- 16:26pm up 538 days 23:17, 2 users, load average: 0.00, 0.01, 0.05
- 10.212.52.14 | success | rc=0 >>
- 16:24pm up 538 days 22:39, 2 users, load average: 0.00, 0.01, 0.05
这里需要注意的是,普通用户的家目录是要存在,并切该普通用户要有写的权限的,不然会出现类似如下的报错:
- 10.212.52.252 | FAILED => Authentication or permission failure.
- In some cases, you may have been able to authenticate and did not have permissions on the remote directory.
- Consider changing the remote temp path in ansible.cfg to a path rooted in "/tmp".
- Failed command was: mkdir -p $HOME/.ansible/tmp/ansible-tmp-1449456070.96-212322517029279 && echo $HOME/.ansible/tmp/ansible-tmp-1449456070.96-212322517029279,
- exited with result 1: mkdir: cannot create directory `/home/amos/.ansible': Permission denied
当然,如果这个普通用户没有家目录或者家目录没有写权限在不修改远端主机也有办法可以搞定,修改ansible主机的ansible.cfg配置文件,如下:
- [root@361way.com ~]# vim /etc/ansible/ansible.cfg
- 找到如下行:
- remote_tmp = $HOME/.ansible/tmp
- 修改为
- remote_tmp = /tmp/.ansible/tmp
tmp目录一般都有写的权限吧,改成临时目录为/tmp下即可。
再下为我们再看看远程主机的message日志文件确认下是否真的是通过普通用户切换的:
- Dec 3 11:36:20 linux su: (to root) test on /dev/pts/1 //由普通用户test切换为su切换为root的日志
- Dec 3 11:36:20 linux ansible-command: Invoked with creates=None executable=None chdir=None args=uptime removes=None NO_LOG=None shell=True warn=True //ansible执行的内容
功能实现了,最后要说的是,由于该配置文件中涉及到多台主机的用户名密码,所以该文件的安全工作一定要做好。