ansible tricks

最近又在写 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 即可。

Some rights reserved
Except where otherwise noted, content on this page is licensed under a Creative Commons Attribution-NonCommercial 4.0 International license.