2016-10-30 27 views
0

同期モジュールを使用して、ファイルをAnsibleノードからリモートノードにコピーしようとしています。同期モジュールが失敗するとエラーが発生します

リモートノードにこれらのファイルをUserBとして存在させたいのですが、私はUserBに直接アクセスできません。代わりにUserAにはUserBに切り替えるsudo特権があります。だから私はUserAとしてログインしています。

私の環境ファイルは言う:

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

しかし、私は脚本を実行すると、私はエラーを取得::

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

私の仕事は、あるリモートノードで

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

設定がありませんか?ターゲット・システムの/etc/sudoersDefaults requirettyため

答えて

2

synchronizeモジュールは(ターゲットノードではなく)制御マシン上でローカルに実行され、デフォルトではそこで使用されているアカウント(SSH認証情報)を持つノードに接続されます(現在ログインしているか、~/.ssh/configで定義されています)。タスクをローカルに実行されているので、becomeディレクティブは、

use_ssh_args Use the ssh_args specified in ansible.cfg


第二:

まず、あなたは、接続時に考慮すべきansible_ssh_*値に対するuse_ssh_argsパラメータを追加することにより、デフォルトの動作をオーバーライドする必要がありますまた、制御機でのみ有効です。この状況では変数ansible_become_*は適用されません。

代わりに、あなたはrsync_pathパラメータを介してターゲット・ノード上の権限を昇格させるsudo rsyncを実行するモジュールを伝えることができます。

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

最後に、上記のパスワードなしsudoを可能sudoersの設定を前提としています。プレーンテキストでパスワードを提供する必要がある場合は、次のような回避策が必要です。

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

詳細な返信をありがとう。私はポイント2と3を完全に理解していますが、私は1を理解することに問題があります。あなたが言うことは、ssh_args = /etc/ansible/ansible.cfgを有効にすると、私はラボファイルで定義したものを使い始めるでしょうか?しかし、私はすでにターゲットノードに接続している間、これらのプロパティを使用することができます。 –

+0

いいえ、これらのプロパティは 'synchronize'モジュールでは使用されていないため、追加パラメータ' use_ssh_args'を持っています。私は違った表現方法を知らない。 'synchronize'モジュールはローカルで実行され、他のモジュールとは異なります。リンクしたドキュメントページを確認しましたか?それは基本的に同じことを述べている。 – techraf

+1

ありがとうtechraf!わかった。そして "ラボ"ファイルのための謝罪。私は環境ファイルを意味しました。 –

1

チェックとDefaults !requiretty

の行を交換するか、Ansibleのユーザーのためのrequirettyを無効にします。

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

は、より多くのオプションのために、このsiteをチェックしてください。

+0

ありがとうございますHenrik!一つの質問。ターゲットシステムでは、私はAnisibleユーザーを持っていません。私はUserAとしてログインし、UserBに切り替えます。この場合、私はUserAのrequirettyを無効にする必要があります。 –

+0

私はちょうど 'Defaults!requiretty'を行いました。今は' sudo:no tty presentとno askpass program specified'を得ています。Anibleノードのsudo privelagesを変更する必要がありますか? –

関連する問題