benmo | 发布于 2018-06-15 14:53:33 | 阅读量 2973 | ? Ansible ?
发布于 2018-06-15 14:53:33 | ? Ansible ?

我们在新增服务器后通常会执行以下操作来手动关闭客户端的selinux

sed -i 's/=enforcing/=disabled/' /etc/selinux/config
setenforce 0

在我们不重启客户端的情况下,服务器的selinux处于'Permissive'状态,不影响我们我实际操作。

 

此时我们用ansible测试到客户机的连通性

# ansible node04 -m ping -u root -k
SSH password: 
node04 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

看似一切正常,但我们使用部分模块操作时,却发现selinux检查并不通过:

ansible node04 -m copy -a 'src=app-info.log dest=/tmp/' -k
SSH password: 
node04 | FAILED! => {
    "changed": false,
    "checksum": "a3bf6211a787d7a51122a2ff406ddd72b67c6701",
    "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"
}

 

在不重启客户端的情况下,我们需要按照提示安装'libselinux-python'才能操作客户端,但是,此时不能通过yum/shell模块去操作,因为yum/shell模块依赖python,会得到如上一样的报错反馈,所以此时,我们使用不依赖python的raw去安装。

# ansible node04 -m raw -a 'yum -y install libselinux-python' -k -o
node04 | CHANGED | rc=0 | (stdout) 已加载插件:fastestmirror\r\nLoading mirror speeds from cached hostfile\r\n * base: mirrors.aliyun.com\r\n * epel: mirrors.tongji.edu.cn\r\n * extras: mirrors.163.com\r\n * updates: mirrors.sohu.com\r\n正在解决依赖关系\r\n--> 正在检查事务\r\n---> 软件包 libselinux-python.x86_64.0.2.5-12.el7 将被 安装\r\n--> 解决依赖关系完成\r\n\r\n依赖关系解决\r\n\r\n================================================================================\r\n Package                   架构           版本               源            大小\r\n================================================================================\r\n正在安装:\r\n libselinux-python         x86_64         2.5-12.el7         base         235 k\r\n\r\n事务概要\r\n================================================================================\r\n安装  1 软件包\r\n\r\n总下载量:235 k\r\n安装大小:589 k\r\nDownloading packages:\r\n\rlibselinux-python-2.5-12.el7.x86_64.rpm                    | 235 kB   00:00     \r\nRunning transaction check\r\nRunning transaction test\r\nTransaction test succeeded\r\nRunning transaction\r\n\r  正在安装    : libselinux-python-2.5-12.el7 [                            ] 1/1\r  正在安装    : libselinux-python-2.5-12.el7 [##                          ] 1/1\r  正在安装    : libselinux-python-2.5-12.el7 [#####                       ] 1/1\r  正在安装    : libselinux-python-2.5-12.el7 [########                    ] 1/1\r  正在安装    : libselinux-python-2.5-12.el7 [###########                 ] 1/1\r  正在安装    : libselinux-python-2.5-12.el7 [#############               ] 1/1\r  正在安装    : libselinux-python-2.5-12.el7 [################            ] 1/1\r  正在安装    : libselinux-python-2.5-12.el7 [###################         ] 1/1\r  正在安装    : libselinux-python-2.5-12.el7 [######################      ] 1/1\r  正在安装    : libselinux-python-2.5-12.el7 [########################    ] 1/1\r  正在安装    : libselinux-python-2.5-12.el7 [########################### ] 1/1\r  正在安装    : libselinux-python-2.5-12.el7.x86_64                         1/1 \r\n\r  验证中      : libselinux-python-2.5-12.el7.x86_64                         1/1 \r\n\r\n已安装:\r\n  libselinux-python.x86_64 0:2.5-12.el7

 

之后,我们再次执行之前的copy操作,可以正常进行,且可以看到它多设置了一个secontext的上下文

# ansible node04 -m copy -a 'src=app-info.log dest=/tmp/' -k
SSH password: 
node04 | SUCCESS => {
    "changed": true,
    "checksum": "57bbe08bca53bc6cb8c3ad4855730a64f158068e",
    "dest": "/tmp/app-info.log",
    "gid": 0,
    "group": "root",
    "md5sum": "9e04f215d41cf64fbf4280643c8e6f50",
    "mode": "0644",
    "owner": "root",
    "secontext": "unconfined_u:object_r:user_home_t:s0",
    "size": 23070,
    "src": "/home/pengjk/.ansible/tmp/ansible-tmp-1529043022.9829628-60924778876197/source",
    "state": "file",
    "uid": 0
}

 

另外,还有一种情况是,我们的客户机无法上网,也没有内部yum源,在运行的服务器也不能随便重启,此时我们只能通过修改源码来解决。

1).首先我们进入到ansible源码目录,通过报错提示关键字'libselinux-python',找出源代码文件'module_utils/basic.py'

