【发布时间】:2015-02-16 21:25:05
【问题描述】:
我正在尝试运行一个相对简单的 Ansible 剧本来通过 Vagrant 配置 Ubuntu VM。大致分为三个步骤:
- 更新和安装基本软件包
- 将 rbenv 安装到指定用户的家中
- 通过 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