Contents
Ansible Towerを使ってVMで動作しているM/Wの設定変更をした時、自動で切り戻しをやりたかったり、失敗したVMを維持して原因の特定をしたかったりする場合があります。
今回は簡単な例を元にスナップショットを元にした切り戻しとVM維持方法について検証してみようと思います。
環境
項目 | バージョン |
---|---|
vCenter | 6.7.0 |
Ansible Tower | 3.5.1 |
Ansible | 2.8.5 |
検証内容
ここでは、Apacheを使って検証をやってみたいと思います。
検証は以下の流れで行います。
- Apacheに設定を変更加える前に切り戻し用のスナップショットを取得する
- Apacheにわざと起動に失敗する設定を入れる
- Apacheを再起動すると、エラーでApacheは起動しない
- Apacheの再起動に失敗したので、その時点のスナップショットを取得する
- 失敗時に取得したスナップショットを元にリンククローンでVMを作成する
- その場合、本番NWとは切り離す想定で別のポートグループに接続する設定を入れる
- フルクローンだと時間がかかるのでリンククローンで失敗時のVMを再現する(これは、要件によってフルかリンクか変わってくる)
- ただし、データ差分が大きくなるとスナップショットを削除してマージするときに負荷がかかるので注意
- 上記と同時に切り戻し用のスナップショットを使って正常時の状態にVMを切り戻す
これをAnsible Towerのワークフローを使ってやってみます。
Playbook
検証用に作成したPlaybookは以下の通りです。
apache_operation.yml
Apacheの設定変更および再起動をするPlaybookです。
hoge
と言う文字をhttpd.confに書き込んでエラーを出します。
Apacheの再起動に失敗した場合は、次のワークフローに変数を引き継げるよう set_stats
で switch_back_flag
を定義しています。
最後の failed_when
はAnsible Towerがテンプレートの失敗を検知するために入れています。
後 sync
をきちんとしないとスナップショットを取得しても設定が変更されていない時があります。
必ず同じ状態のものがスナップショットで取得できるように sync
を実行しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
--- - name: apache opelation playbook hosts: all gather_facts: no tasks: - name: Insert failure setting lineinfile: path: /etc/httpd/conf/httpd.conf line: hoge - name: run sync command shell: sync ; sync ; sync - name: apache restart systemd: name: httpd state: restarted ignore_errors: yes register: apache_restart_result - name: set switch back flag set_stats: data: switch_back_falg: true when: apache_restart_result.changed is sameas false - debug: msg="Failed Apache restart" failed_when: apache_restart_result.changed is sameas false |
snapshot_operation.yml
スナップショットを取得するPlaybookです。
もし、失敗フラグが存在する場合は failed_
がついたスナップショットを作成します。
もし、切り戻しのフラグが存在する場合はrevertします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
--- - name: snapshot operation playbook hosts: all gather_facts: no tasks: - name: vmware tools status check vmware_guest_facts: hostname: "{{ hostname }}" username: "{{ username }}" password: "{{ password }}" validate_certs: no datacenter: "{{ datacenter }}" folder: "{{ folder }}" name: "{{ name }}" register: vmware_tools_status_check_result until: vmware_tools_status_check_result.instance.guest_tools_status == "guestToolsRunning" retries: 60 delay: 5 - name: create snapshot vmware_guest_snapshot: hostname: "{{ hostname }}" username: "{{ username }}" password: "{{ password }}" validate_certs: no datacenter: "{{ datacenter }}" folder: "{{ folder }}" name: "{{ name }}" snapshot_name: "{{ snapshot_name }}" description: "{{ snapshot_description }}" memory_dump: "{{ memory_dump }}" quiesce: "{{ quiesce }}" state: present when: switch_back_falg is not defined - block: - name: create snapshot for when failed vmware_guest_snapshot: hostname: "{{ hostname }}" username: "{{ username }}" password: "{{ password }}" validate_certs: no datacenter: "{{ datacenter }}" folder: "{{ folder }}" name: "{{ name }}" snapshot_name: "failed_{{ name }}_{{ snapshot_name }}" description: "{{ snapshot_description }}" state: present - name: set revert flag set_stats: data: revert_flag: true when: - switch_back_falg is defined - revert_flag is not defined - name: revert from snapshot vmware_guest_snapshot: hostname: "{{ hostname }}" username: "{{ username }}" password: "{{ password }}" validate_certs: no datacenter: "{{ datacenter }}" folder: "{{ folder }}" name: "{{ name }}" snapshot_name: "{{ snapshot_name }}" state: revert when: revert_flag is defined |
linked_clone_operation.yml
失敗時に取得したスナップショットからリンククローンを作成するPlaybookです。
linuxprepを実行してホスト名を変更します。(本番と間違えないように)
また、リンククローンを作成するネットワークも本番と分けるのが望ましいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
--- - name: linked clone operation hosts: all gather_facts: no tasks: - name: create linked clone vmware_guest: hostname: "{{ hostname }}" username: "{{ username }}" password: "{{ password }}" validate_certs: no datacenter: "{{ datacenter }}" folder: "{{ folder }}" cluster: "{{ cluster }}" name: "failed_{{ name }}" template: "{{ name }}" snapshot_src: "failed_{{ name }}_{{ snapshot_name }}" linked_clone: yes networks: - name: "{{ nw_when_failed }}" type: dhcp customization: hostname: "failed-{{ name }}" state: poweredon |
Ansible Tower
ワークフロー
Ansible Towerで作成したワークフローは以下の通りです。
(1) 正常状態時のスナップショットを作成
(2) Apacheの設定変更
(3) 失敗した時のスナップショットを作成
(4) 失敗した時に取得したスナップショットを元にリンククローンを作成
(5) 本番VMを正常時のスナップショットで切り戻す
ワークフローのSURVEY
項目 | 説明 |
---|---|
HOSTNAME | vCenter Serverを |
USERNAME | vCenter Serverにログインするユーザー名 |
PASSWORD | vCenter Serverユーザーのパスワード |
DATACENTER | VMが存在する/リンククローンを作成するデータセンター |
CLUSTER | リンククローンを作成するクラスター |
FOLDER | VMが存在する/リンククローンを作成するフォルダー |
VM NAME | 設定変更を加える対象VM名 |
NETWORK NAME WHEN FAILED | リンククローンを作成する時に接続するPG |
SNAPSHOT NAME | スナップショット名 |
SNAPSHOT DESCRIPTION | スナップショットの説明 |
MEMORY DUMP | MEMORY DUMPフラグ |
QUIESCE | QUIESCEフラグ |
スナップショット系のパラメーター詳細が気になる方は以下を参照してください。
デモ
以下は実際にワークフローを動かしてみたデモ動画です。
Demo of revert and linked clone using snapshot from sky_joker on Vimeo.
リンククローンで失敗した原因(httpd.confの354行目に構文エラー)が確認できたので実際に設定を見て変更し動作を確認することができました。
こんな感じでAnsible Towerを使えば設定変更も切り戻しも失敗時のVM維持も操作ログ記録も自動で出来ますね 🙂
最後に
今回は、簡単に行えるスナップショットを元に切り戻しと失敗状態のVMを維持してみました。
ただ、スナップショットでやる場合、サーバによっては向き不向きがあります。
例えば、ガンガン書き込みが発生するようなサーバだとスナップショット作成時の瞬断による影響とスナップショットとの差分が大きくなりマージ(スナップショット削除時)する時に負荷が懸念されます。
別の手段だと、Git(GitHubやGitLab)と連携して切り戻す方法も考えられます。(失敗した時は、変更前のコミットから設定を取り出して上書きするとか)
Ansible Towerは色々と幅広くできて便利ですね!
それでは、ハッピーオートメーション!