web-dev-qa-db-ja.com

AnsibleにSudoパスワードを指定する

AnsibleにSudoパスワードを非対話的に指定するにはどうすればいいですか?

私はこのようなAnsibleプレイブックを運営しています:

$ ansible-playbook playbook.yml -i inventory.ini \
    --user=username --ask-Sudo-pass

しかし、私はこれを次のように実行したいです。

$ ansible-playbook playbook.yml -i inventory.ini \
    --user=username` **--Sudo-pass=12345**

方法はありますか?私は自分のプロジェクトの展開をできるだけ自動化したいと思います。

183
Slava Fomin II

--extra-vars "name=value"を介してコマンドラインで変数を渡すことができます。 Sudoパスワード変数はansible_Sudo_passです。だからあなたのコマンドはこんな感じになるでしょう:

ansible-playbook playbook.yml -i inventory.ini --user=username \
                              --extra-vars "ansible_Sudo_pass=yourPassword"

Update 2017:Ansible 2.2.1.0ではvar ansible_become_passが使用されるようになりました。どちらもうまくいくようです。

124

doc強くプレーンテキストでSudoパスワードを設定するのではなく、代わりにコマンドラインで--ask-Sudo-passを使用することをお勧めします。 ansible-playbookを実行するとき


2016年更新日:

Ansible 2.0(100%ではない)は、--ask-Sudo-passを非推奨としてマークしました。 ドキュメント では代わりに--ask-become-passを使用することを推奨していますが、プレイブック全体でSudoの使用をbecomeと交換しています。

199
deefour

おそらくこれを行うための最良の方法 - あなたがscottodによって提供されたNOPASSWDソリューションを使用できないと仮定すると、 Ansible vault と組み合わせてMircea Vutcoviciのソリューションを使用することです。 。

たとえば、次のようなプレイブックがあるとします。

- hosts: all

  vars_files:
    - secret

  tasks:
    - name: Do something as Sudo
      service: name=nginx state=restarted
      Sudo: yes

ここに私達は私達のSudoパスワードを含むsecretと呼ばれるファイルを含めています。

Ansible-vaultを使用して、このファイルの暗号化バージョンを作成します。

ansible-vault create secret

これでパスワードの入力を求められたら、デフォルトのエディタを開いてファイルを編集します。ここにあなたのansible_Sudo_passを入れることができます。

例:secret

ansible_Sudo_pass: mysudopassword

保存して終了します。これで、Playbookを実行したときにAnsibleで復号化できる暗号化されたsecretファイルができました。注:ansible-vault edit secretを使用してファイルを編集することができます(そしてファイルの作成時に使用したパスワードを入力します)。

パズルの最後のピースはAnsibleにあなたのsecretファイルを復号化するのに使う--vault-password-fileを提供することです。

vault.txtというファイルを作成し、その中にsecretファイルを作成するときに使用したパスワードを入れます。パスワードは、ファイルに1行として格納されている文字列にする必要があります。

Ansible Docsから:

..ファイルへのアクセス許可が他の誰かがあなたのキーにアクセスできないようにし、あなたのキーをソース管理に追加しないようにする

最後に、次のようにプレイブックを実行できます。

ansible-playbook playbook.yml -u someuser -i hosts --Sudo --vault-password-file=vault.txt 

上記は、以下のディレクトリレイアウトを想定しています。

.
|_ playbook.yml
|_ secret
|_ hosts
|_ vault.txt

Ansible Vaultの詳細については、こちらを参照してください。 https://docs.ansible.com/playbooks_vault.html

93
toast38coza

コード( runner/__init__.py )を見ると、おそらくあなたのインベントリファイルにそれを設定できると思います。

[whatever]
some-Host ansible_Sudo_pass='foobar'

ansible.cfg設定ファイルにもいくつかの規定があるようですが、今は実装されていません( constants.py )。

42
leucos

あなたがしたいようにansibleがあなたがフラグの中にパスワードを指定させるとは思わない。これは設定可能な設定のどこかにあるかもしれませんが、これは全体としてansibleを使用することをより安全でなくするでしょうし、お勧めできません。

できることの1つは、ターゲットマシンにユーザーを作成し、すべてのコマンドまたは制限されたコマンドリストのいずれかにパスワードなしのSudo特権を付与することです。

Sudo visudoを実行して以下のような行を入力した場合、ユーザー「PrivilegedUser」はSudo service xxxx startのようなものを実行するときにパスワードを入力する必要はありません。

%privilegedUser ALL= NOPASSWD: /usr/bin/service
42
scottod

Sudoパスワードは、ansible_Sudo_passという変数として格納されています。この変数を設定する方法はいくつかあります。

インベントリホストファイル内のホストごとのinventory/<inventoryname>/hosts

[server]
10.0.0.0 ansible_Sudo_pass=foobar

グループごと、インベントリグループファイルinventory/<inventoryname>/groups

[server:vars]
ansible_Sudo_pass=foobar

グループごと、グループvars内group_vars/<groupname>/ansible.yml

ansible_Sudo_pass: "foobar"

グループごとに暗号化ansible-vault create group_vars/<groupname>/ansible.yml

ansible_Sudo_pass: "foobar"
19
Bouke Versteegh

グループまたはすべてのサーバーのパスワードを一度に設定できます。

[all:vars]
ansible_Sudo_pass=default_Sudo_password_for_all_hosts

[group1:vars]
ansible_Sudo_pass=default_Sudo_password_for_group1
16

私はこれで私の髪を引き裂いていた、今私は私が欲しいものをする解決策を見つけた:

Sudoパスワードを含むホストごとに1つの暗号化ファイル

/ etc/ansible/hosts:

[all:vars]
ansible_ssh_connection=ssh ansible_ssh_user=myuser ansible_ssh_private_key_file=~/.ssh/id_rsa

[some_service_group]
node-0
node-1

それから、各ホストに対して暗号化されたvarファイルを次のように作成します。

ansible-vault create /etc/ansible/Host_vars/node-0

コンテンツあり

ansible_Sudo_pass: "my_Sudo_pass_for_Host_node-0"

ボールトパスワードの整理方法(--ask-vault-passから入力する方法)またはcfgによる方法は、ユーザーが決定します。

これに基づいて私はあなただけの全体のホストファイルを暗号化することができると思う...

11
greenone83

これを行うためのより賢い方法は、 LastPass または KeePass などの安全なボールトにSudoname__パスワードを保存し、それをハードコードする代わりにansible-playbookを使用して-e@に渡すことです。実際のファイルの内容では、構成-e@<(...)を使用してサブシェルでコマンドを実行し、その出力(STDOUT)を匿名ファイル記述子にリダイレクトして、-e@<(..)にパスワードを効果的に供給できます。

$ ansible-playbook -i /tmp/hosts pb.yml \
   -e@<(echo "ansible_Sudo_pass: $(lpass show folder1/item1 --password)")

上記はいくつかのことをしているので、分解してみましょう。

  • ansible-playbook -i /tmp/hosts pb.yml-明らかにansible-playbook経由でプレイブックを実行する
  • $(lpass show folder1/item1 --password)"-LastPass CLI lpassname__を実行し、使用するパスワードを取得します
  • echo "ansible_Sudo_pass: ...password..."-文字列 'ansible_Sudo_pass:'を取り、それをlpassname__によって提供されたパスワードと組み合わせます
  • -e@<(..)-上記をまとめ、<(...)のサブシェルを、使用するansible-playbookのファイル記述子として接続します。

さらなる改善

毎回入力したくない場合は、そのようにすることができます。最初に.bashrcにエイリアスを作成します:

$ cat ~/.bashrc
alias asp='echo "ansible_Sudo_pass: $(lpass show folder1/item1 --password)"'

これで、次のようにプレイブックを実行できます。

$ ansible-playbook -i /tmp/hosts pb.yml -e@<(asp)

参照資料

7
slm

あなたのプレイブックのSudoパスワードは、このようにhostsファイルに書くことができます。

[Host-group-name]
Host-name:port ansible_Sudo_pass='*your-Sudo-password*'
4
user3343297

プレーンテキストファイルにパスワードを保存するのに慣れている場合は、--extra-varsパラメータを指定してJSONファイルを使用する方法もあります(必ずファイルをソース管理から除外してください)。

ansible-playbook --extra-vars "@private_vars.json" playbook.yml 

Ansibleは1.3 からこのオプションをサポートしています。

4
sidecarcat

Ansible vaultはここで何度か提案されていますが、私のプレイブックの機密ファイルを暗号化するにはgit-cryptをお勧めします。あなたの手ごたえのあるプレイブックを保つためにgitを使っているなら、それは簡単です。 Ansible vaultで見つけた問題は、必然的に、作業したいファイルの暗号化されたコピーに遭遇し、作業する前にそれを復号化しなければならないことです。 git-cryptはより良いワークフローIMOを提供します。

これを使用して、あなたのプレイブックの中のvarにあなたのパスワードを入れて、次のように.gitattributesで暗号化されたファイルとしてあなたのプレイブックをマークすることができます:

 my_playbook.yml filter=git-crypt diff=git-crypt

あなたのプレイブックはGithubで透過的に暗号化されます。その後、ansibleを実行するために使用するホストに暗号化キーをインストールするか、ドキュメントの指示に従ってgpgを設定します。

ここであなたのssh-agentがSSHキーを転送するようにgpgキーを転送することに関する良いQ&Aがあります: https://superuser.com/questions/161973/how-can-i-forward-a-gpg-key -via-ssh-agent

4
user2432419

あなたが使用することができます ansible Vault これはあなたのパスワードを暗号化された金庫室にコード化するでしょう。その後、あなたはplaybookでvaultから変数を使うことができます。

Ansible vaultに関するいくつかの資料:
http://docs.ansible.com/playbooks_vault.html

環境ごとのボールトとして使用しています。ボールトを編集するには、次のようにコマンドを入力します。
ansible-vault edit inventories/production/group_vars/all/vault

ボールト変数を呼び出したい場合は、ansible-playbookを次のようなパラメータで使用する必要があります。
ansible-playbook -s --vault-password-file=~/.ansible_vault.password

はい、ボールトのパスワードをローカルディレクトリにプレーンテキストで保存していますが、すべてのシステムにrootのパスワードを保存するのと同じくらい危険ではありません。 rootパスワードはボールトファイルの中にあるか、あなたのユーザ/グループのためのsudoersファイルのようにそれを持つことができます。

サーバー上のsudoersファイルを使用することをお勧めします。これはグループadminのための例です:
%admin ALL=(ALL) NOPASSWD:ALL

2
maxo

以下のようにsshpassユーティリティを使うことができます、

$ sshpass -p "your pass" ansible pattern -m module -a args \
   -i inventory --ask-Sudo-pass
2
Sachin

プレイブックを--extra-vars "become_pass=Password"で呼び出すだけです。

become_pass =( 'ansible_become_password'、 'ansible_become_pass')

2
Crypto

ansible 2.4.1.0と次のものを使うとうまくいくでしょう:

[all]
17.26.131.10
17.26.131.11
17.26.131.12
17.26.131.13
17.26.131.14

[all:vars]
ansible_connection=ssh
ansible_user=per
ansible_ssh_pass=per
ansible_Sudo_pass=per

このインベントリでplaybookを実行してください。

ansible-playbook -i inventory copyTest.yml
0
Hearen

これを自動化するための私のハックは、環境変数を使用して--extra-vars="ansible_become_pass='{{ lookup('env', 'ANSIBLE_BECOME_PASS') }}'"経由でアクセスすることでした。

Env varをエクスポートしますが、bash/Shell履歴は避けます(スペースまたはその他のメソッドを追加します)。例えば。:

     export ANSIBLE_BECOME_PASS='<your password>'

追加のansible_become_pass変数をansible-playbookに渡しながらenv変数を検索します。例:

ansible-playbook playbook.yml -i inventories/dev/hosts.yml -u user --extra-vars="ansible_become_pass='{{ lookup('env', 'ANSIBLE_BECOME_PASS') }}'"

適切な代替回答:

0
JPvRiel

単なる補遺なので、他に誰も私が最近した煩わしさを経験することはありません。

私の知る限り、最善の解決策はtoast38cozaの上記の一般的な方針に沿ったものです。パスワードファイルとプレイブックを静的に結び付けるのが理にかなっている場合は、彼のテンプレートに従ってvars_files(またはinclude_vars)を付けます。それらを別々にしておきたい場合は、ボールトの内容をコマンドラインで次のように指定します。

ansible-playbook --ask-vault-pass -e@<PATH_TO_VAULT_FILE> <PLAYBOOK_FILE>

振り返ってみるとそれは明らかですが、ここでの落とし穴があります:

  1. あの血まみれの@サイン。省略した場合、構文解析は静かに失敗し、ansible-playbookは最初にファイルを指定しなかったかのように処理を進めます。

  2. コマンドラインの--extra-vars/-eを使用するか、YAMLコード内でボールトの内容を明示的にインポートする必要があります。 --ask-vault-passフラグはそれ自身では何もしません(後で使用されるかもしれないし使用されないかもしれない値をあなたに促す以外に)。

あなたの "@"を含めて1時間節約することができます。

0
Eric Anderson

私達はまたbashを生み出しそしてあなたの必要性に従ってそれをカスタマイズするためにansibleでEXPECT BLOCKを使用することができる

- name: Run expect to INSTALL TA
  Shell: |
    set timeout 100
    spawn /bin/sh -i

    expect -re "$ "
    send "Sudo yum remove -y xyz\n"

    expect "$ "
    send "Sudo yum localinstall -y {{ rpm_remotehost_path_for_xyz }}\n"

    expect "~]$ "
    send "\n"

    exit 0
  args:
  executable: /usr/bin/expect
0
Ashish Ranjan

@ toast38cozaによる上記の解決策は私にとってはうまくいきました。ちょうどSudo:yesはAnsibleで非推奨になりました。代わりにbecomeおよびbecome_userを使用してください。

tasks:
 - name: Restart Apache service
   service: name=Apache2 state=restarted
   become: yes
   become_user: root
0
Nätu

非常に単純で、変数ファイルを追加するだけです。

例:

$ vim group_vars/all

そしてこれらを追加します。

Ansible_connection: ssh
Ansible_ssh_user: rafael
Ansible_ssh_pass: password123
Ansible_become_pass: password123
0
rafaelrms

5年経っても、これはまだ非常に関連性のあるテーマです。私の場合には最良の方法を見つけることができます。これは、あなたがすべてのサーバで同じユーザ名と同じ公開鍵を持っていると仮定しています。そうでない場合は、もちろん、もっと具体的にして、対応する変数をホストの横に追加する必要があります。

[all:vars]
ansible_ssh_user=ansible
ansible_ssh_private_key_file=home/user/.ssh/mykey
[group]
192.168.0.50 ansible_Sudo_pass='{{ myserver_Sudo }}'

ansible-vault create mypasswd.yml
ansible-vault edit mypasswd.yml

追加:

myserver_Sudo: mysecretpassword

その後:

ansible-playbook -i inv.ini my_role.yml --ask-vault --extra-vars '@passwd.yml'

少なくともこの方法では、パスワードを指す変数をもっと書く必要はありません。

0
Lethargos