Ansible で sudo を実行する

Ansibleの基礎的なところ

makotow
makotow’s blog clone
4 min readJun 11, 2017

--

sudo実行時のパスワードをどうするかという話、調べた内容をメモとして残す。

以下のように、 become:true とした場合にいつどのようにパスワードを設定する方法を調べた。

- name: common packages and utility tools install
become: true
apt:
pkg: “{{ item }}”
state: present
update_cache: yes
cache_valid_time: 3600
with_items: “{{ ndvp_packages }}”
notify:
- enable and start iscsi services

やり方は様々ある。

ケースに応じて適切に使えばいいと思う、調べたところ主に以下の3つを使うことができる。

  1. sudo時にパスワードを聞かれないようにする
  2. Ansible vaultを使う方法
  3. ansible-playbook 実行時にパスワード入力する方法

sudo 時にパスワードを聞かれないようにする方法

対象のホストで設定、sudo時にパスワードを聞かれないようにする。

sudoers(visudo) で編集で以下のように定義

ansibleuser ALL=NOPASSWD: ALL

ただし、上記の状態だとansibleuserであればすべてのコマンドがパスワードなしで実行できてしまうので以下のようにコマンドごとにパスワードなし実行とすることができる。

ansibleuser ALL=NPPASSWD: /path/to/cmd

プロビジョニングのホストに対して多く操作が必要になるので個人的にはあまり好まないやり方。

Ansible Vault を使う方法

変数として定義する方法、平文で書くのは色々と問題があるのでそれを暗号化し保存するもの。ファイル単位の暗号化。

$ ansible-vault encrypt /path/to/file

Playbook を実行する際にパスワードを指定する必要あり。

ベストプラクティスはいかに記載があり。

暗号化するものと、平文のものを分けて保存する。group_vars以下に vars.yml, vault.ymlのように2つにファイルを分けて保存する方法があった。

このやり方が一番綺麗にできると思う。暗号の復元パスワードは playbook実行にask-vault-pass` をオプションでつけるか、ansible.cfg に ask_vault_pass = Trueを追加することで実行時にパスワードを求められる。

[defaults]
ask_vault_pass = True

ansible-playbook 実行時にパスワード入力する方法

最後のは非常にシンプルで playbook実行時にログイン先のsudo のパスワードを入力するやり方。

playbook実行時に --ask-become-pass をオプションで指定

$ ansible-playbook -i inventory site.yml --private-key ~/path/to/private-key  --ask-become-pass

ansible -vault使う手数とほぼ同じなのでシンプルに環境構築したい場合などはこれでいいと思う。

まとめ

個人的には

  • 簡単に検証環境つくる際には ansible-playbook時にsudo パスワード入力
  • しっかり作り込む場合には Ansible Vault

という使い分けにしたい。

--

--

makotow
makotow’s blog clone

kubernetes/container/docker/Programming/Go/Scala/Ruby/Mac/Emacs/IntelliJ/Rust/OpenShift.