如何在 Ansible 中将 运行 a shell 函数作为命令?
How to run a shell function as a command in Ansible?
我正在使用 nvm
(https://github.com/creationix/nvm),它本质上是一个 shell 脚本,您将其作为 shell 的来源,然后调用,例如,nvm install [version]
。但是无论我如何尝试调用该函数,ansible 似乎都找不到它。
我试过使用 command
和 shell
模块。我试过使用 become
和 become_user
。我试过像在 https://github.com/leonidas/ansible-nvm/blob/master/tasks/main.yml 中那样使用 sudo -iu
,但它对我不起作用。它必须是可能的,因为它在那个文件中工作。
如何在 Ansible 中 运行 任何 shell 函数?在这种情况下,我的 .zshrc 中有一个 source nvm.sh
,它允许我从交互式 shell 中执行 nvm
命令。
您需要使用 shell
模块,因为您想要 运行 shell 命令,并且您需要在 nvm
脚本中获取源代码进入那个环境。类似于:
- shell: |
source /path/to/nvm
nvm install ...
是否使用 become
取决于您是否希望 运行 作为 root
(或其他用户)执行命令。
这是我的剧本:
- 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 }}
我正在使用 nvm
(https://github.com/creationix/nvm),它本质上是一个 shell 脚本,您将其作为 shell 的来源,然后调用,例如,nvm install [version]
。但是无论我如何尝试调用该函数,ansible 似乎都找不到它。
我试过使用 command
和 shell
模块。我试过使用 become
和 become_user
。我试过像在 https://github.com/leonidas/ansible-nvm/blob/master/tasks/main.yml 中那样使用 sudo -iu
,但它对我不起作用。它必须是可能的,因为它在那个文件中工作。
如何在 Ansible 中 运行 任何 shell 函数?在这种情况下,我的 .zshrc 中有一个 source nvm.sh
,它允许我从交互式 shell 中执行 nvm
命令。
您需要使用 shell
模块,因为您想要 运行 shell 命令,并且您需要在 nvm
脚本中获取源代码进入那个环境。类似于:
- shell: |
source /path/to/nvm
nvm install ...
是否使用 become
取决于您是否希望 运行 作为 root
(或其他用户)执行命令。
这是我的剧本:
- 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 }}