如何利用Ansible在远程机器上执行python脚本?

Ansible用来做配置管理是极好的, 但是有时配置完成后会需要基于环境做一些验证工作, 用好pip, script这些模块, 其实我们还是可以很方便的做到上面的事情的.

本文是作者在实践时遇到的一些坑以及对应的解决办法, 记录以供参考.

为了顺利的让我们的python脚本在远程环境上运行起来, 我们需要大致做下面几件事:

配置一个虚拟环境并且安装依赖的第三方package;

pip 模组本身已经支持 virtualenv 啦, 所以只要参照下面的写法指定一下 virtualenv 的路径即可, 比如:

- name: install python packages
    name:
      - xmltodict
      - pytest
    virtualenv: ~/venv/cd_project

基于虚拟环境执行我们的脚本, script模组支持指定executable的路径, 所以这里只要指定一下对应的executor的路径即可, 比如我想用pytest跑某个脚本, 那么就可以写成下面这种:

- name: run validation script
  script: scripts/test_server.py
  args:
    executable:  ~/venv/cd_project/bin/pytest
  register: pytest_result
  environment:
    MY_MONGODB_URI: "{{ MY_MONGODB_URI }}"

Note:

  • line2: 如果你的script是基于role写作的, 可以在对应的role目录下建一个scripts的目录, 将你的脚本放在对应文件夹, 指定script路径是用相对路径就好

  • line6~7: 如果想在执行脚本时传入某些环境变量(比如邮箱, 密码等), 可以通过environment关键字

  • 如果希望从controller主机上获取某些环境变量, 可以用 {{ lookup('env','variable_name') }}的方式获取, 例如:

      vars:
     MY_MONGODB_URI: "{{ lookup('env','MY_MONGODB_URI') }}"