2016-10-30 31 views
0

我正在嘗試使用同步模塊將文件從Ansible節點複製到遠程節點。同步模塊失敗併成爲

我希望這些文件在遠程節點上以UserB的形式存在,但我無法直接訪問UserB。相反UserA有sudo權限切換到UserB。所以我以UserA登錄。

我的環境文件說:

ansible_ssh_user=UserA 
ansible_ssh_pass=<PassUserA> 
ansible_become_method=sudo 
ansible_become_user=UserB 
ansible_become_pass=<PassUserA> 

我的任務是:

- name: Copy and unarchive webapps node. 
    synchronize: src=/home/ansible/templates/app/Sprint6/webapps dest=/opt/msdp/ca/app checksum=yes 
    become: yes 

但是當我運行的劇本,我得到一個錯誤:

fatal: [5.232.57.247]: FAILED! => {"changed": false, "cmd": "/usr/bin/rsync --delay-updates -F --compress --checksum --archive --rsh 'ssh -S none -o StrictHostKeyChecking=no -o ControlMaster=auto -o ControlPersist=60s' --rsync-path=\"sudo rsync\" --out-format='<<CHANGED>>%i %n%L' \"/home/ansible/templates/app/Sprint6/webapps\" \"[email protected]:/opt/msdp/ca/app\"", "failed": true, "msg": "sudo: sorry, you must have a tty to run sudo\nrsync: connection unexpectedly closed (0 bytes received so far) [sender]\nrsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6]\n", "rc": 12} 

在遠程節點,只有UserB可以寫在:/opt/msdp/ca/app

有沒有我失蹤的配置?

回答

2

synchronize模塊在控制機器上(不在目標節點上)在本地執行,並且默認情況下它將連接到在那裏使用帳戶(SSH憑據)的節點(當前已登錄,或在~/.ssh/config中定義)。

首先,你需要通過添加use_ssh_args參數要考慮的ansible_ssh_*值來覆蓋默認行爲連接時:

use_ssh_args Use the ssh_args specified in ansible.cfg


其次,因爲任務是在本地運行,become指令也只對控制機器有效。 ansible_become_*變量不適用於這種情況。

相反,你可以告訴模塊運行sudo rsync通過rsync_path參數以提高目標節點上的權限:

- name: Copy and unarchive webapps node. 
    synchronize: 
    src: /home/ansible/templates/app/Sprint6/webapps 
    dest: /opt/msdp/ca/app checksum=yes 
    use_ssh_args: yes 
    rsync_path: "sudo -u UserB rsync" 

最後,上述假設sudoers文件設置密碼的允許須藤。如果您確實需要以純文本格式提供密碼,則需要使用另一種解決方法:

rsync_path: "echo {{ UserA_password }} | sudo -S -u UserB rsync" 
+0

感謝您的詳細回覆。我完全理解了第2點和第3點,但是我的理解存在問題1.你的意思是說,如果啓用/etc/ansible/ansible.cfg中的ssh_args =,它將開始使用我在實驗文件中定義的任何內容?但是我已經能夠在連接到我的目標節點時使用這些屬性。 –

+0

不,這些屬性不用於「同步」模塊,這就是爲什麼它有附加參數use_ssh_args。我不知道如何表達它的不同。 'synchronize'模塊在本地運行,與其他模塊不同。你檢查了我鏈接的文檔頁面嗎?它基本上是一樣的。 – techraf

+1

謝謝techraf!我現在明白了。併爲「實驗室」文件道歉。我的意思是環境文件。 –

1

在目標系統的/etc/sudoers檢查Defaults requirettyDefaults !requiretty

更換線路或爲Ansible用戶禁用requiretty:更多選擇

Defaults!/path/to/my/bin !requiretty 
Defaults:myansibleuser !requiretty 

檢查這個site

+0

Thanks Henrik!一個問題。在目標系統上,我沒有Anisible用戶。我以UserA身份登錄,然後切換到UserB。在這種情況下,我應該禁用UserA的requiretty,對吧? –

+0

我剛剛做了'Defaults!requiretty',現在我得到了:'sudo:沒有tty存在,也沒有指定askpass程序。我需要更改Anible節點上的任何sudo privelages嗎? –