Ansible playbook从用户shell执行命令

i_l*_*ots 5 ubuntu vagrant ansible ansible-playbook ubuntu-14.04

我正在尝试运行一个相对简单的Ansible playbook来通过Vagrant配置Ubuntu VM.大致它遵循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
Run Code Online (Sandbox Code Playgroud)

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

stderr: /bin/bash: rbenv: command not found
Run Code Online (Sandbox Code Playgroud)

是否有一种优雅的方式通过Ansible作为用户运行命令,使用它们的shell和环境变量加载?

我试图添加-isudo标志和命令,sudo -iu {{user}} rbenv install ...但我还没有运气.

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

Sum*_*eek 0

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

---
- hosts: webservers
  remote_user: root
  tasks:
    - name: test connection
      ping:
      remote_user: yourname
Run Code Online (Sandbox Code Playgroud)

请参阅 - http://docs.ansible.com/playbooks_intro.html