我使用Ansible来配置流浪汉机器。现在我希望playbook解压缩数据库转储,将其导入vm,然后重新压缩。
在"正常"模式这不是什么大问题,但由于我的转储可能非常大,因此解压缩/压缩操作需要花费大量时间。我想使用"火,忘了"此处描述的方法https://docs.ansible.com/playbooks_async.html
这个想法是:
如果我尝试使用local_action
进行bunzip,则会死于ERROR: unexpected error: unable to determine jid
可以执行异步本地任务吗?
修改
任务列表示例
# start async unzip
- name: bunzip dump
command: bunzip2 /vagrant/vagrant_provision/dump.sql.bz2
async: 10000
poll: 0
register: bunzip_status
#[... do other things ...]
# connect back to unzip and wait for it to end
- name: Check for dump bunzip
async_status: jid={{ bunzip_status.ansible_job_id }}
register: bunzip_result
until: bunzip_result.finished
retries: 80
#[... Import db ...]
# Fire and forget dump recompression
- name: Recompress dump
command: bzip2 /vagrant/vagrant_provision/dump.sql
async: 10000
poll: 0
现在..因为我正在使用它来配置一个流浪汉环境我通过将我的playbook和文件放在vagrant共享文件夹中并通过绝对路径引用它们来部分解决,并且它可以正常工作。
但问题是:可以异步local_action
(甚至只是delegate_to
)?
在这种情况下,使用local_action
代替远程执行归档/取消归档允许我使用我所有的cpus(4对1分配给vm)来执行这些操作,我甚至可以关闭vm最后的再压缩,而不必等待它完成。
答案 0 :(得分:0)
每当我想在Ansible中使用背景/异步命令时,我已经到了使用gnu screen的地步,以便我可以验证命令是否正常运行。
鉴于您所描述的内容,当您已达到第3步时,需要提出通知Ansible的方法。要做到这一点,您可能想要创建一个Ansible可以查找的临时标志文件。所以,为了做你所描述的,我可能会沿着这些方向做点什么:
首先,我创建一个包装器脚本来解压缩文件只是为了让事情变得更清晰。它会创建我在bunzip完成时提到的标志文件。这是一个简单的例子:
#!/bin/bash
rm -f /tmp/bunzip.done
bunzip /path/to/file.bz2
touch /tmp/bunzip.done
exit
然后我会在这样的屏幕会话中从Ansible中执行此操作(我在这个例子中使用sudo,因为我通常也会将我的屏幕会话传递给特定用户):
- name: invoke bunzip script
local_action: command /usr/bin/screen -d -m sudo -u someuser /path/to/bzip_script.sh
async: True
poll: 0
此时您可以在Ansible中做任何您需要做的事情。一旦你进入第3步,你就会想要做这样的事情:
- name: wait for bunzip if it is still running
local_action: wait_for path=/tmp/bunzip.done state=present
只要wait_for脚本没有错误地返回,您就应该能够安全地引用bunzipped数据。 wait_for默认为300秒超时,因此如果你希望bunzip需要更长的时间,你可能需要增加它。