可以在ansible中同步local_action吗?

时间:2015-05-12 10:08:35

标签: ansible

我使用Ansible来配置流浪汉机器。现在我希望playbook解压缩数据库转储,将其导入vm,然后重新压缩。

在"正常"模式这不是什么大问题,但由于我的转储可能非常大,因此解压缩/压缩操作需要花费大量时间。我想使用"火,忘了"此处描述的方法https://docs.ansible.com/playbooks_async.html

这个想法是:

  1. "开火,忘记" dump bunzip
  2. [执行所有其他操作,如包安装,配置ecc]
  3. 回到bunzip
  4. import dump
  5. fire and forget dump recompression
  6. 如果我尝试使用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最后的再压缩,而不必等待它完成。

1 个答案:

答案 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需要更长的时间,你可能需要增加它。