登录 | 立即注册 切换到窄版
查看: 6293|回复: 18

通过Ansible2.2实现web化管理思路

[复制链接]

3

主题

11

帖子

83

积分

版主

Rank: 7Rank: 7Rank: 7

积分
83
发表于 2016-9-18 23:32:41 | 显示全部楼层 |阅读模式
本帖最后由 zhoujian1028 于 2016-11-17 13:59 编辑

刚开发完的作业平台基于ansible2.2版本,python django开发,ansible2版api较之前版本有很大变化任务执行采用celery异步操作
任务执行过程实时回显 采用websocket

下面修改源码是在我不是很熟悉Callback下改的,其实不需要修改源码,可以忽略下面部分

为了获取每次任务执行状态,我依然对ansible源码进行修改

        self.callback = play_tasks.CallbackModule(taskList)  
// play_tasks 是play_tasks.py 基于callback下defult.py改造 实时记录playbook记录
        variable_manager = VariableManager()
        loader = DataLoader()
        self.inventory.clear_pattern_cache()
        playbook_path = os.path.join(ANSIBLE_DIR, playbook_relational_path)
        Options = namedtuple('Options', ['listtags', 'listtasks', 'listhosts', 'syntax', 'connection', 'module_path', 'forks', 'remote_user', 'remote_port', 'become', 'become_method', 'become_user', 'private_key_file', 'check'])
        options = Options(listtags=False, listtasks=False, listhosts=False, syntax=False, connection='ssh', module_path='/usr/lib/python2.6/site-packages/ansible/modules', forks=100, remote_user='ansible', remote_port='22', become=True, become_method='sudo', become_user='root', private_key_file='/home/ansible/.ssh/id_rsa', check=False)
        variable_manager.extra_vars = extra_vars
        passwords = {}
        pbex = PlaybookExecutor(playbooks=[playbook_path],
            inventory=self.inventory,
            variable_manager=variable_manager,
            loader=loader,
            options=options,
            passwords=passwords,
            task_id=task_id)
        pbex._tqm._stdout_callback = self.callback  
        pbex.run()


接下来修改ansible PlaybookExecutor
/usr/local/lib/python2.7/site-packages/ansible/executor/playbook_executor.py
    def __init__(self, playbooks, inventory, variable_manager, loader, options, passwords, task_id=0):   
        self._playbooks        = playbooks
        self._inventory        = inventory
        self._variable_manager = variable_manager
        self._loader           = loader
        self._options          = options
        self.passwords         = passwords
       self.task_id           = task_id
        self._unreachable_hosts = dict()

    pb = Playbook.load(playbook_path, variable_manager=self._variable_manager, loader=self._loader, task_id=self.task_id)

vim /usr/local/lib/python2.7/site-packages/ansible/playbook/__init__.py
    def __init__(self, loader):
        # Entries in the datastructure of a playbook may
        # be either a play or an include statement
        self._entries = []
        self._basedir = os.getcwd()
        self._loader  = loader
        self._file_name = None
        self._task_id = None


    @staticmethod
    def load(file_name, variable_manager=None, loader=None, task_id=None):
        pb = Playbook(loader=loader)
        pb._load_playbook_data(file_name=file_name, variable_manager=variable_manager, task_id=task_id)
        return pb

    def _load_playbook_data(self, file_name, variable_manager, task_id):

        if os.path.isabs(file_name):
            self._basedir = os.path.dirname(file_name)
        else:
            self._basedir = os.path.normpath(os.path.join(self._basedir, os.path.dirname(file_name)))

        # set the loaders basedir
        cur_basedir = self._loader.get_basedir()
        self._loader.set_basedir(self._basedir)

        self._file_name = file_name
        self._task_id = task_id                 // 此处添加 callback直接获取task_id    v2_playbook_on_start(self, playbook):  task_id = playbook._task_id

工具列表 入口

工具创建 支持yaml shell  无需保存即可当前页面调试


工具详情


工具执行页面  ip源从cmdb或者资源池获取 执行过程 实时回显


查看任务执行状态


如果是选择是shell 那边执行步骤是先把脚本传到目标机器 然后再执行该脚本



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

19

帖子

87

积分

注册会员

Rank: 2

积分
87
发表于 2016-9-19 10:29:01 | 显示全部楼层
不错!
回复

使用道具 举报

0

主题

2

帖子

29

积分

新手上路

Rank: 1

积分
29
发表于 2016-9-19 10:32:13 | 显示全部楼层
厉害!
回复

使用道具 举报

0

主题

2

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2016-9-19 10:38:29 | 显示全部楼层
恩,不错,
回复

使用道具 举报

1

主题

15

帖子

72

积分

注册会员

Rank: 2

积分
72
发表于 2016-9-19 14:35:23 | 显示全部楼层
mark
回复

使用道具 举报

1

主题

2

帖子

23

积分

新手上路

Rank: 1

积分
23
发表于 2016-9-19 15:16:53 | 显示全部楼层
求干货,求地址
回复 支持 反对

使用道具 举报

18

主题

30

帖子

195

积分

版主

Rank: 7Rank: 7Rank: 7

积分
195
发表于 2016-9-23 19:50:48 | 显示全部楼层
厉害!
回复

使用道具 举报

1

主题

7

帖子

39

积分

新手上路

Rank: 1

积分
39
发表于 2016-10-8 14:51:38 | 显示全部楼层
版主啥时候卖一份或者开源啊~
回复 支持 反对

使用道具 举报

0

主题

1

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2016-10-12 10:54:03 | 显示全部楼层
请问层主怎么实现任务的停止?比如说我某个任务或者某一些任务执行到一半不想执行了,我用celery的revoke方法的时候某些任务可以成功停止,但是某些任务不行
回复 支持 反对

使用道具 举报

3

主题

11

帖子

83

积分

版主

Rank: 7Rank: 7Rank: 7

积分
83
 楼主| 发表于 2016-10-14 13:11:19 | 显示全部楼层
xuboaitianli 发表于 2016-10-12 10:54
请问层主怎么实现任务的停止?比如说我某个任务或者某一些任务执行到一半不想执行了,我用celery的revoke方 ...

目前我还没涉及到任务停止,但是方式还是用revoke做中断。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|Ansible中国社区 ( 京ICP备13038968号

GMT+8, 2017-11-19 12:44 , Processed in 0.062511 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表