【问题标题】:Add binaries to PATH with Ansible使用 Ansible 将二进制文件添加到 PATH
【发布时间】:2017-06-12 13:31:17
【问题描述】:

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

这些是我为此使用的剧本:

- 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": []}

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

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

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

【问题讨论】:

    标签: bash path ansible elixir ansible-playbook


    【解决方案1】:

    只需使用完整的绝对路径,就像您在 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
      

    【讨论】:

    • 我的剧本中确实有部署器。错字只是在 stackoverflow 示例中。关于 ~/.bashrc 没有被读取,我确实怀疑它有问题。我应该把[[ -s "$HOME/.kiex/scripts/kiex" ]] && source "$HOME/.kiex/scripts/kiex"'放在哪里?
    • 我不知道。这取决于操作系统和分布。我建议使用完整路径。
    • 我使用的是 Ubuntu Xenial。
    • 我重复一遍:对于您在问题中显示的内容,请使用完整路径。我不知道你打算用 Elixir 做什么,也不知道你打算如何使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多