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**
方法はありますか?私は自分のプロジェクトの展開をできるだけ自動化したいと思います。
--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
が使用されるようになりました。どちらもうまくいくようです。
おそらくこれを行うための最良の方法 - あなたが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
コード( runner/__init__.py
)を見ると、おそらくあなたのインベントリファイルにそれを設定できると思います。
[whatever]
some-Host ansible_Sudo_pass='foobar'
ansible.cfg
設定ファイルにもいくつかの規定があるようですが、今は実装されていません( constants.py
)。
あなたがしたいようにansibleがあなたがフラグの中にパスワードを指定させるとは思わない。これは設定可能な設定のどこかにあるかもしれませんが、これは全体としてansibleを使用することをより安全でなくするでしょうし、お勧めできません。
できることの1つは、ターゲットマシンにユーザーを作成し、すべてのコマンドまたは制限されたコマンドリストのいずれかにパスワードなしのSudo特権を付与することです。
Sudo visudo
を実行して以下のような行を入力した場合、ユーザー「PrivilegedUser」はSudo service xxxx start
のようなものを実行するときにパスワードを入力する必要はありません。
%privilegedUser ALL= NOPASSWD: /usr/bin/service
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"
グループまたはすべてのサーバーのパスワードを一度に設定できます。
[all:vars]
ansible_Sudo_pass=default_Sudo_password_for_all_hosts
[group1:vars]
ansible_Sudo_pass=default_Sudo_password_for_group1
私はこれで私の髪を引き裂いていた、今私は私が欲しいものをする解決策を見つけた:
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による方法は、ユーザーが決定します。
これに基づいて私はあなただけの全体のホストファイルを暗号化することができると思う...
これを行うためのより賢い方法は、 LastPass または KeePass などの安全なボールトにSudo
name__パスワードを保存し、それをハードコードする代わりに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 lpass
name__を実行し、使用するパスワードを取得しますecho "ansible_Sudo_pass: ...password..."
-文字列 'ansible_Sudo_pass:'を取り、それをlpass
name__によって提供されたパスワードと組み合わせます-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)
あなたのプレイブックのSudoパスワードは、このようにhostsファイルに書くことができます。
[Host-group-name]
Host-name:port ansible_Sudo_pass='*your-Sudo-password*'
プレーンテキストファイルにパスワードを保存するのに慣れている場合は、--extra-varsパラメータを指定してJSONファイルを使用する方法もあります(必ずファイルをソース管理から除外してください)。
ansible-playbook --extra-vars "@private_vars.json" playbook.yml
Ansibleは1.3 からこのオプションをサポートしています。
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 。
あなたが使用することができます 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
以下のようにsshpass
ユーティリティを使うことができます、
$ sshpass -p "your pass" ansible pattern -m module -a args \
-i inventory --ask-Sudo-pass
プレイブックを--extra-vars "become_pass=Password"
で呼び出すだけです。
become_pass =( 'ansible_become_password'、 'ansible_become_pass')
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
これを自動化するための私のハックは、環境変数を使用して--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') }}'"
適切な代替回答:
ansible_become_pass
にボールト値を使用するだけ 。これはまともです。ただし、ansible vaultパスワードを共有し、個人アカウントでansibleプレイを実行する必要がある偏執的なチームの場合、共有vaultパスワードを使用して互いのオペレーティングシステムパスワードを逆にする(盗難を識別する)必要があります。おそらく、あなたはあなた自身のチームを信頼する必要がありますか?@
プレフィックスを使用してファイル記述子からansible変数を読み取ります 。少なくともbash履歴を回避します。確かではありませんが、サブログエコーが監査ログ(例:auditd)でキャッチされて公開されないことを願っています。単なる補遺なので、他に誰も私が最近した煩わしさを経験することはありません。
私の知る限り、最善の解決策はtoast38cozaの上記の一般的な方針に沿ったものです。パスワードファイルとプレイブックを静的に結び付けるのが理にかなっている場合は、彼のテンプレートに従ってvars_files
(またはinclude_vars
)を付けます。それらを別々にしておきたい場合は、ボールトの内容をコマンドラインで次のように指定します。
ansible-playbook --ask-vault-pass -e@<PATH_TO_VAULT_FILE> <PLAYBOOK_FILE>
振り返ってみるとそれは明らかですが、ここでの落とし穴があります:
あの血まみれの@サイン。省略した場合、構文解析は静かに失敗し、ansible-playbookは最初にファイルを指定しなかったかのように処理を進めます。
コマンドラインの--extra-vars/-eを使用するか、YAMLコード内でボールトの内容を明示的にインポートする必要があります。 --ask-vault-pass
フラグはそれ自身では何もしません(後で使用されるかもしれないし使用されないかもしれない値をあなたに促す以外に)。
あなたの "@"を含めて1時間節約することができます。
私達はまた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
@ toast38cozaによる上記の解決策は私にとってはうまくいきました。ちょうどSudo:yesはAnsibleで非推奨になりました。代わりにbecomeおよびbecome_userを使用してください。
tasks:
- name: Restart Apache service
service: name=Apache2 state=restarted
become: yes
become_user: root
非常に単純で、変数ファイルを追加するだけです。
例:
$ vim group_vars/all
そしてこれらを追加します。
Ansible_connection: ssh
Ansible_ssh_user: rafael
Ansible_ssh_pass: password123
Ansible_become_pass: password123
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'
少なくともこの方法では、パスワードを指す変数をもっと書く必要はありません。