Ansibleのsudoパスワードを指定する


225

非インタラクティブな方法で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**

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


回答:


170

コマンドラインで変数を渡すことができます--extra-vars "name=value"。Sudoパスワード変数はansible_sudo_passです。したがって、コマンドは次のようになります。

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

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


7
セキュリティの観点から、以下を追加した場合の最良の答え:history -cymlの実行後。
kiltek

12
@kiltek:またはます(bashで)行の先頭に余分なスペースを追加* *ないに行を書きます.bash_history
ccpizza

44
コマンドラインでパスワードを渡すことはお勧めできません。コマンドの実行中に、誰でもプロセスリストでパスワードを確認できます...
Pavel Chernikov

22
それでも、やらないでください。--ask-sudo-pass
JasonG 2017

2
@scrutari状況によっては完全に有効です:例:デフォルトの世界的に知られている初期パスワードから変更して、ユーザーの公開sshキーを挿入します...新しく再イメージされたシステムの初期構成を考えてください。
Ceredig

236

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


2016年の更新:

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


16
はい、これが推奨される理由がわかります。しかし、Ansibleをデプロイメントプロセスの一部として使用する場合、これを自動化するためのより良い方法は何ですか?展開プロセスの途中で停止し、ユーザーにsudoパスワードの入力を要求するのはあまり便利ではありません。
Slava Fomin II

9
注--ask-sudo-passは-Kに短縮できますが、私が知る限り、複数のサーバーで実行されているプレイブックを異なるパスワードで処理する方法はないので(1度だけ尋ねられます)、パスワードなしだと思います。 sudoを使用する方法です。
William Turrell 2014

1
動作していないようです。しかし、次の提案( "some-host ansible_sudo_pass = 'foobar'")は行います
nadavkav

--ask-sudo-passは以前のバージョン1.9で廃止されました
Chris Betti

回答がある場合は、ソースリンクで回答を更新してください。
ディーフォー16

106

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

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

- hosts: all

  vars_files:
    - secret

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

ここに、 secret、sudoパスワード。

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

ansible-vault create secret

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

secret::

ansible_sudo_pass: mysudopassword

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

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

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

Ansibleドキュメントから:

..ファイルに対する権限が他の誰もあなたのキーにアクセスできないようにし、ソース管理にキーを追加しないようにします

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

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をご覧ください。


5
注:ansible 1.9以降では、ansible_sudo_pass(またはansible_become_pass)変数を使用できなくなったようです: "fatal:[...] => Missing
been

6
私はこのソリューションを本番環境で使用しています。jenkinsはボールトのパスワードを難読化された環境変数として保存し、実行時に一時ファイルに書き込んで、ansibleの呼び出しに進みます。
simone cittadini

6
またはもっと簡単に:ansible-vault create group_vars/all/ansible.ymlそしてansible_sudo_pass: yourpasswordそこに追加します。プレイブックやインベントリを変更する必要はありません
Bouke Versteegh

1
これを試してみましたが、次のエラーが発生しました:fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "module_stderr": "sudo: a password is required\n", "module_stdout": "", "msg": "MODULE FAILURE", "parsed": false}
JohnnyQ '26

8
ボールトの横にプレーンテキストでボールトのパスワードを保存する場合、ボールトはどのようなメリットがありますか?
Erik

44

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

[whatever]
some-host ansible_sudo_pass='foobar'

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


7
これを安全に設定するための優れた方法は、これをhost_varsまたはgroup_varsディレクトリに保存し、Ansible Vault
Kyle

44

ansibleがあなたがやりたいようにフラグにパスワードを指定させてくれるとは思いません。設定のどこかに設定できる可能性がありますが、これにより、ansibleの使用が全体的に安全でなくなり、推奨されません。

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

次のsudo visudoような行を実行して入力すると、ユーザー 'privilegedUser'は、次のように実行するときにパスワードを入力する必要がなくなりますsudo service xxxx start

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

7
@bschlueterあなたは悪い習慣を支持していますか?
スティーブン

1
これは良い考えではないと思います。--ask-sudo-passを使用するのは理にかなっています。
kgpdeveloper 2016

@simone cittadini私は完全にそれに同意します。これはセキュリティ上のリスクです。
einarc

パスワードなしのsudoを使用してステージング/製品にデプロイする場合は、セキュリティ上のリスクは少なくなりますが、ローカルホストにデプロイするときにローカルラップトップのログインパスワードを入力する必要がなく、毎日15分おきにこれらの回答を使用したい場合。
Jonathan Hartley

Ansibleを使用してこの行をどのように追加しますか?
Matthias

21

sudoのパスワードが呼ばれる変数として格納されていますansible_sudo_pass。この変数は、いくつかの方法で設定できます。

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

[server]
10.0.0.0 ansible_sudo_pass=foobar

グループごと、在庫グループファイルinventory/<inventoryname>/groups

[server:vars]
ansible_sudo_pass=foobar

グループごと、グループ変数group_vars/<groupname>/ansible.yml

ansible_sudo_pass: "foobar"

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

ansible_sudo_pass: "foobar"

18

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

[all:vars]
ansible_sudo_pass=default_sudo_password_for_all_hosts

[group1:vars]
ansible_sudo_pass=default_sudo_password_for_group1

