如何在Ansible中将shell函数作为命令运行?

时间:2016-09-21 17:00:51

标签: bash shell ansible ansible-playbook nvm

我正在使用nvmhttps://github.com/creationix/nvm),它本质上是一个shell脚本,您可以将其导入shell,然后调用,例如nvm install [version]。但无论我如何尝试并调用该函数,ansible似乎都无法找到它。

我尝试过使用commandshell模块。我尝试过使用becomebecome_user。我尝试在https://github.com/leonidas/ansible-nvm/blob/master/tasks/main.yml中使用sudo -iu,但它对我不起作用。它必须是可能的,因为它适用于该文件。

如何在Ansible中运行任何shell函数?在这种情况下,我的.zshrc中有一个source nvm.sh,它允许我从交互式shell中执行nvm命令。

2 个答案:

答案 0 :(得分:5)

您需要使用shell模块,因为您要运行shell命令,并且需要在nvm脚本中获取该环境。类似的东西:

- shell: |
    source /path/to/nvm
    nvm install ...

您是否使用become取决于您是否要将命令作为root(或其他用户)运行。

答案 1 :(得分:0)

这是我的剧本:

- hosts: all
  vars:
    # https://github.com/nvm-sh/nvm/releases
    nvm_version: "0.34.0"

    # https://github.com/nodejs/node/releases
    # "node" for latest version, "--lts" for latest long term support version,
    # or provide a specific version, ex: "10.16.3"
    node_version: "--lts"
  tasks:
  - name: Get_nvm_install_script | {{ role_name | basename }}
    tags: Get_nvm_install_script
    get_url:
      url: https://raw.githubusercontent.com/nvm-sh/nvm/v{{ nvm_version }}/install.sh
      dest: "{{ ansible_user_dir }}/nvm_install.sh"
      force: true

  - name: Install_or_update_nvm | {{ role_name | basename }}
    tags: Install_or_update_nvm
    command: bash {{ ansible_user_dir }}/nvm_install.sh

  - name: Install_nodejs | {{ role_name | basename }}
    tags: Install_nodejs
    shell: |
      source {{ ansible_user_dir }}/.nvm/nvm.sh
      nvm install {{ node_version }}
    args:
      executable: /bin/bash

请注意使用executable: /bin/bash,因为source命令并非在所有shell中都可用,因此我们指定bash是因为它包括source

作为source的替代方法,您可以使用点:

  - name: Install_nodejs | {{ role_name | basename }}
    tags: Install_nodejs
    shell: |
      . {{ ansible_user_dir }}/.nvm/nvm.sh
      nvm install {{ node_version }}