使用Ansible将二进制文件添加到PATH

时间:2017-01-26 22:42:17

标签: bash path ansible elixir ansible-playbook

我正在尝试使用Ansible为Kiex编程语言安装Elixir版本管理器。

这些是我用于此的戏剧:

- name: Kiex Installation
  hosts: web
  gather_facts: false
  remote_user: deployer
  tasks:
    - shell: \curl -sSL https://raw.githubusercontent.com/taylor/kiex/master/install | bash -s
    - name: Add Kiex Bin to Path
      lineinfile:
        dest: /home/deployer/.bashrc
        regexp: '^test -s'
        line: '[[ -s "$HOME/.kiex/scripts/kiex" ]] && source "$HOME/.kiex/scripts/kiex"'
    - name: Reload Path
      shell: source /home/deployer/.bashrc
      args:
        executable: /bin/bash
    - shell: echo $PATH
      register: pathul
    - debug:
        var: pathul

- name: Elixir Installation
  hosts: web
  gather_facts: false
  remote_user: deployer
  tasks:
    - shell: echo $PATH
      register: pathul
    - debug:
        var: pathul
    - name: Install Elixir Version
      command: /home/deployer/.kiex/bin/kiex list
      args:
        executable: /bin/bash
        chdir: /home/deployer/
    - name: Set Elixir Version as Default
      shell: kiex default 1.4

Kiex的安装是成功的,如果我登录到远程计算机,我只需使用kiex命令即可​​运行它。我可以这样做,因为我在“〜/ .kiex / scripts / kiex”中找到了二进制文件。当我回显$PATH变量时,它会在其中显示kiex二进制路径/home/deployer/.kiex/bin

$ echo $PATH
/home/deployer/.kiex/bin:/home/deployer/.kiex/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

然而,上面显示的 Elixir安装播放中的kiexkiex list甚至/home/deoployer/.kiex/bin/kiex list都会失败并显示以下消息:

TASK [Set Elixir Version as Default] *******************************************
fatal: [local-web-2]: FAILED! => {"changed": true, "cmd": "kiex default 1.4", "delta": "0:00:00.002042", "end": "2017-01-26 22:13:32.898082", "failed": true, "rc": 127, "start": "2017-01-26 22:13:32.896040", "stderr": "/bin/sh: 1: kiex: not found", "stdout": "", "stdout_lines": [], "warnings": []}

注册通过ansible回显路径结果的pathul变量也不包含/home/deployer/.kiex/bin

"stdout": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

如何通过Ansible使kiex命令正常工作?

1 个答案:

答案 0 :(得分:2)

只需使用完整的绝对路径,就像您在Install Elixir Version任务中尝试过的那样,但请注意您在示例和您发布的说明中都有拼写错误:

command: /home/deoployer/.kiex/bin/kiex list
     

[]甚至/home/deoployer/.kiex/bin/kiex list []失败[s]

它应该是deployer,就像第一次播放一样,不是deoployer

没有理由让Ansible失败" kiex:not found "消息,如果您提供正确的路径。

关于其他任务的说明:

  • 引用man bash

      

    当启动不是登录shell的交互式shell时,如果该文件存在,bash将从~/.bashrc读取并执行命令。

    因此,当您使用Ansible执行任务时,您的~/.bashrc甚至无法读取,因为它不是交互式会话。

    这就是为什么您的pathul变量不包含~/.bashrc中应用的更改的原因。

  • 以下两个任务运行单独的bash进程。第一个任务中的环境对第二个任务的环境没有影响:

    - name: Reload Path
      shell: source /home/deployer/.bashrc
      args:
        executable: /bin/bash
    - shell: echo $PATH
      register: pathul