14

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

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を使用するかどうかは自由です

これに基づいて、hostsファイル全体を暗号化できると思います...


ボールトを使用して暗号化することは、私にとって最も理にかなっていますが、でそれらを使用するのに苦労しましたansible-playback。私は-e @vault/filename.ext自分のansible-playbook電話でボールトを使用する必要がありました。
Alex

9

これを行うためのより知識のある方法はsudoLastPassKeePassなどの安全なボールトにパスワードを保存し、それを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を介してPlaybookを実行している
  • $(lpass show folder1/item1 --password)"-LastPass CLI lpassを実行し、使用するパスワードを取得します
  • echo "ansible_sudo_pass: ...password..." -文字列「ansible_sudo_pass:」を受け取り、それを提供されたパスワードと組み合わせます lpass
  • -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)

参考文献


1
サブシェルの使用は非常に賢いアイデアです!不思議人のために、ここでは1PasswordののCLIで次のようになります。--extra-vars @<(echo ansible_become_pass: $(op get item <item name> | jq --raw-output '.details.sections[0].fields[] | select(.t=="password").v'))
Diti

1
私がこれを気に入っているのは、バッハの履歴を確認したときに、パスワードがクリアテキストで公開されていなかったためです。また、システム監査が有効になっている場合、コマンドはファイルの読み取りとしてログに記録される/dev/fd/63ため、一時ファイル記述子にパスワードが含まれているため、その情報は公開されません。
JPvRiel


5

次のように、hostsファイルにプレイブックのsudoパスワードを書き込むことができます。

[host-group-name]
host-name:port ansible_sudo_pass='*your-sudo-password*'

5

ここではansibleボールトが数回提案されていますが、プレイブックの機密ファイルの暗号化にはgit-cryptを使用することをお勧めします。gitを使用してansibleプレイブックを保持している場合、それは簡単です。私がansibleボールトで見つけた問題は、操作したいファイルの暗号化されたコピーに出くわしてしまい、操作する前にそれを復号化しなければならないことです。 git-cryptより優れたワークフローIMOを提供します。

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

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

プレイブックはGithubで透過的に暗号化されます。次に、ansibleの実行に使用するホストに暗号化キーをインストールするか、ドキュメントの指示に従ってでセットアップする必要がありgpgます。

転送SSHキーのgpgような転送キーに関する良いQ&Aは、httpsssh-agent//superuser.com/questions/161973/how-can-i-forward-a-gpg-key-via-ssh-agentにあります


3

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

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

3

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

次のように、このインベントリを使用してプレイブックを実行します。

ansible-playbook -i inventory copyTest.yml

3

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

env varをエクスポートしますが、bash / shell履歴は避けてください(スペースまたはその他のメソッドを前に付加します)。例えば:

     export ANSIBLE_BECOME_PASS='<your password>'

余分なansible_become_pass変数をに渡しながらenv varを検索しますansible-playbook。例:

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

良い代替回答:


2

パスワードを暗号化されたボールトにコード化するansibleボールトを使用できます。その後、プレイブックでボールトの変数を使用できます。

Ansible Vaultに関するドキュメント:
http

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

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

はい、ボールトパスワードをプレーンテキストでローカルディレクトリに保存しますが、すべてのシステムにrootパスワードを保存するよりも危険ではありません。ルートパスワードはボールトファイル内にありますが、ユーザー/グループのsudoersファイルのようにすることもできます。

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



1

5年経った今でも、これは非常に重要なテーマであることがわかります。私の場合に最も良いと思うleucosの回答をある程度反映し、(集中型認証、トークンなどを使用せずに)ansibleツールのみを使用します。これは、すべてのサーバーで同じユーザー名と同じ公開鍵を持っていることを前提としています。そうでない場合は、もちろん、より具体的にして、対応する変数をホストの隣に追加する必要があります。

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

少なくともこの方法では、パスワードをポイントする変数をさらに記述する必要はありません。


1

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

tasks:
 - name: Restart apache service
   service: name=apache2 state=restarted
   become: yes
   become_user: root

0

アンシブルでEXPECT BLOCKを使用してbashを生成し、必要に応じてカスタマイズすることもできます

- 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

非常にシンプルで、変数ファイルのみを追加します。

例:

$ vim group_vars/all

そしてこれらを追加してください:

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

ありがとう、でも、Ansible_become_passではなくansible_become_passを意味すると思います。
クリシュノム

0

単なる補遺なので、私が最近行った煩わしさを他の誰も経験しません:

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

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

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

  1. その流血の@記号。省略した場合、解析はサイレント失敗し、ansi-playbookは最初からファイルを指定しなかったかのように処理されます。

  2. コマンドライン--extra-vars / -eを使用するか、YAMLコード内で、Vaultのコンテンツを明示的にインポートする必要があります。--ask-vault-passフラグが(またはそれ以降を使用してもしなくてもよい値のプロンプト以外のあなたは)それだけで何もしません。

"@"を含めると、1時間節約できます。


-3

これは私にとってはうまくいきました... NOPASSWDで/etc/sudoers.d/90-init-usersファイルを作成しました

echo "user ALL=(ALL)       NOPASSWD:ALL" > 90-init-users

ここで、「user」はユーザーIDです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.