概要
Ansibleでは、become
という仕組みでsu
またはsudo
を実現できるが、su
またはsudo
のどちらかに統一しておく必要がある。
例えば、su
でユーザ変更した後のsudo
が仕様上できない。(sudo
で統一しておくのが普通。。)
Ansible 2.0より加わったexpect
のモジュールを用いて、対話形式パスワードを乗り越える。
例
sshユーザ:aaa
Ansibleタスク実行ユーザ(become_user
):bbb(aaa -> su
-> bbb)
その後、bbbユーザがsudo
を使ったコマンドを実行する。
Playbook
webservers-playbook.yml
- hosts: webservers
vars:
- password: hogehoge
tasks:
- name: yum update
become: yes
become_user: bbb
become_method: su
expect:
command: sudo yum update -y
responses:
password for bbb: "{{password}}"
実行時に --ask-become-pass
を付けて、bbbユーザになるため(become
)のパスワードを入力
### 実行
$ ansible-playbook -i webservers webservers-playbook.yml --ask-become-pass
SUDO password: (聞かれるので、bbbユーザのパスワードを入力)
セキュリティ対策
上記のやり方だと、playbookにパスワードが直書きになってしまっているため、暗号化を推奨する。
### 暗号化
$ ansible-vault encrypt webservers-playbook.yml
New Vault password: (復号用のパスワードが聞かれる)
Confirm New Vault password: (復号用のパスワード(確認)が聞かれる)
Encryption successful
### 暗号化されたことを確認
$ cat webservers-playbook.yml
$ANSIBLE_VAULT;1.1;AES256
65306337623632636662313263376337313837326233643939613331306261386663636132626334
6633663038333836363835313030393064383239666538650a633066346665313536366664363638
34653038653031623062643931353565613166313539326263646539633863353663646634326332
3031623064623533360a393230346331303564303633353830393430656464303266346435306435
34373635386530383561613231393933646139303532323132626164363633646265366565376530
61313037313339336631366237333338366336666436343938373761623565313064393763383637
37613132623665623535373932653465353135343638343630363238386630366637383333626533
38353830373737333130373061303136663836303239303634346635366237356462393930633163
36383961356134326137636564616364393738326338646632623963663330626435363131633464
39346137363038373130623866333036373164633138386133383434383334613437326665313063
31626462353633656564346163656261356133383261333330393239326564343532393639653531
61656563613730373530643966383932393762333562336262373834336434616266373361396438
35643533623337313763653561343735346663346630393837376531393234343366303431656136
34376562633836356330623235303137373463393236363331666639343765306534353363393339
32643435346334383463323661653563623839323665333765313133356563393738633532623531
34323165323639653038323661393437663566393833616337386138393034356435346637623631
65373238333564343663636539656439383761363038633033383164636666633561
暗号化されたものを実行する。
### 暗号化したものを実行
$ ansible-playbook -i webservers webservers-playbook.yml --ask-become-pass --ask-vault-pass
SUDO password: (聞かれるので、bbbのパスワードを入力)
VAULT password: (聞かれるので、復号用のパスワードを入力)
まとめ
もっと良いやり方がありそうな。。w