在 Ansible 中执行命令之前获取文件

Sourcing a file before executing commands in Ansible

我正在尝试使用以下 Ansible yml 文件使用 nvm 安装节点 js 版本。

我收到类似源 "source /home/centos/.nvm/nvm.sh" 文件未找到的错误。但是,如果我通过使用 ssh 登录机器来做同样的事情,那么它就可以正常工作。

- name: Install nvm
  git: repo=https://github.com/creationix/nvm.git dest=~/.nvm version={{ nvm.version }}
  tags: nvm

- name: Source nvm in ~/.profile
  lineinfile: >
    dest=~/.profile
    line="source ~/.nvm/nvm.sh"
    create=yes
  tags: nvm

- name: Install node {{ nvm.node_version }}
  command: "{{ item }}"
  with_items:
     - "source /home/centos/.nvm/nvm.sh"
     - nvm install {{ nvm.node_version }}
  tags: nvm

错误:

failed: [172.29.4.71] (item=source /home/centos/.nvm/nvm.sh) => {"cmd": "source /home/centos/.nvm/nvm.sh", "failed": true, "item": "source /home/centos/.nvm/nvm.sh", "msg": "[Errno 2] No such file or directory", "rc": 2}

failed: [172.29.4.71] (item=nvm install 6.2.0) => {"cmd": "nvm install 6.2.0", "failed": true, "item": "nvm install 6.2.0", "msg": "[Errno 2] No such file or directory", "rc": 2}

关于 "no such file" 错误:

source 是一个内部 shell 命令(参见示例 Bash Builtin Commands),而不是您可以 运行 的外部程序。您的系统中没有名为 source 的可执行文件,这就是您收到 No such file or directory 错误的原因。

使用shell代替command模块,它将在shell.

中执行source命令

关于货源问题:

with_items 循环中,Ansible 将 运行 shell 两次,并且两个进程将相互独立。一个设置的变量不会被另一个看到。

您应该 运行 在一个 shell 进程中执行两个命令,例如:

- name: Install node {{ nvm.node_version }}
  shell: "source /home/centos/.nvm/nvm.sh && nvm install {{ nvm.node_version }}"
  tags: nvm

其他备注:

git 任务中使用 {{ ansible_env.HOME }} 而不是 ~。任何一个都可以在这里工作,但波浪线扩展是 shell 的功能,并且您正在为 Ansible 编写代码。