一部だけ実行し、秘密は隠す
Ansible のタグ(tags)とは、タスクに付ける名札で、プレイブックの一部だけを実行するために使います。Ansible Vault は、パスワードなどの秘密を、暗号化して保存する仕組みです。
設定を全部やり直すと時間がかかるので、ユーザーの追加だけをしたい日があります。また、トークンをそのまま書いたファイルは、人に渡せません。この回で、その2つを身につけます。
このレッスンのゴール
メモ
プレイブックの一部だけを実行し、秘密を平文で置かずに済ませられる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| タグ | タスクに付ける名札 | tags: [config] |
| --tags | 指定したタグのタスクだけを動かす指定 | --tags user |
| --limit | 動かすホストを、さらに絞る指定 | --limit web1 |
| Vault | ファイルを暗号化して持つ、Ansible の機能 | |
| 平文 | 暗号化されていない、そのまま読める文字 | |
| パスワードファイル | Vault を開くパスワードを1行で書いたファイル |
学生が入力するセルは、このプレビューでは空白です。
タグを付けると一部だけ動かせる
タスクに tags: [config] と書くと、名札が付きます。--tags config で実行すると、その名札のタスクだけが動きます。--skip-tags は、逆に、その名札のタスクを外します。
名札のないタスクは、--tags を使うと動きません。ただし always は、いつも動き、never は、名指しされたときだけ動きます。
自分のフォルダを作る
mkdir ~/deskここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
そのフォルダに入る
cd ~/deskここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
2つのホストを書く
printf '%s\n' '[web]' 'web1 ansible_connection=local' '' '[spare]' 'spare1 ansible_connection=local' > inventory.iniここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
タグ付きの6つのタスクを書く
printf '%s\n' '- hosts: web' ' gather_facts: false' ' tasks:' ' - name: Make the folder' ' ansible.builtin.debug:' ' msg: folder' ' tags: [config]' ' - name: Write the settings' ' ansible.builtin.debug:' ' msg: settings' ' tags: [config]' ' - name: Add the user' ' ansible.builtin.debug:' ' msg: user' ' tags: [user]' ' - name: Say hello' ' ansible.builtin.debug:' ' msg: hello' ' - name: Always check' ' ansible.builtin.debug:' ' msg: check' ' tags: [always]' ' - name: Slow cleanup' ' ansible.builtin.debug:' ' msg: cleanup' ' tags: [never, cleanup]' > play.ymlここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
タスクとタグの一覧
ansible-playbook -i inventory.ini play.yml --list-tasks | grep TAGSここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
userのタグだけ動かす
ansible-playbook -i inventory.ini play.yml --tags user | grep -o 'TASK \[[^]]*\]'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
neverのタスクを名指しする
ansible-playbook -i inventory.ini play.yml --tags cleanup | grep -o 'TASK \[[^]]*\]'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
--limitはホストを絞る
プレイの hosts が決めるのは、動かせるホストの全部です。--limit は、その中から、さらに絞ります。
プレイが使わないホストを --limit に書いても、動くホストは増えません。ひとつも残らないと、何も動きません。--list-hosts を付けると、動かさずに、どのホストが残るかだけを見られます。
プレイが使わないホストに絞る
ansible-playbook -i inventory.ini play.yml --limit spare1 --list-hosts | grep "hosts ("ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
プレイが使うホストに絞る
ansible-playbook -i inventory.ini play.yml --limit web1 --list-hosts | grep "hosts ("ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
Vaultは秘密のファイルを暗号化する
ansible-vault encrypt は、ファイルをその場で暗号化します。暗号化されたファイルは、1行目が $ANSIBLE_VAULT で始まります。
開くには、パスワードが要ります。パスワードを1行で書いたファイルを、--vault-password-file で渡します。ここでのパスワードとトークンは、練習用の偽物です。本物は、リポジトリに入れません。
練習用の偽のパスワードを書く
printf '%s\n' 'classroom-password' > pw.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
秘密のファイルを平文で書く
printf '%s\n' 'api_token: demo-token-0042' > secrets.ymlここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
暗号化する
ansible-vault encrypt --vault-password-file pw.txt secrets.ymlここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ファイルの1行目を見る
head -n 1 secrets.ymlここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
パスワードで中身を開く
ansible-vault view --vault-password-file pw.txt secrets.ymlここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
秘密を使い、長さだけを出す
ansible localhost -i localhost, -c local -m ansible.builtin.debug -a 'msg="{{ api_token | length }}"' -e @secrets.yml --vault-password-file pw.txt | grep msgここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
パスワードなしで使うと
ansible localhost -i localhost, -c local -m ansible.builtin.debug -a 'msg="{{ api_token | length }}"' -e @secrets.yml 2>&1 | grep -m1 -o "no vault secrets found"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
--tags を付けても、タグのないタスクは動くと思いがちです。実際は、--tags を使うと、名札のないタスクは動きません。always だけが、いつも動きます。動かしたいなら、タグを付けます。