【问题标题】:Ansible playbook to execute commands from user shellAnsible playbook 从用户 shell 执行命令
【发布时间】:2015-02-16 21:25:05
【问题描述】:

我正在尝试运行一个相对简单的 Ansible 剧本来通过 Vagrant 配置 Ubuntu VM。大致分为三个步骤:

  1. 更新和安装基本软件包
  2. 将 rbenv 安装到指定用户的家中
  3. 通过 rbenv 为指定用户安装指定的 Ruby 版本

前两个步骤很好,但第三个我正在努力。使用其他剧本作为参考(rbenv 和 nvm 的一个)我创建了以下基本剧本:

---
- hosts: all
  vars:
    user: joe_bloggs
    ruby_version: 2.1.5

  tasks:

    #
    # System
    #

    - name: Update apt cache
      sudo: yes
      apt: update_cache=yes cache_valid_time=86400

    - name: Upgrade existing system packages
      sudo: yes
      apt: upgrade=dist

    - name: Install essential system packages
      sudo: yes
      apt: name={{ item }} state=latest
      with_items:
        - git
        - curl
        - openssl
        - build-essential

    - name: Add user
      sudo: yes
      user: name={{user}} shell=/bin/bash groups=sudo

    #
    # rbenv
    #

    - name: Install rbenv | Clone repo
      sudo: yes
      sudo_user: "{{ user }}"
      git: repo=https://github.com/sstephenson/rbenv.git dest=~/.rbenv accept_hostkey=yes update=yes

    - name: Install rbenv | Create plugins directory
      sudo: yes
      sudo_user: "{{ user }}"
      file: path=~/.rbenv/plugins/ mode=0755 state=directory

    - name: Install rbenv | Install ruby-build plugin
      sudo: yes
      sudo_user: "{{ user }}"
      git: repo=git://github.com/sstephenson/ruby-build.git dest=~/.rbenv/plugins/ruby-build accept_hostkey=yes

    - name: Install rbenv | Add path to profile
      sudo: yes
      sudo_user: "{{ user }}"
      lineinfile: line='export PATH="$HOME/.rbenv/bin:$PATH"' regexp="\$HOME\/\.rbenv\/bin:\$PATH" dest=~/.bashrc

    - name: Install rbenv | Enable shims in profile
      sudo: yes
      sudo_user: "{{ user }}"
      lineinfile: line='eval "$(rbenv init -)"' regexp="rbenv init \-" dest=~/.bashrc

    - name: Install Ruby | Install version
      sudo: yes
      sudo_user: "{{ user }}"
      shell: rbenv install {{ ruby_version }} executable=/bin/bash

    - name: Install Ruby | Set default version and rehash
      sudo: yes
      sudo_user: "{{ user }}"
      shell: rbenv global {{ ruby_version }} && rbenv rehash executable=/bin/bash

运行上面的剧本我遇到了一个错误:

stderr: /bin/bash: rbenv: command not found

有没有一种优雅的方式来以用户身份通过​​ Ansible 运行命令,使用加载的 shell 和环境变量?

我尝试添加-i sudo 标志和sudo -iu {{user}} rbenv install ... 之类的命令,但我还没有运气。

我可以通过指定 rbenv 可执行文件的完整路径来运行 Ruby 安装,但这种技术并不总是合适的(某些工具可能不提供单个可执行文件)。

【问题讨论】:

  • 我相信当你sudo到一个特定的用户时,你只会得到.bashrc中指定的环境,而不是.bash_profile。您可以改为指定正在运行的命令的完整路径,而不是依赖于为您指定位置的路径的命令...无论如何,我都会推荐这种方法
  • 感谢您的评论。我将相关路径附加到用户的 .bashrc (参见上面的剧本),但遗憾的是这并没有任何区别。我什至尝试重新加载 .bashrc,例如:shell: bash -lc "source ~/.bashrc; rbenv ... ",但无济于事。
  • 我相信您应该在 rbenv 任务中使用 remote_user: "{{ user }}" 而不是 sudo 和 sudo_user(添加 SSH 密钥后)。

标签: ubuntu vagrant ubuntu-14.04 ansible ansible-playbook


【解决方案1】:

我在尝试使用 Ansible 2.1 在 vagrant box 上安装 ruby​​-2.2.3 和 rbenv 时遇到了同样的问题。

rbenv 安装在 ubuntu 上名为 rails 的用户上,该用户没有 sudo 权限,但是当 ansible 连接到我的 ubuntu 机器时,它会丢失 env。 $PATH 在 /home/rails/.bashrc 中定义,默认为 ansible_env.PATH

假设您已按照以下步骤安装了 rbenv:

git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc

git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

为了让路径正常工作,我需要手动设置它,所以对于我所做的特定任务:

- name: install rubies
  become_user: rails
  environment: 
    PATH: "{{ ansible_env.PATH }}:/home/rails/.rbenv/shims:/home/rails/.rbenv/bin "
  shell: '{{ rbenv_shell }} -lc "rbenv install {{ item[0] }}"'
  with_together
    - "{{ rubies }}"
    - "{{ ruby_installed.results }}"
  ...

这会将您的 rbenv 命令的路径附加到 ansible_env.PATH 查找并使其按预期工作。

【讨论】:

    【解决方案2】:

    如果您使用的是 ansible 1.4 或更高版本,则可以使用remote_user 参数来执行此操作。无论是在剧本级别,还是在任务级别。

    ---
    - hosts: webservers
      remote_user: root
      tasks:
        - name: test connection
          ping:
          remote_user: yourname
    

    参考 - http://docs.ansible.com/playbooks_intro.html

    【讨论】:

    • 不幸的是,这对非交互式、非登录 shell 的行为没有帮助。 Bash 不会获取用户的环境,所以同样的问题仍然存在。
    猜你喜欢
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2014-10-15
    • 1970-01-01
    • 2017-09-16
    • 2020-09-07
    相关资源
    最近更新 更多