track问题。

问题的引出

自从部署了ansible之后,解决了一些不痛不痒的问题,但是还没有实质性地解决过痛点需求。

作为一个运维工具的尊严就是要能让傻瓜都会用,单纯ansible的话,还不足做到这一点,所以就有人(或公司,redhat)顺理成章的开发了基于ansible的壳儿————AWX。

AWX说白了就是ansible的一个可视化管理平台,尽量把一些需要写在脚本中的参数代码或变量改为填进网页的表单中,这样就降低了工具的使用门槛。

所以,为了给同事们降低使用门槛,我决定部署AWX。

end of storyline 1

转场ing……

公司的绝大部分网络设备都是华为出品的NE系列设备,对这个厂商没什么好感。

不过没好感归没好感,活儿还是要干的,眼下最紧迫的需求就是要用ansible集中管理华为的网络设备,越多越好。

所有需要与ansible对接的设备厂商都会提供若干编写好的功能模块,以实现设备接口和运维工具之间的功能性对接。

华为……也有相应的支持,不过程度相当有限:只能支持CE系列设备也就算了,还只能支持到ansible 2.2,版本再高就不行了。

end of storyline 2

现在的问题是:AWX必须配合ansible 2.6以上的版本工作。

我在2019年第29周所做的努力

我找到了一个民间的功能模块包,把ansible版本升级到2.7之后安装这个包并没有报错,好激动。

不过……

在此版本下执行剧本时,总是有如下报错,在2.2版本剧本运行正常。

[root@localhost ~]# ansible-playbook -e "a_ip=1.1.1.1 z_ip=1.1.1.2" bas_add_ip_segments.yml -vvv
ansible-playbook 2.8.2
  config file = /root/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible-playbook
  python version = 2.7.5 (default, Jun 20 2019, 20:27:34) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
Using /root/ansible.cfg as config file
host_list declined parsing /root/hosts as it did not pass it's verify_file() method
script declined parsing /root/hosts as it did not pass it's verify_file() method
auto declined parsing /root/hosts as it did not pass it's verify_file() method
Parsed /root/hosts inventory source with ini plugin

PLAYBOOK: bas_add_ip_segments.yml *************************************************************************************************************************************************************
1 plays in bas_add_ip_segments.yml

PLAY [Add IP Segements To SZ Bas] *************************************************************************************************************************************************************
META: ran handlers
ERROR! Unexpected Exception, this is probably a bug: cannot import name connection_loader
the full traceback was:

Traceback (most recent call last):
  File "/usr/bin/ansible-playbook", line 110, in module
    exit_code = cli.run()
  File "/usr/lib/python2.7/site-packages/ansible/cli/playbook.py", line 123, in run
    results = pbex.run()
  File "/usr/lib/python2.7/site-packages/ansible/executor/playbook_executor.py", line 169, in run
    result = self._ tqm . run(play=play)
  File "/usr/lib/python2.7/site-packages/ansible/executor/task_queue_manager.py", line 249, in run
    play_return = strategy.run(iterator, play_context)
  File "/usr/lib/python2.7/site-packages/ansible/plugins/strategy/linear.py", line 245, in run
    action = action_loader.get(task.action, class_only=True)
  File "/usr/lib/python2.7/site-packages/ansible/plugins/loader.py", line 558, in get
    self._ module_cache[path] = self._ load_module_source(name, path)
  File "/usr/lib/python2.7/site-packages/ansible/plugins/loader.py", line 536, in _ load_module_source
    module = imp.load_source(to_native(full_name), to_native(path), module_file)
  File "/usr/lib/python2.7/site-packages/ansible/plugins/action/ce_config.py", line 27, in module
    from ansible.plugins.action.ce import ActionModule as _ ActionModule
  File "/usr/lib/python2.7/site-packages/ansible/plugins/action/ce.py", line 28, in module
    from ansible.plugins import connection_loader
ImportError: cannot import name connection_loader

这一周,这个报错已经被我看到吐了,我在墙内墙外查了能查的所有资料,并没有找到能解决这个报错的任何头绪。

后来开始使用瞎猫碰死耗子法,各种修改底层环境,打算从根本上击溃对手,升级python版本,升级ansible版本,升级各种环境版本……

最后底层环境已经被我改得面目全非了。

不过,并没有用……

以上就是这一周来为解决此问题所做的努力。

下周要去广州培训,还不知道有没有时间搞这个。

AnyWay,see you next week.