需求场景
在工作中,我会经常遇到一种情况,比如需要快速爬一批数据,或者需要大规模的数据分析,此时我们通常的做法是,写一个爬虫或者写一个数据分析程序,然后把程序分别上传到各个服务器,并启动;如果服务器数量庞大,手动做这些事情的时间成本较高,于是我们借助 Ansible + Tmux +Tmuxp 实现 程序的自动化部署 与 启动 两个流程;
程序的自动化多机部署
步骤
1、需要部署的程序
2、tmuxp 启动脚本
3、ansible 部署脚本(部署 程序 与 tmuxp 启动脚本)
Tmuxp 启动脚本
sudo vim tmuxp_temp_program.yaml
session_name: TmuxpTempProgram
windows:
- window_name: TmuxpTempProgram
layout: tiled
shell_command_before:
- cd /usr/tempcode # run as a first command in all panes
panes:
- python temp_program.py # pane no. 1
Ansible 部署脚本
sudo vim deploy_code.yml
- hosts: temp
become: true
tasks:
- name: deploy temp_program.py
copy:
src: "./temp_program.py"
dest: '/usr/tempcode/temp_program.py'
- name: deploy tmuxp for temp_program
copy:
src: "./tmuxp_temp_program.yaml"
dest: '/usr/tempcode/tmuxp_temp_program.yaml'
- name: deploy tmuxp for temp_program
shell: tmuxp load ./usr/tempcode/tmuxp_temp_program.yaml
ansible-playbook deploy_code.yml
这里有几点要注意:
1、ansible 是 无法读取到我们配置的环境变量的,但是可以读到 /usr/bin ,因此,如果直接使用 tmuxp、pip、python 等命令,需要把这些命令安装到 /usr/bin 或者 创建软链接到 /usr/bin 下,我这里会为需要的模块单独创建个软链接,用来和系统的链接分开,比如:
sudo ln -s $(which pip) /usr/bin/ezpip
2、直接执行 tmuxp 会卡住,因为 tmuxp 不会有返回值,而是一个开启新 session 和 新窗口的操作,所以这一步是无法实现的,最后无奈只能手动 tmuxp load 了,这个问题留着以后想办法解决一下。