前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【转载】 屏蔽Ansible中的危险命令方法

【转载】 屏蔽Ansible中的危险命令方法

作者头像
保持热爱奔赴山海
发布2019-09-18 14:49:58
9070
发布2019-09-18 14:49:58
举报
文章被收录于专栏:饮水机管理员饮水机管理员

原文地址:https://www.jianshu.com/p/f8cbc12180b8

批量执行命令时,需要把一些危险命令屏蔽掉,从而将降低使用人员的误操作。

测试环境

ansible 2.3.0.0

os Centos 6.7 X64

python 2.6.6

需要过滤规则的模块

command

shell

script

raw

需要过滤的命令

rm -rf /

halt

poweroff

reboot

shutdown -h now

shutdown -r now

编写过滤代码

我们在解析完task后进行过滤,这就是/usr/lib/python2.6/site-packages/ansible/playbook/play.py中的Play类的load方法

我们在这个文件最后面,添加一个filter_cmd方法,进行过滤命令。代码如下:

def filter_cmd(data):

  filter_modules = ('command', 'shell', 'script', 'raw')

  filter_commands = ('rm -rf /','halt', 'poweroff', 'reboot', 'shutdown -h now','shutdown -r now')

  filter_commands = map(lambda x:x.replace(' ', '').lower(), filter_commands)

  for t in data['tasks']:

    if'action' in t:

      if t['action']['module'] in filter_modules:

        if t['action']['args']['_raw_params'].replace(' ', '').lower() in filter_commands:

          raise AnsibleParserError("Refused to execute the [%s] command in the [%s] module." % (t['action']['args']['_raw_params'], t['action']['module']))

    else:

      for m in filter_modules:

        if m in t:

          args=parse_kv(t[m], check_raw=True)

          if args['_raw_params'].replace(' ', '').lower() in filter_commands:

            raise AnsibleParserError("Refused to execute the [%s] command in the [%s] module." % (t[m], m))

在Play类的load方法中引用filter_cmd过滤命令

在p = Play()上方添加filter_cmd(data)  ,如下红色部分:

    @staticmethod

    def load(data, variable_manager=None, loader=None):

        if ('name' not in data or data['name'] is None) and 'hosts' in data:

            if isinstance(data['hosts'], list):

                data['name'] = ','.join(data['hosts'])

            else:

                data['name'] = data['hosts']

        filter_cmd(data)

        p = Play()

        return p.load_data(data, variable_manager=variable_manager, loader=loader)

在文件顶部引入需要的模块

from ansible.parsing.splitter import parse_kv

注意:不要加在from __future__ import (absolute_import, division, print_function)这行的上面,会报错的。

测试ansible

[root@master ansible]# ansible node1 -m shell -a 'halt'

ERROR! Refused to execute the [halt] command in the [shell] module.

[root@master ansible]# ansible node1 -m shell -a 'rm -rf /'

ERROR! Refused to execute the [rm -rf /] command in the [shell] module.

[root@master ansible]# ansible node1 -m command -a 'shutdown -r now'

ERROR! Refused to execute the [shutdown -r now] command in the [command] module.

[root@master ansible]# ansible localhost -m command -a 'echo shutdown -r now'

localhost | SUCCESS | rc=0 >>

shutdown -r now

测试ansible-playbook

[root@master ansible]# cat  test_filter.yml

- hosts: node1

  tasks:

   - name: test

     command: "rm -rf / chdir=/tmp/ creates=/tmp/a.txt"

[root@master ansible]# ansible-playbook test_filter.yml

ERROR! Refused to execute the [rm -rf / chdir=/tmp/ creates=/tmp/a.txt] command in the [command] module.

[root@master ansible]# cat  test_filter.yml

- hosts: node1

  tasks:

   - name: test

     shell: "shutdown -r now"

[root@master ansible]# ansible-playbook test_filter.yml

ERROR! Refused to execute the [shutdown -r now] command in the [shell] module.

测试正常通过。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-02-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档