在现网应用中,安全加固后的主机是不允许直接以root用户登陆的,而很多命令又需要root用户来执行,在不改造现网的情况下。希望通过一个普通用户先登陆,再su切到root执行。而且每台主机的普通用户和root用户的密码又不同。希望在通过ansible执行的时候不需要交互输入密码,而是直接执行后输出结果。

一、ansible hosts配置文件

在之前的系列文章中我们提到,可以把密码写到hosts配置文件,通过查询官网的相关信息了解了,其除了ansible_ssh_user、ansible_ssh_pass变量外,还为su切换提供了ansible_su_pass变量,通过该变量我们可以把root密码直接写到配置文件中。具体如下:

1. [root@361way.com ~]# cat /etc/ansible/hosts
2. [test01]
3. 10.212.52.14=test ansible_ssh_pass=111111=*I2145
4. 10.212.52.16=test ansible_ssh_pass=xyz123 ansible_su_pass=mn1Pokm
5. 10.212.52.252=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查看时,会看到如下条目:

 

1. -S,--su run operations with su (deprecated,)
2. -R SU_USER,--su-user=SU_USER
3. (default=root)
4. (deprecated,)

 

三、su切换执行

所以结合上面两块,我们做下简单的测试:

 

1. [root@361way.com ~]# ansible all -S -R root -m shell -a "uptime"
2. 10.212.52.252||=0>>
3. 16:13pm345:40,2,:0.08,0.21,0.30
4. 10.212.52.16||=0>>
5. 16:26pm53823:17,2,:0.00,0.01,0.05
6. 10.212.52.14||=0>>
7. 16:24pm53822:39,2,:0.00,0.01,0.05

这里需要注意的是,普通用户的家目录是要存在,并切该普通用户要有写的权限的,不然会出现类似如下的报错:

1. 10.212.52.252|=>Authentication.
2. In,.
3. Considerin.cfg to a path rooted in"/tmp".
4. Failed:-p $HOME/.ansible/tmp/ansible-tmp-1449456070.96-212322517029279&&/.ansible/tmp/ansible-tmp-1449456070.96-212322517029279,
5. exited with result 1::`/home/amos/.ansible': Permission denied

当然,如果这个普通用户没有家目录或者家目录没有写权限在不修改远端主机也有办法可以搞定,修改ansible主机的ansible.cfg配置文件,如下:

1. [root@361way.com ~]# vim /etc/ansible/ansible.cfg
2. 找到如下行:
3. remote_tmp =/.ansible/tmp
4. 修改为
5. remote_tmp =/tmp/.ansible/tmp

tmp目录一般都有写的权限吧,改成临时目录为/tmp下即可。

再下为我们再看看远程主机的message日志文件确认下是否真的是通过普通用户切换的:

1. Dec311:36:20:(to root)/dev/pts/1//由普通用户test切换为su切换为root的日志
2. Dec311:36:20-command:Invoked=None=None=None=uptime removes=None=None=True=True//ansible执行的内容

功能实现了,最后要说的是,由于该配置文件中涉及到多台主机的用户名密码,所以该文件的安全工作一定要做好。