2014-02-23 43 views
6

我想用Vagrant來測試Ansible腳本。一切工作正常,直到它試圖做一個rsync的遠程主機:讓Ansible中的rsync與Vagrant一​​起工作

- name: Install custom dev user settings 
    local_action: command rsync -ave ssh roles/common/files/home/{{ item.name }} 
     {{ ansible_ssh_user }}@{{ inventory_hostname }}:/#home/ 
    with_items: dev_users 
    when: "{{ item.custom }} == True" 
    tags: 
    - dev_custom 
    - dev_users 
    - users 

但是它不能在這一點 - 它似乎試圖通過密碼登錄,但我不知道爲什麼,因爲它應該連接到通過SSH的流浪者,正確(我已經在下面忽略了一些信息,因爲它提到了密鑰)?

127.0.0.1> EXEC ['/bin/sh', '-c', 'mkdir -p $HOME/.ansible/tmp/ansible-1393178896.64-215542007508316 && chmod a+rx $HOME/.ansible/tmp/ansible-1393178896.64-215542007508316 && echo $HOME/.ansible/tmp/ansible-1393178896.64-215542007508316'] 
<127.0.0.1> REMOTE_MODULE command rsync -ave ssh roles/common/files/home/someUser [email protected]:/#home/ 
<127.0.0.1> PUT /tmp/tmpm3BnEW TO /home/mark/.ansible/tmp/ansible-1393178896.64-215542007508316/command 
<127.0.0.1> EXEC /bin/sh -c 'sudo -k && sudo -H -S -p "[sudo via ansible, key=...] password: " -u root /bin/sh -c '"'"'echo SUDO-SUCCESS-...; /usr/bin/python /home/mark/.ansible/tmp/ansible-1393178896.64-215542007508316/command; rm -rf /home/mark/.ansible/tmp/ansible-1393178896.64-215542007508316/ >/dev/null 2>&1'"'"'' 
failed: [10.0.0.10] => (item={ ... }) => {"failed": true, "item": { ... }, "parsed": false} 
invalid output was: [sudo via ansible, key=...] password: 
[sudo via ansible, key=...] password: 
Sorry, try again. 
[sudo via ansible, key=...] password: 
[sudo via ansible, key=...] password: 
Sorry, try again. 
[sudo via ansible, key=...] password: 
[sudo via ansible, key=...] password: 
Sorry, try again. 
sudo: 3 incorrect password attempts 

任何想法如何解決這個問題?

我做我做這如之前部署自定義鍵,通過ansible箱:

- name: Place ansible authorized key 
    authorized_key: user=root key="{{ lookup('file', 'root/.ssh/ansible_key.pub') }}" 
    tags: 
    - root 
+1

是的馬克,但似乎你正在部署你的密鑰〜根/ .ssh,而你連接爲'流浪'。 – leucos

+1

沒關係Leucos,你是一個很大的幫助 - 這個Ansible教程看起來不錯https://github.com/leucos/ansible-tuto,所以我會通過這個接下來的工作。謝謝! –

+0

不客氣,盡情玩樂 – leucos

回答

2

馬克,

如果沒有部署SSH公鑰框(在/home/vagrant/ssh/authorized_keys) ,被要求輸入密碼是一種非常正常的行爲。在標準盒子裏使用'vagrant'應該有效。

如果您先將鑰匙推入,後續工作將變得更加容易。你可以找到一個流浪者爲導向的例子here

看來你設置了ansible_ssh_user正確,但確保你也調用你的劇本--ask-pass --sudo

作爲一個側面說明,行:

when: item.custom 
+0

Hi Leucos,感謝您提供有關何時使用的提示。如果我添加了--ask-pass --sudo,那麼它會提示我輸入密碼('vagrant'),但現在確實有效 - 謝謝!你能否再解釋一下發生了什麼/爲什麼這是必要的?我看了一下ansible.cfg,我有--sudo設置但不是--ask-pass? –

+1

那麼,你必須告訴可以索要sudo密碼。在上面的輸出中,是否有機會在'[sudo via ansible,key = ...]密碼之後鍵入任何內容:'line or did it unfold all these lines until the end without asked? – leucos

6

我終於發現瞭如何解決這個問題:

when: "{{ item.custom }} == True" 

可以作爲被改寫。我知道這不是rsync,因爲我在命令行測試了它:

rsync -ave ssh home/dataToSync [email protected]:/home/ 

而且工作正常。我上傳了一個我甚至不需要登錄的Vagrant框的密鑰。然而,來自ansible的調用rsync失敗了。我試圖指定一個密碼,因爲Leucos建議,但那不起作用。我考慮過這個問題,並想知道問題是Ansible是否試圖在我的本地盒子上sudo。爲了看看是否是這個問題,我添加了

sudo: False 

我的行動,它解決了問題。

+1

當然!這是一個local_action!對不起,錯過了:facepalm::( – leucos

4

由於Vagrant以用戶流浪者的身份運行Ansible playbooks,因此嘗試將rsync同步到根擁有的目錄通常會失敗。而不是分配團體或試圖找到一些神奇冪等chmod/chown解決方案,我發現的最強大的解決方案只是告訴Ansible與sudo一起使用rsync。

- synchronize: 
    src=/local/site/ 
    dest=/var/www/site 
    rsync_path='sudo rsync' 

請注意,Ansible的synchronize module包裝rsync,使這些任務對作者來說更加清潔。

1

在Ansible 2.2.1.0這個工作對我來說:

- synchronize: 
    mode: pull 
    src: "/home/vagrant/dir1" 
    dest: "/my_linux/dir1" 
    recursive: yes 
    delete: no 
    times: yes 

...並與此庫存(使用ansible_ssh_private_key_file var):

[vagrant1] 
192.168.77.4 

[vagrant1:vars] 
ansible_user=vagrant 
ansible_ssh_private_key_file="/Users/Chilcano/.vagrant.d/insecure_private_key" 

希望它可以幫助你。