『初めてのAnsible
』を読んだので、学んだ点をまとめる。
初めてのAnsible
1.2 Ansibleが役立つこと
Ansibleが役立つこと
・設定管理
・デプロイ
・オーケストレーション(DB→APのデプロイ順、APは一つずつロードバランサから外すetc)
・プロビジョニング(新しい仮想マシンの起動)
1.9 テスト用サーバーのセットアップ
WindowsでAnsibleを実行するでアレンジしながら実践した。
・インベントリファイル
インベントリファイルをplaybooks/hostsとすると、
$ ansible サーバエイリアス -i hosts -m ping
でpingモジュールが呼び出せる。
・ansible.cfg
デフォルト設定のためのファイル。
ansible.cfgによりインベントリファイルが簡略化できる。
カレントディレクトリにplaybookと一緒に置き、共にバージョン管理するのがBEST。
ansible.cfg
[default]
hostfile = hosts
ansible.cfgで設定すると、次のように簡素に呼び出せる。
ansible.cfgなし $ ansible サーバエイリアス -i hosts -m ping
ansible.cfgあり $ ansible サーバエイリアス -m ping
2.2 ごくシンプルなPlaybook
yes/no/True/Falseの使い分け
・モジュール引数:yes/no
・Playbookのその他:True/False
2.5.1 Play
playは次の二つが最小構成要素。
・設定するホスト(hosts)
・タスクのリスト(tasks)
3.4 グループとグループとグループ
インベントリにはグループが設定可能。
playbooks/hosts
[web]
web[1:10].example.com
vagrant ansible_ssh_host=127.0.0.1
自動的にall(あるいは*)グループが定義される。
$ ansible all -a "date"
3.5 ホストとグループ変数:インベントリの内部
ホストに対して任意の変数を定義できる。
環境ごとに異なる設定値(ex, DBの接続情報)はグループに対する変数として定義するのが良い。
[all]
ntp-server=ntp-ubuntu.com
[production:vars]
db_primary_host=prodb.example.com
db_primary_port=5432
db_name=dbname
db_user=dbuser
db_password=pFmMxcyDjFc6)6
[staging:vars]
db_primary_host=stgdb.example.com
db_primary_port=5432
db_name=dbname
db_user=dbuser
db_password=L@4Ryz8cRUXedj
3.8 複数ファイルへのインベントリの分割
通常のインベントリファイルと動的インベントリファイルを同じディレクトリに置く。
ansible.cfgに
hostfile = ディレクトリ名
とする。
4.1 Playbook内での変数の定義
Playbook内で変数を定義する箇所
・varsセクション
・vars_filesセクション
4.2 変数の値の表示
-debug: var=変数名
4.3 変数の登録
register: 変数名
4.4.1 サーバーに関連づけられたすべてのファクトの表示
setupモジュールでファクト収集が手動でできる。
$ ansible server名 -m setup
フィルタリングはグロブを指定することで実現可能。
$ ansible server名 -m setup -a 'filter=ansible_eth*'
4.6.1 hostvars
すべてのホストに対して定義されたすべての変数を含む辞書。
ファクトにアクセスしようと思えば次のようにする。
hostvars['ホスト名'].ansible_eth1.ipv4.address
6.4 イテレーション(with_items)
Ansibleはループでのイテレーション変数名として必ずitemを使う。
apt: pkg={{item}}
become: True
with_items:
-git
-nginx
-postgresql
6.9 タスク中の複雑な引数
・YAMLの行折り返し
pip: >
name={{item.name}}
version={{item.version}}
・キーを変数名とする辞書
pip:
name:"{{item.name}}"
version:"{{item.version}}"
7.1 コントロールマシン上でのタスクの実行
local_action節
7.2 ホスト以外のマシン上でのタスクの実行
delegate_to節
7.4 一度に一つのホストでの実行
serial節
playを並列実行するホスト数を設定する。
max_fail_percentage節を一緒に使え、すべてのホストでタスクが失敗する前にplay全体を失敗させる。
7.5 1回だけの実行
run_once節
7.8 Vaultによるセンシティブなデータの暗号化
センシティブ情報の扱い方
-
センシティブ情報専用ファイルに切り出す。
playbook.yml
vars_files:
-secrets.yml
-
Vaultを使用してセンシティブ情報専用ファイルを暗号化する。
#暗号化
$ ansible-vault encrypt secrets.yml
#新規作成
$ ansible-vault create secrets.yml
-
Vaultでの暗号化の際に入力したパスワードを外部ファイルに書いて、playbookを実行する。
$ ansible-playbook playbook.yml --vault-password-file ~/password.txt
7.12 ルックアップ
lookup('file', '/path/to/file.txt')
でファイルの中身を取り出せる。
file以外にpipi, env, csvfileなどがある。
7.13 さらに複雑なループ
with_items以外にwith_lines, with_fileglobなどがある。
8 ロール:プレイブックのスケールアップ
ロールは、playbookを複数のファイルに分割するための主要な仕組み。
ロールを1つ以上のホストに割り当てる。
8.1 ロールの基本構造
ロールに関連づけられたファイルは、
roles/ロール名/
ディレクトリに置かれる。
roles/database/tasks/main.yml
roles/database/files/
etc...
rolesディレクトリ自体は、次の場所である。
・playbookが置かれているディレクトリ内のroles
・システム全体にわたるロールは、/etc/ansible/roles
8.3 Playbooks内でのロールの利用
playbook中にロールのセクションを置く。
ロールを呼び出す際に変数が渡せる。(今回の例ではdatabase_name, database_userの2変数)
roles:
-role: databse
database_name: "{{db_name}}"
database_user: "{{db_user}}"
8.6 Mezzanineのデプロイのための”mezzanine”ロール
Ansibleには、複数のロール間で使える名前空間の記法がない。
→ほかのロールで定義された変数やplaybookの他の部分で定義された変数がどこからでもアクセス可能。
→ロールの変数に接頭語をつけるのがいい。
・mezzanine_venv_home
・mezzanine_venv_path
など
14.4.1 構文チェック
–syntax-check
$ ansible --syntax-check playbook.yml
14.4.4 チェックモード
-C or –check
dry run。
実際にサーバーに変更を加えずplaybookを実行する。
$ ansible -C playbook.yml
チェックモードの難点:playbookのそれ以前の部分が成功した時のみ、ある部分が成功する場合、チェックモードではタスクが失敗する。
14.4.5 Diff(ファイルの差分の表示)
-D or –diff
–checkと併せて使う。
$ ansible -D --check playbook.yml
14.5.1 step
各タスクの実行前に y/n/c を聞いてくれる。
cを選ぶと、playbookの残りをプロンプトの表示をせずに実行する。
14.5.2 start-at-task
–start-at-task タスク名