2015-02-16 22 views
5

Vagrant aracılığıyla Ubuntu VM'yi sağlamak için nispeten basit bir Ansible oynatma kitabı çalıştırmaya çalışıyorum. Kabaca bunun 3 adımları izler:Kullanıcı kabuğundan komutları yürütmek için Ansible playbook

  1. Güncelleme ve yüklemek gerekli paketleri
  2. belirtilen kullanıcı

ilk iki adım için rbenv yoluyla belirlenen Yakut sürümünü yükleyin belirli bir kullanıcının ev

  • için rbenv yükleyin iyiler ama üçüncü ben mücadele ediyorum.

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

    zarif bir yolu var mı: Ben bir hatayla karşılaşırsanız

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

    yukarıdaki senaryo çalıştırma: (rbenv diğeri nvm) Ben aşağıdaki temel taktik kitabı oluşturduk referans olarak başkalarının playbooks kullanma Bir kullanıcı olarak Ansible üzerinden bir komut çalıştırarak, kendi kabuk ve ortam değişkenlerini yüklüyor mu?

    -i sudo bayrağı ve sudo -iu {{user}} rbenv install ... gibi komutları eklemeyi denedim ancak henüz şansım olmadı.

    Ruby yüklemesini rbenv yürütülebilir dosyasının tam yolunu belirterek çalıştırabilirim ancak bu teknik her zaman uygun değil (bazı araçlar tek bir yürütülebilir dosya sunmuyor olabilir).

  • +0

    Belirli bir kullanıcıya söyledikten sonra, yalnızca .bashrp yerine ".bash_profile" yerine belirtilen ortamı aldığınıza inanıyorum. Bunun yerine, bulunduğunuz yeri belirten yola dayanan bir komut yerine, çalıştırdığınız komutun tam yolunu belirtebilirsiniz ... Bu yaklaşımı ne olursa olsun tavsiye ederim – PhillipHolmes

    +0

    Yorumunuz için teşekkürler. Kullanıcının .bashrc ile ilgili yollarını ekliyorum (yukarıdaki oyun kitabına bakın) ama ne yazık ki herhangi bir fark yaratmıyor. Hatta .bashrc'yi yeniden yüklemeyi denedim: 'shell: bash -lc 'source ~/.bashrc; rbenv ...'' ama henüz boşuna değil. –

    +0

    "remote_user:" {{user}} "' yerine "sudo" ve "sudo_user" yerine (SSH anahtarını ekledikten sonra) rbenv görevlerinde kullanmanız gerektiğine inanıyorum. –

    cevap

    0

    Eğer ansible 1.4 veya üstü kullanıyorsanız, bunu yapmak için remote_user parametresini kullanabilirsiniz. Hem oyun defteri seviyesinde, hem de görev seviyesinde.

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

    bakın -

    0

    http://docs.ansible.com/playbooks_intro.html ben bir serseri kutuyu yanıtlayıcı '2.1 kullanılarak rbenv ile yakut-2.2.3 yüklemeye çalışıyor iken bu aynı sorunu vardı.

    rbenv, sudo hakları olmayan, ancak unsız kutusuna bağlandığında, env'yi kaybederse, adlı ubuntu üzerindeki bir kullanıcıya yüklendi. /home/rails/.bashrc tanımlanan $ PATH sadece ansible_env.PATH

    aşağıdaki adımları izleyerek rbenv yüklü varsayarsak varsaymak oldu:

    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 
    

    yol çalışmasını sağlamak üzere, ben ayarlamak için gerekli elle, ben de öyle yaptım bu özel görev için:

    - 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 }}" 
        ... 
    

    Bu ansible_env.PATH arama için rbenv komutuna yolunu ekler ve beklendiği gibi çalışır duruma alacak.