如何在Ansible剧本中将Shell函数作为命令运行?

时间:2020-04-13 22:43:39

标签: ansible

我在shell脚本中有一个函数,我想在我的ansible剧本中使用它

我的shell脚本-

wait_for_apt_locks () {
    while sudo fuser /var/{lib/cache/apt/archives}/{lock,lock-frontend} >/dev/null 2>&1; do
        echo "Waiting for apt locks"
        sleep 1
    done

我想在我的剧本wait.yml中使用此功能wait_for_apt_locks

下面是使用它的正确方法吗?

- name: source /tmp/function.sh
      shell: |
        source /tmp/functions.sh
        wait_for_apt_locks 

2 个答案:

答案 0 :(得分:1)

关于加载bash函数,我没有任何建议-如果您的示例可行,那么它可行!

但是请注意,Ansible有一个wait_for模块,用于监视端口或文件。

也许这是处理锁定文件的更Ansible本机解决方案。

来自https://docs.ansible.com/ansible/latest/modules/wait_for_module.html#examples

- name: Wait until the lock file is removed
  wait_for:
    path: /var/lock/file.lock
    state: absent

答案 1 :(得分:1)

如果仅出于在此处调用Shell脚本的目的而创建Shell脚本,则可以跳过脚本文件并直接执行内联逻辑。归根结底,如果可行,就可以了。

- name: Run a shell command inline
  become: true
  command: >
    while fuser {lib/cache/apt/archives}/{lock,lock-frontend} >/dev/null 2>&1; do
      echo "Waiting for apt locks";
      sleep 1;
    done
  ignore_errors: no
  args:
    chdir: /var

Documentation