### 我是linux Minit,CentOS7在/usr/lib/python2.7/site-packages/ansible下
# cd /usr/local/lib/python3.5/dist-packages/ansible
# grep '(libselinux-python)' -R
Binary file module_utils/__pycache__/basic.cpython-35.pyc matches
module_utils/basic.py:                    self.fail_json(msg="Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!")

 

2).vim打开'module_utils/basic.py',搜索'libselinux-python'关键字,在1007行左右

1001     def selinux_enabled(self):
1002         if not HAVE_SELINUX:
1003             seenabled = self.get_bin_path('selinuxenabled')
1004             if seenabled is not None:
1005                 (rc, out, err) = self.run_command(seenabled)
1006                 if rc == 0:
1007                     self.fail_json(msg="Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!")
1008             return False
1009         if selinux.is_selinux_enabled() == 1:
1010             return True
1011         else:
1012             return False

 

我们可以看到,之所以手动关闭不生效是因为,ansible使用'selinuxenabled'命令的返回值来判断selinux是否开启,为了满足我们的需求,我们需要修改如下。

### 即:当getenforce 0的结果为'Disabled','Permissive'的任意一个,都认为selinux已经关闭
### 注意: 更新或者重新安装后,修改的配置会被还原!
1001     def selinux_enabled(self):
1002         if not HAVE_SELINUX:
1003             #seenabled = self.get_bin_path('selinuxenabled')
1004             seenabled = self.get_bin_path('getenforce')
1005             if seenabled is not None:
1006                 (rc, out, err) = self.run_command(seenabled)
1007                 #if rc == 0:
1008                 if out not in ['Disabled','Permissive']:
1009                     self.fail_json(msg="Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!")
1010             return False
1011         if selinux.is_selinux_enabled() == 1:
1012             return True
1013         else:
1014             return False

 

3).我们再次执行copy操作,可以正常进行,且发现没有'secontext'的上下文描述

# ansible node04 -m copy -a 'src=app-info.log dest=/tmp/' -k
SSH password: 
node04 | SUCCESS => {
    "changed": true,
    "checksum": "7d5a15ba26b69709981698de261e06592bb283d5",
    "dest": "/tmp/app-info.log",
    "gid": 0,
    "group": "root",
    "md5sum": "ba709129a47ddfc61cc8ff2373846e31",
    "mode": "0644",
    "owner": "root",
    "size": 103806,
    "src": "/home/pengjk/.ansible/tmp/ansible-tmp-1529045191.0324137-179005958155180/source",
    "state": "file",
    "uid": 0
}

 


内容更新于: 2018-06-19 09:09:15
链接地址: http://blog.leanote.com/post/benmo/ansible%E8%BF%9E%E6%8E%A5%E5%AE%A2%E6%88%B7%E7%AB%AFselinux%E9%97%AE%E9%A2%98

上一篇: 从0开始使用shell编写一个ansible模块

下一篇: windows加域/退域脚本

2973 人读过
立即登录, 发表评论.
没有帐号? 立即注册
0 条评论
文档导航