体験ラウンジの環境を準備する
Pythonのvirtualenv利用した仮想実行環境にAnsibleをインストールする
OpenStackのAPIを利用して、仮想マシンを起動する
OpenStackと連携して仮想マシンの管理を行う
デリバリされた仮想マシンの設定やミドルウェアのインストールなどの操作を行う
体験ラウンジ環境の後片付け
下記のコマンドで、Ansibleが導入された操作用仮想マシンを用意します。
"student11" の部分には、操作端末に応じた番号が割り当てられます。
コマンド実行の様子(数分かかります):
---------ここから--------- $ cd /opt/support/t2-c2/ && ./01_init.sh Cleaning up... Deleting student10-step-server... Booting student10-step-server... ...(中略)... Waiting for guest OS to be ready........ Associating floating IP... Associated floating IP: <Floating IP> Use the following command to login student10-step-server => ssh -i ~/default.pem root@<Floating IP> $ ssh -i ~/default.pem root@<Floating IP> ---------ここまで---------
Ansibleは、OSが提供するパッケージやPythonのpipを利用するなど、いくつかの方法でインストールすることができますが、 ここではPythonのvirtualenvを利用して、仮想実行環境にAnsibleをインストールする方法を紹介します。
pipを利用すると、Ansibleが依存しているモジュール(Jinja2など)もあわせてインストールされます。
コマンド実行の様子:
---------ここから--------- [root@student11-step-server ~]# cd $HOME && virtualenv venv [root@student11-step-server ~]# source /root/venv/bin/activate (venv)[root@student11-step-server ~]# pip install ansible Downloading/unpacking ansible Downloading ansible-1.8.2.tar.gz (754kB): 754kB downloaded ...(中略)... Successfully installed ansible paramiko jinja2 PyYAML pycrypto ecdsa markupsafe Cleaning up... (venv)[root@student11-step-server ~]# ansible --version ansible 1.8.2 configured module search path = None ---------ここまで---------
Ansibleのpingモジュールを利用して動作確認を行います。 ここではリモートホストではなく、ローカルホストにpingモジュールを摘要します。
コマンド実行の様子(コマンドプロンプトは一部省略しています):
---------ここから--------- (venv)# cd $HOME (venv)# echo "localhost ansible_connection=local" > ansible_hosts (venv)# ansible localhost -i ansible_hosts -m ping localhost | success >> { "changed": false, "ping": "pong" } ---------ここまで---------
実行結果が success となっていれば、動作確認成功です。
OpenStackのクライアントライブラリをインストールして、novaの操作が可能であることを確認します。このインストールにもpipを利用します。 novaコマンドで、仮想マシンのリストが取得できればインストール成功です。 踏み台となる student11-step-server と、テスト用の student11-test-server が起動していることが確認できます。
コマンド実行の様子:
---------ここから--------- (venv)# pip install python-novaclient==2.16.0 (venv)# pip install python-neutronclient==2.3.4 (venv)# source $HOME/openrc (venv)# nova list +--------------------------------------+-----------------------+--------+------------+-------------+---------------------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------+-----------------------+--------+------------+-------------+---------------------------------+ | 16b659aa-abe5-4d08-88ee-3803aae1b1cd | student11-step-server | ACTIVE | - | Running | work-net=10.0.0.1, 118.67.96.82 | | cdac9e6e-7b2a-44ec-a18f-be6e7ea3b11e | student11-test-server | ACTIVE | - | Running | work-net=10.0.0.3 | +--------------------------------------+-----------------------+--------+------------+-------------+---------------------------------+ ---------ここまで---------
SecurityWarning が出力される場合がありますが、体験ラウンジでは無視してください。
Ansibleの基本動作を設定する $HOME/.ansible.cfg の新規作成と、操作対象ホストを記述した ansible_hosts に [test-server] グループのメンバーとして student11-test-server のIPアドレスを追記します。IPアドレスについては、 nova list の出力結果取得したアドレスを指定してください。
設定ファイルを作成する($HOME/.ansible.cfg):
---------ここから--------- [defaults] forks = 10 host_key_checking = False gathering = smart transport = smart library = /root:/root/venv/lib/python2.6/site-packages/ansible/modules/core:/root/venv/lib/python2.6/site-packages/ansible/modules/extras ---------ここまで---------
インベントリファイルの修正($HOME/ansible_hosts):
---------ここから--------- localhost ansible_connection=local [test-server] 10.0.0.3 ---------ここまで---------
test-serverグループに対して遠隔操作が可能であることを、pingモジュールを利用して確認します。
コマンド実行の様子:
---------ここから--------- (venv)# ansible test-server -i ansible_hosts -m ping -u root --private-key=default.pem 10.0.0.3 | success >> { "changed": false, "ping": "pong" } ---------ここまで---------
環境構成:
+-------------+ +-------------+ | step-server | | test-server | +------+------+ +------+------+ | | | .1 | .3 +------+------------------------------+------+ 10.0.0.0/24
Ansibleを利用して仮想マシンを起動します。仮想マシンの起動には、Playbookを利用します。AnsibleのPlaybookは、1つ1つの作業をまとめた手順書のようなものです。
ansible-playbook コマンドを実行した分だけ仮想マシンが作成・起動してきます。
コマンド実行の様子:
---------ここから--------- (venv)# wget -O nova_compute.py http://goo.gl/rQXudE (venv)# wget -O create_vm.yml http://goo.gl/foPjQw (venv)# ansible-playbook -i ansible_hosts create_vm.yml PLAY [localhost] ****************************************************** GATHERING FACTS ******************************************************* ok: [localhost] TASK: [ansible_python_interpreter setup] ****************************** ok: [localhost] TASK: [get uuid for generate hostname] ******************************** changed: [localhost] TASK: [creating server] *********************************************** changed: [localhost] PLAY RECAP ************************************************************ localhost : ok=4 changed=2 unreachable=0 failed=0 ---------ここまで---------
PlaybookはYAML形式で記述されており、いくつかのセクションに分かれています。OSの環境変数などもPlaybook内に記述して利用することができます。
仮想マシンが、無事に起動したかどうかを nova list コマンドで確認してみましょう。
Playbook(create_vm.yml):
---------ここから--------- --- - hosts: localhost vars: auth: url: "{{ lookup('env', 'OS_AUTH_URL') }}" region_name: "{{ lookup('env', 'OS_REGION_NAME') }}" tenant_name: "{{ lookup('env', 'OS_TENANT_NAME') }}" username: "{{ lookup('env', 'OS_USERNAME') }}" password: "{{ lookup('env', 'OS_PASSWORD') }}" spec: host_prefix: "{{ lookup('pipe', 'hostname | cut -b 1-9') }}" flavor_ram: 1024 flavor_name: "standard.xsmall" image_name: "centos-base" key_name: "default" secgroups: "default" tasks: - name: ansible_python_interpreter setup set_fact: ansible_python_interpreter="{{ lookup('pipe', 'which python') }}" - name: get uuid for generate hostname command: /usr/bin/uuidgen register: result_uuid - name: creating server nova_compute: state: present auth_url: "{{ auth.url }}" region_name: "{{ auth.region_name }}" login_tenant_name: "{{ auth.tenant_name }}" login_username: "{{ auth.username }}" login_password: "{{ auth.password }}" flavor_ram: "{{ spec.flavor_ram }}" flavor_include: "{{ spec.flavor_name }}" image_name: "{{ spec.image_name }}" key_name: "{{ spec.key_name }}" name: "{{ spec.host_prefix }}-{{ result_uuid.stdout }}" security_groups: "{{ spec.secgroups }}" insecure: True ---------ここまで---------
仮想マシンを起動するたびに、ansible_hostsファイルを変更するのは面倒です。そこで、Ansibleのもつ強力な機能であるダイナミックインベントリを利用して動的にインベントリファイルを生成します。
ダイナミックインベントリは、文字通り動的にインベントリファイルを生成するプログラムです。OpenStackを利用する場合は、novaのAPIから操作対象とする仮想マシンのリストを取得します。
コマンド実行の様子:
---------ここから--------- (venv)# wget -O inventory.py http://goo.gl/v6K6lX (venv)# chmod +x inventory.py (venv)# wget -O inventory.ini http://goo.gl/PIRgk9 ---------ここまで---------
inventory.iniファイルのhostname_prefixを自身の環境にあわせてstudentNN-testに修正):
---------ここから--------- [test] hostname_prefix = student11-test ---------ここまで---------
実際にダイナミックインベントリを利用してみます。pingモジュールを利用して、[test]グループの各仮想マシンをAnsibleから操作可能であることを確認します。 create_vm.yml を何度実行した後でも、操作対象となる仮想マシンの増加に動的に追随できます。
コマンド実行の様子:
---------ここから--------- (venv)# cd $HOME (venv)# ansible test -i inventory.py -m ping -u root --private-key default.pem 10.0.0.4 | success >> { "changed": false, "ping": "pong" } 10.0.0.1 | success >> { "changed": false, "ping": "pong" } ---------ここまで---------
ここまで構築した環境を利用して、仮想マシン群にパッケージをインストールするオペレーションを実施してみます。 パッケージをインストールするPlaybook(sample.yml)を作成します。非常に単純な構造です。
sample.yml:
---------ここから--------- --- - hosts: test vars: packages: - httpd - jq - mysql-server - zsh tasks: - yum: name={{ item }} state=latest with_items: packages ---------ここまで---------
実際にPlaybook( sample.yml )を実行してみます。Playbookに記載したパッケージ(httpd,jq,mysql-server,zsh)がインストールされます。
コマンド実行の様子:
---------ここから--------- (venv)# ansible-playbook -i inventory.py -u root --private-key default.pem sample.yml PLAY [test] ******************************************************************* GATHERING FACTS *************************************************************** ok: [10.0.0.4] ok: [10.0.0.1] TASK: [yum name={{ item }} state=latest] ************************************** changed: [10.0.0.4] => (item=httpd,jq,mysql-server,zsh) changed: [10.0.0.1] => (item=httpd,jq,mysql-server,zsh) PLAY RECAP ******************************************************************** 10.0.0.1 : ok=2 changed=1 unreachable=0 failed=0 10.0.0.4 : ok=2 changed=1 unreachable=0 failed=0 ---------ここまで---------
起動した仮想マシンをすべて削除します。
下記のように、操作用仮想マシンからログアウトして、仮想マシンを削除するスクリプトを実行します。
注意) 99_cleanup.sh を実行するホストが osdt-lounge-console-vm.novalocal であることを事前に確認してください。
コマンド実行の様子:
---------ここから--------- [root@student11-step-server ~]# logout Connection to 118.67.96.82 closed. $ hostname osdt-lounge-console-vm.novalocal $ cd /opt/support/t2-c2/ && ./99_cleanup.sh Deleting student11-step-server Deallocating da778dd3-db98-4477-ae25-dc6fcebaf86d... Deleted floatingip: da778dd3-db98-4477-ae25-dc6fcebaf86d ---------ここまで---------
Table of Contents | t |
---|---|
Exposé | ESC |
Full screen slides | e |
Presenter View | p |
Source Files | s |
Slide Numbers | n |
Toggle screen blanking | b |
Show/hide slide context | c |
Notes | 2 |
Help | h |