gpt4 book ai didi

ubuntu - 从用户 shell 执行命令的 Ansible 剧本

转载 作者:太空宇宙 更新时间:2023-11-03 16:50:30 26 4
gpt4 key购买 nike

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

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

前两个步骤很好,但第三个步骤让我很吃力。使用其他剧本作为引用(一个用于 rbenvnvm )我创建了以下基本剧本:

---
- 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

是否有一种优雅的方式以用户身份使用他们的 shell 和加载的环境变量通过 Ansible 运行命令?

我尝试添加 -i sudo 标志和命令,例如 sudo -iu {{user}} rbenv install ... 但我还没有成功.

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

最佳答案

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

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 查找并使其按预期工作。

关于ubuntu - 从用户 shell 执行命令的 Ansible 剧本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28550619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com