专栏首页二狗的DBA之路【转载】 屏蔽Ansible中的危险命令方法

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

原文地址: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.

测试正常通过。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 修改alertmanager默认告警邮件中的url地址

    我们点击 “View in AlertManager ”的时候,会调到以alertmanager的主机名的url地址上,这样会出现各种异常(如打不开这个网址)

    二狗不要跑
  • Linux环境下的 pyenv的安装

    curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv...

    二狗不要跑
  • MySQL5.7配置基于GTID的复制及GTID回退到传统模式的方法

    mysqldump -uroot -proot -q--single-transaction -A  > /root/all.sql

    二狗不要跑
  • 解决wordpress搬家后,主题、插件升级时出现“无法创建目录”的问题

    用户1696846
  • MyBatis 3学习笔记(二)主要内容

    阿杜
  • C# 处理Word自动生成报告 三、设计模板

    FlyLolo
  • MySQL创建视图

    视图定义中引用的表或视图必须存在。但是,创建完视图后,可以删除定义引用的表或视图。可使用 CHECK TABLE 语句检查视图定义是否存在这类问题。

    弄啥嘞
  • jQuery Mobile开发的新闻阅读器,适应iphone和android手机

    程序员都很赖,你懂的! 我们经常上新浪,腾讯,雅虎等各大网站上面看新闻,他们也都各自推出了自家的手机新闻阅读器。今天我自...

    业余草
  • Django基础篇-模型基础

    小团子
  • jira7.8在centos7.4系统上报表服务不可用

    追马

扫码关注云+社区

领取腾讯云代金券