Ansible 1.9升级2.4版本git模块bug修复方案

一、问题

表向问题:使用ansible-playbook无法git pull git版本仓库分支版本

实际问题:使用Ansible-playbook无法从git版本库更新版本

二、环境信息

  • 系统信息

LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch

Distributor ID: CentOS

Description: CentOS release 6.8 (Final)

Release: 6.8

Codename: Final


  • Ansible版本信息

ansible 2.4.2.0

config file = /etc/ansible/ansible.cfg



三、场景还原


业务的config一直由运维维护,近期在做机房迁移涉及到两套config并行维护。因此在git上切换出cloud分支,使用git在新环境上部署cloud分支版本,发现一直是旧配置无法更新。起初还原Ansible无法拉取分支版本(表向问题),后经多次测试验证发现是配置无法拉取(实际问题)。

四、思路还原

  1. 发现问题

使用ansible-playbook发布config发面版本无法拉取

  1. 因拉的是分支版本,怀疑ansible不支持分支版本拉取

  2. 经google发现 version 支持分支、hash、tags等功能,经验证功能可行

  3. 怀疑git server异常,手动删除config目录,在console使用git pull手动拉取代码,并checkout发现均正常

  4. 怀疑ansible-playbook异常,使用ansible在console终端还原ansible-playbook命令发现均正常使用

ansible localhost -u root -m git -a 'repo=git-address.com dest=./ version=40bitsha1hash'



  • 怀疑ansible-playbook yml异常,分拆 git 代码拉取的代码到 tmp.yml测试,替换所有的变量为实际参数,发现正常,拉取代码

  • 注释原有的yml文件git pull代码段,替换为tmp.yml文件内容, 测试正常


tip:

这个时候已经非常怀疑ansible版本升级后的问题,但changelog看不出来有什么异常,暂无法下手和思路

  1. 想到ansible经常出现的引号问题尝试修改git pull代码的引号

  • 旧代码

- name: Git pull php config

git: repo="{{ repository_php_config }}" dest="{{ configstore }}"config version="{{ git_commit }}"



  • 新代码

- name: Git pull php config

git: repo="{{ repository_php_config }} dest={{ configstore }}config version={{ git_commit }}"



TIP

不出意外的报格式错

  1. 到这里的时候已经有点无解了,google也无法找到合适的信息。仔细对比两次的输出结果会发现,两次执行过程中 git 去比较的时候会有一个 before  after 输出,这两个输出,如果写的是变量格式 ,则before 和 after hash一致,因此不做变更,而直接写参数则内容不一致,会执行内容。

-vvvv 参数排查输出结果

  • 返回成功但不执行(异常)

ok: [localhost] => {

"after": "9edab81f1c36d9b1ed207d987000a1265bb8cda5",

"before": "9edab81f1c36d9b1ed207d987000a1265bb8cda5",

"changed": false,

"invocation": {

"module_args": {

"accept_hostkey": false,

"archive": null,

"bare": false,

"clone": true,

"depth": null,

"dest": "/data/sa/AutomaticTool/files/config",

"executable": null,

"force": false,

"key_file": null,

"recursive": true,

"reference": null,

"refspec": null,

"remote": "origin",

"repo": "[email protected]:OPS/php-config.git",

"ssh_opts": null,

"track_submodules": false,

"umask": null,

"update": true,

"verify_commit": false,

"version": "9edab81f1c36d9b1ed207d987000a1265bb8cda5"

}

},

"remote_url_changed": false


}

  • 返回成功且正常执行(正常)

changed: [localhost] => {

"after": "9edab81f1c36d9b1ed207d987000a1265bb8cda5",

"before": null,

"changed": true,

"invocation": {

"module_args": {

"accept_hostkey": false,

"archive": null,

"bare": false,

"clone": true,

"depth": null,

"dest": "/data/sa/AutomaticTool/files/config",

"executable": null,

"force": false,

"key_file": null,

"recursive": true,

"reference": null,

"refspec": null,

"remote": "origin",

"repo": "[email protected]:OPS/php-config.git",

"ssh_opts": null,

"track_submodules": false,

"umask": null,

"update": true,

"verify_commit": false,

"version": "9edab81f1c36d9b1ed207d987000a1265bb8cda5"

}

}

}



大家主要关注 before  after 两个参数的结果

  1. 实在没有办法,这里只能一点点试了,估计是1.9版本升级2.4版本兼容性问题的可能性大! 奇迹来了!!

图片

然后问题就解决了。。。!! 所以升级 2.4版本后,playbook格式的书写最好缩进的方式书写,虽然现在只遇到git 模块。

五、1.9版本长级2.4版本还是要多做测试,目前遇到的2大问题

  1. git pull模块变量使用方式,如上文内容

  2. shell模块环境变量(非常繁杂,升级后遇到各类诡异问题

  • 解决方案:在要执行的shell模块中,事先声明环境变量 source /etc/profile


猜你喜欢

转载自blog.51cto.com/15060546/2651596