最近又在写 playbook,遇到些奇奇怪怪的环境,随手记录一下吧
目标机器Python版本不兼容
目标机器 Python 版本过低,无法使用 shell/command 模块。Python 版本过低,其实执行其他模块都有问题,想用 shell
或者 command
绕过也不行。最后的稻草就是 raw
。其他模块都需要先编译成 python 脚本拷贝到远端执行,raw
就是原生的 ssh 到远端,直接执行命令。
如果需要一些比较复杂的操作,raw
就不好整。下意识是写一个脚本,然后拷贝到远端执行。但是目标机器 Python 版本已经不兼容了,copy
也没法使用。
那就 base64
拯救一下,把脚本先 base64
编码一下,然后再远端解码成脚本,再执行。echo
总要有的吧。
tasks:
- name: Copy script to memory
run_once: yes
delegate_to: localhost
shell: cat script.sh
register: content_of_script
- name: Echo content to remote
raw: "echo -n '{{content_of_script.stdout | b64encode}}' > /tmp/script.sh.b64"
- name: Decode script with base64
raw: "cat /tmp/script.sh.b64 | base64 -d > /tmp/script.sh; chmod +x /tmp/script.sh"
然后很不幸,有的系统连 base64
命令也没有。openssl
总会有一个吧。使用 openssl
解码 base64 的时候,需要使用 -A
参数,否则,对于较长的 base64 编码内容,解码出来是空字符串。
tasks:
- name: Copy script to memory
run_once: yes
delegate_to: localhost
shell: cat script.sh
register: content_of_script
- name: Echo content to remote
raw: "echo -n '{{content_of_script.stdout | b64encode}}' > /tmp/script.sh.b64"
- name: Check if base64 command exists
raw: "command -v base64 > /dev/null 2>&1"
register: base64_check_result
ignore_errors: yes
- name: Decode script with base64
raw: "cat /tmp/script.sh.b64 | base64 -d > /tmp/script.sh; chmod +x /tmp/script.sh"
when: base64_check_result.rc == 0
- name: Decode script with openssl
raw: "openssl enc -base64 -d -in /tmp/script.sh.b64 -A > /tmp/script.sh; chmod +x /tmp/script.sh"
when: base64_check_result.rc != 0
不得不说,base64 真是个好伙伴...
nohup 启动服务失败
这个问题其实是以前遇到的。有的服务通过 bash 脚本启动,然后脚本里面通过 nohup 来启动服务。结果通过 ansible 远程执行脚本,服务并没有起来。playbook倒是显示脚本步骤执行且成功退出。
后来通过些手段,发现问题跟进程的 session group 有关。ansible 退出时,session group 收到信号,就给所有子进程都干掉了。ansible 的 ssh 配置有个 use_tty
的选项来控制,默认为 true
,修改为 false
即可。