Rackspace Cloud ガイド¶
はじめに¶
Note
本ガイドの本セクションは作成中です。Rackspace モジュールと、そのモジュールがどのように連携するかについて、サンプルをさらに追加している最中です。 完了したら、ansible-examples に Rackspace Cloud のサンプルが含まれます。
Ansible には、Rackspace Cloud と対話するためのコアモジュールが多数含まれています。
このセクションは、Ansibleモジュールを組み合わせ (およびインベントリースクリプトを使用し) て、 Rackspace Cloud コンテキストで Ansible を使用する方法を説明することを目的としています。
rax モジュールを使用する前提条件は最小限です。 Ansible 自体に加えて、 すべてのモジュールは pyrax 1.5 以上を必要とし、テストされています。 この Python モジュールは、実行ホストにインストールする必要があります。
pyrax
は、現在、多くのオペレーティングシステムパッケージリポジトリーで利用できないため、
pip を使用してインストールする必要がある可能性があります。
$ pip install pyrax
Ansible は、ansible-playbook
およびその他の CLI ツールと同じコンテキストで実行される暗黙的なローカルホストを作成します。
なんらかの理由で、またはインベントリーに保存する必要がある場合や保存したい場合には、以下のような作業を行う必要があります。
[localhost]
localhost ansible_connection=local ansible_python_interpreter=/usr/local/bin/python2
詳細は「暗黙的なローカルホスト」を参照してください。
Playbook ステップでは、通常、以下のパターンを使用します。
- hosts: localhost
gather_facts:False
tasks:
認証情報ファイル¶
rax.py インベントリースクリプトと、すべての rax モジュールは、以下のような標準の pyrax 認証情報ファイルに対応します。
[rackspace_cloud]
username = myraxusername
api_key = d41d8cd98f00b204e9800998ecf8427e
環境パラメーター RAX_CREDS_FILE
をこのファイルのパスに設定すると、
Ansible は、この情報を読み込む方法を見つけるのに役に立ちます。
この認証情報ファイルに関する詳細情報は、 https://github.com/pycontribs/pyrax/blob/master/docs/getting_started.md#authenticating を参照してください。
Python 仮想環境からの実行 (オプション)¶
ほとんどのユーザーは virtualenv を使用しませんが、一部のユーザー、特に Python の開発者はそれを使用する場合があります。
Ansible が Python virtualenv にインストールされる場合には、デフォルトのグローバルスコープでのインストールではなく、特別な考慮事項があります。Ansible は、特に指示がない限り、python バイナリーが /usr/bin/python にあることを前提としています。 これは、モジュールのインタープリターの行を使用して行われますが、インベントリー変数「ansible_python_interpreter」を設定して指示すると、Ansible は Python の検索の代わりに、この指定されたパスを使用します。 これは、「localhost」で実行しているモジュール、または「local_action」で実行されるモジュールが virtualenv Python インタープリターを使用していると仮定するため、混乱が生じる可能性があります。 この行をインベントリーに設定すると、モジュールは virtualenv インタープリターで実行され、virtualenv パッケージ (具体的には pyrax) が利用できるようになります。virtualenv を使用している場合は、以下のように、この場所が検出されるように、localhost インベントリー定義を変更します。
[localhost]
localhost ansible_connection=local ansible_python_interpreter=/path/to/ansible_venv/bin/python
Note
pyrax は、グローバルの Python パッケージスコープまたは仮想環境にインストールできます。 pyrax をインストールする際には、特別な留意事項はありません。
プロビジョニング¶
「rax」モジュールは、Rackspace Cloud 内でインスタンスをプロビジョニングする機能を提供します。 通常、プロビジョニングタスクは、Rackspace cloud API に対して Ansible コントロールサーバー (この例ではローカルホスト) から実行されます。 これにはいくつかの理由があります。
- リモートノードに pyrax ライブラリーをインストールしないようにする
- 認証情報を暗号化してリモートノードに配布する必要はない
- スピードと単純化
Note
Rackspace 関連のモジュールを使用した認証は、 ユーザー名と API キーを環境変数として指定するか、 モジュールの引数として渡すか、 認証情報ファイルの場所を指定することで処理されます。
以下は、アドホックモードでのインスタンスをプロビジョニングする基本的な例です。
$ ansible localhost -m rax -a "name=awx flavor=4 image=ubuntu-1204-lts-precise-pangolin wait=yes"
以下は、パラメーターが変数に定義されていると仮定した場合の、Playbook で表示される内容です。
tasks:
- name: Provision a set of instances
rax:
name: "{{ rax_name }}"
flavor: "{{ rax_flavor }}"
image: "{{ rax_image }}"
count: "{{ rax_count }}"
group: "{{ group }}"
wait: yes
register: rax
delegate_to: localhost
rax モジュールは、IP アドレス、ホスト名、ログインパスワードなど、作成するノードのデータを返します。 ステップの戻り値を登録すると、このデータを使用して、作成されるホストをインベントリー (通常はメモリー内) に動的に追加できます。これにより、後続のタスクによるホストでの設定アクションの実行が容易になります。 以下の例では、上記のタスクを使用して正常に作成されたサーバーは「raxhosts」というグループに動的に追加され、各ノードのホスト名、IP アドレス、および root パスワードがインベントリーに追加されます。
- name: Add the instances we created (by public IP) to the group 'raxhosts'
add_host:
hostname: "{{ item.name }}"
ansible_host: "{{ item.rax_accessipv4 }}"
ansible_password: "{{ item.rax_adminpass }}"
groups: raxhosts
loop: "{{ rax.success }}"
when: rax.action == 'create'
これでホストグループが作成され、この Playbook の次のプレイで raxhosts グループに属するサーバーを設定できるようになりました。
- name:Configuration play
hosts: raxhosts
user: root
roles:
- ntp
- webserver
上記の方法は、ホストの設定と、プロビジョニング手順を関連付けます。 これは常に必要なことではなく、 次のセクションに進みます。
ホストインベントリー¶
ノードが起動したら、おそらく再度通信するようにしたいでしょう。 これを処理する最善の方法は、「rax」インベントリープラグインを使用することです。これは、Rackspace Cloud に動的にクエリーを実行し、管理する必要があるノードを Ansible に通知します。 これは、別のツール (Rackspace Cloud ユーザーインターフェースなど) を介してクラウドインスタンスを起動している場合であっても使用することができます。インベントリープラグインは、リソースをメタデータ、リージョン、OS などでまとめるのに使用できます。 メタデータの使用は「rax」で強く推奨され、ホストグループとロールとの間で簡単に並べ替えることができます。動的インベントリースクリプト rax.py
を使用しない場合は、INI インベントリーファイルを手動で管理することもできますが、これは推奨されていません。
Ansible では、INI ファイルデータとともに複数の動的インベントリープラグインを使用できます。 単にそれらを共通のディレクトリーに配置し、スクリプトが chmod +x で、INI ベースのディレクトリーではないことを確認します。
rax.py¶
Rackspace 動的インベントリースクリプトを使用するには、rax.py
をインベントリーディレクトリーにコピーして、実行可能にします。RAX_CREDS_FILE
環境変数を使用して、rax.py
の認証情報ファイルを指定できます。
Note
動的インベントリースクリプト (rax.py
など) は、Ansible がグローバルにインストールされている場合は、/usr/share/ansible/inventory
に保存されます。 virtualenv にインストールされている場合、インベントリースクリプトは $VIRTUALENV/share/inventory
にインストールされます。
Note
Red Hat Ansible Tower のユーザーは、Tower が動的インベントリーをネイティブにサポートしており、グループを Rackspace Cloud 認証情報に関連付けるだけで、このステップを実行せずに簡単に同期できます。
$ RAX_CREDS_FILE=~/.raxpub ansible all -i rax.py -m setup
rax.py
は、個別のリージョンまたはコンマ区切りのリージョン一覧を指定できる RAX_REGION
環境変数も受け入れます。
rax.py
を使用する場合は、インベントリーに「localhost」を定義しません。
前述のように、ほとんどのモジュールはホストループの外部で実行されることが多く、「localhost」を定義する必要があります。 これを行うには、inventory
ディレクトリーを作成し、rax.py
スクリプトと、localhost
を含むファイルの両方をそのディレクトリーに置くことが推奨されます。
ansible
または ansible-playbook
を実行し、個々のファイルの代わりに、inventory
ディレクトリーを指定すると、
Ansible がそのディレクトリー内の各ファイルをインベントリー用に評価します。
インベントリースクリプトをテストし、Rackspace Cloud と通信できるかどうかを確認します。
$ RAX_CREDS_FILE=~/.raxpub ansible all -i inventory/ -m setup
適切に設定されていると仮定すると、rax.py
インベントリースクリプトは、以下のような情報を出力します。
これは、インベントリーおよび変数に使用されます。
{
"ORD": [
"test"
],
"_meta": {
"hostvars": {
"test": {
"ansible_host": "198.51.100.1",
"rax_accessipv4": "198.51.100.1",
"rax_accessipv6": "2001:DB8::2342",
"rax_addresses": {
"private": [
{
"addr": "192.0.2.2",
"version": 4
}
],
"public": [
{
"addr": "198.51.100.1",
"version": 4
},
{
"addr": "2001:DB8::2342",
"version": 6
}
]
},
"rax_config_drive": "",
"rax_created": "2013-11-14T20:48:22Z",
"rax_flavor": {
"id": "performance1-1",
"links": [
{
"href": "https://ord.servers.api.rackspacecloud.com/111111/flavors/performance1-1",
"rel": "bookmark"
}
]
},
"rax_hostid": "e7b6961a9bd943ee82b13816426f1563bfda6846aad84d52af45a4904660cde0",
"rax_human_id": "test",
"rax_id": "099a447b-a644-471f-87b9-a7f580eb0c2a",
"rax_image": {
"id": "b211c7bf-b5b4-4ede-a8de-a4368750c653",
"links": [
{
"href": "https://ord.servers.api.rackspacecloud.com/111111/images/b211c7bf-b5b4-4ede-a8de-a4368750c653",
"rel": "bookmark"
}
]
},
"rax_key_name": null,
"rax_links": [
{
"href": "https://ord.servers.api.rackspacecloud.com/v2/111111/servers/099a447b-a644-471f-87b9-a7f580eb0c2a",
"rel": "self"
},
{
"href": "https://ord.servers.api.rackspacecloud.com/111111/servers/099a447b-a644-471f-87b9-a7f580eb0c2a",
"rel": "bookmark"
}
],
"rax_metadata": {
"foo": "bar"
},
"rax_name": "test",
"rax_name_attr": "name",
"rax_networks": {
"private": [
"192.0.2.2"
],
"public": [
"198.51.100.1",
"2001:DB8::2342"
]
},
"rax_os-dcf_diskconfig": "AUTO",
"rax_os-ext-sts_power_state": 1,
"rax_os-ext-sts_task_state": null,
"rax_os-ext-sts_vm_state": "active",
"rax_progress": 100,
"rax_status": "ACTIVE",
"rax_tenant_id": "111111",
"rax_updated": "2013-11-14T20:49:27Z",
"rax_user_id": "22222"
}
}
}
}
標準インベントリー¶
(インベントリープラグインではなく) 標準の ini 形式のインベントリーファイルを使用する場合でも、検出可能な hostvar 情報を Rackspace API から取得すると有効な場合があります。
これは、rax_facts
モジュールと、以下のようなインベントリーファイルを使用して実行できます。
[test_servers]
hostname1 rax_region=ORD
hostname2 rax_region=ORD
- name: Gather info about servers
hosts: test_servers
gather_facts: False
tasks:
- name: Get facts about servers
rax_facts:
credentials: ~/.raxpub
name: "{{ inventory_hostname }}"
region: "{{ rax_region }}"
delegate_to: localhost
- name: Map some facts
set_fact:
ansible_host: "{{ rax_accessipv4 }}"
どのように機能するかを知る必要はありませんが、返される変数の種類を把握しておくといいでしょう、
rax_facts
モジュールは、以下のようにファクトを提供します。これは rax.py
インベントリースクリプトに一致します。
{
"ansible_facts": {
"rax_accessipv4": "198.51.100.1",
"rax_accessipv6": "2001:DB8::2342",
"rax_addresses": {
"private": [
{
"addr": "192.0.2.2",
"version": 4
}
],
"public": [
{
"addr": "198.51.100.1",
"version": 4
},
{
"addr": "2001:DB8::2342",
"version": 6
}
]
},
"rax_config_drive": "",
"rax_created": "2013-11-14T20:48:22Z",
"rax_flavor": {
"id": "performance1-1",
"links": [
{
"href": "https://ord.servers.api.rackspacecloud.com/111111/flavors/performance1-1",
"rel": "bookmark"
}
]
},
"rax_hostid": "e7b6961a9bd943ee82b13816426f1563bfda6846aad84d52af45a4904660cde0",
"rax_human_id": "test",
"rax_id": "099a447b-a644-471f-87b9-a7f580eb0c2a",
"rax_image": {
"id": "b211c7bf-b5b4-4ede-a8de-a4368750c653",
"links": [
{
"href": "https://ord.servers.api.rackspacecloud.com/111111/images/b211c7bf-b5b4-4ede-a8de-a4368750c653",
"rel": "bookmark"
}
]
},
"rax_key_name": null,
"rax_links": [
{
"href": "https://ord.servers.api.rackspacecloud.com/v2/111111/servers/099a447b-a644-471f-87b9-a7f580eb0c2a",
"rel": "self"
},
{
"href": "https://ord.servers.api.rackspacecloud.com/111111/servers/099a447b-a644-471f-87b9-a7f580eb0c2a",
"rel": "bookmark"
}
],
"rax_metadata": {
"foo": "bar"
},
"rax_name": "test",
"rax_name_attr": "name",
"rax_networks": {
"private": [
"192.0.2.2"
],
"public": [
"198.51.100.1",
"2001:DB8::2342"
]
},
"rax_os-dcf_diskconfig": "AUTO",
"rax_os-ext-sts_power_state": 1,
"rax_os-ext-sts_task_state": null,
"rax_os-ext-sts_vm_state": "active",
"rax_progress": 100,
"rax_status": "ACTIVE",
"rax_tenant_id": "111111",
"rax_updated": "2013-11-14T20:49:27Z",
"rax_user_id": "22222"
},
"changed": false
}
ユースケース¶
本セクションでは、特定のユースケースを中心とした、その他の使用例を説明します。
ネットワークおよびサーバー¶
分離したクラウドネットワークを作成し、サーバーを構築します。
- name: Build Servers on an Isolated Network
hosts: localhost
gather_facts: False
tasks:
- name: Network create request
rax_network:
credentials: ~/.raxpub
label: my-net
cidr: 192.168.3.0/24
region: IAD
state: present
delegate_to: localhost
- name: Server create request
rax:
credentials: ~/.raxpub
name: web%04d.example.org
flavor: 2
image: ubuntu-1204-lts-precise-pangolin
disk_config: manual
networks:
- public
- my-net
region: IAD
state: present
count: 5
exact_count: yes
group: web
wait: yes
wait_timeout: 360
register: rax
delegate_to: localhost
完全な環境¶
サーバー、カスタムネットワーク、およびロードバランサーで完全な Web サーバー環境を構築し、nginx をインストールしてカスタムの index.html を作成します。
---
- name: Build environment
hosts: localhost
gather_facts: False
tasks:
- name: Load Balancer create request
rax_clb:
credentials: ~/.raxpub
name: my-lb
port: 80
protocol: HTTP
algorithm: ROUND_ROBIN
type: PUBLIC
timeout: 30
region: IAD
wait: yes
state: present
meta:
app: my-cool-app
register: clb
- name: Network create request
rax_network:
credentials: ~/.raxpub
label: my-net
cidr: 192.168.3.0/24
state: present
region: IAD
register: network
- name: Server create request
rax:
credentials: ~/.raxpub
name: web%04d.example.org
flavor: performance1-1
image: ubuntu-1204-lts-precise-pangolin
disk_config: manual
networks:
- public
- private
- my-net
region: IAD
state: present
count: 5
exact_count: yes
group: web
wait: yes
register: rax
- name: Add servers to web host group
add_host:
hostname: "{{ item.name }}"
ansible_host: "{{ item.rax_accessipv4 }}"
ansible_password: "{{ item.rax_adminpass }}"
ansible_user: root
groups: web
loop: "{{ rax.success }}"
when: rax.action == 'create'
- name: Add servers to Load balancer
rax_clb_nodes:
credentials: ~/.raxpub
load_balancer_id: "{{ clb.balancer.id }}"
address: "{{ item.rax_networks.private|first }}"
port: 80
condition: enabled
type: primary
wait: yes
region: IAD
loop: "{{ rax.success }}"
when: rax.action == 'create'
- name: Configure servers
hosts: web
handlers:
- name: restart nginx
service: name=nginx state=restarted
tasks:
- name: Install nginx
apt: pkg=nginx state=latest update_cache=yes cache_valid_time=86400
notify:
- restart nginx
- name: Ensure nginx starts on boot
service: name=nginx state=started enabled=yes
- name: Create custom index.html
copy: content="{{ inventory_hostname }}" dest=/usr/share/nginx/www/index.html
owner=root group=root mode=0644
RackConnect および Managed Cloud¶
RackConnect バージョン 2 または Rackspace Managed Cloud を使用する場合は、正常に構築された後に作成するサーバーで実行される Rackspace の自動化タスクがあります。その自動化が「RackConnect」または「Managed Cloud」の自動化前に実行される場合は、障害が発生し、サーバーが利用できなくなる場合があります。
これらの例は、サーバーを作成し、Ansible が続行する前に、Rackspace 自動化が完了したことを確認します。
分かりやすくするために、この例は結合されていますが、どちらも RackConnect を使用する場合に限り必要です。 Managed Cloud のみを使用する場合は、RackConnect の部分が無視されます。
RackConnect の部分は、RackConnect バージョン 2 にのみ適用されます。
コントロールマシンの使用¶
- name: Create an exact count of servers
hosts: localhost
gather_facts: False
tasks:
- name: Server build requests
rax:
credentials: ~/.raxpub
name: web%03d.example.org
flavor: performance1-1
image: ubuntu-1204-lts-precise-pangolin
disk_config: manual
region: DFW
state: present
count: 1
exact_count: yes
group: web
wait: yes
register: rax
- name: Add servers to in memory groups
add_host:
hostname: "{{ item.name }}"
ansible_host: "{{ item.rax_accessipv4 }}"
ansible_password: "{{ item.rax_adminpass }}"
ansible_user: root
rax_id: "{{ item.rax_id }}"
groups: web,new_web
loop: "{{ rax.success }}"
when: rax.action == 'create'
- name: Wait for rackconnect and managed cloud automation to complete
hosts: new_web
gather_facts: false
tasks:
- name: ensure we run all tasks from localhost
delegate_to: localhost
block:
- name: Wait for rackconnnect automation to complete
rax_facts:
credentials: ~/.raxpub
id: "{{ rax_id }}"
region: DFW
register: rax_facts
until: rax_facts.ansible_facts['rax_metadata']['rackconnect_automation_status']|default('') == 'DEPLOYED'
retries: 30
delay: 10
- name: Wait for managed cloud automation to complete
rax_facts:
credentials: ~/.raxpub
id: "{{ rax_id }}"
region: DFW
register: rax_facts
until: rax_facts.ansible_facts['rax_metadata']['rax_service_level_automation']|default('') == 'Complete'
retries: 30
delay: 10
- name: Update new_web hosts with IP that RackConnect assigns
hosts: new_web
gather_facts: false
tasks:
- name: Get facts about servers
rax_facts:
name: "{{ inventory_hostname }}"
region: DFW
delegate_to: localhost
- name: Map some facts
set_fact:
ansible_host: "{{ rax_accessipv4 }}"
- name: Base Configure Servers
hosts: web
roles:
- role: users
- role: openssh
opensshd_PermitRootLogin: "no"
- role: ntp
Ansible Pull の使用¶
---
- name: Ensure Rackconnect and Managed Cloud Automation is complete
hosts: all
tasks:
- name: ensure we run all tasks from localhost
delegate_to: localhost
block:
- name: Check for completed bootstrap
stat:
path: /etc/bootstrap_complete
register: bootstrap
- name: Get region
command: xenstore-read vm-data/provider_data/region
register: rax_region
when: bootstrap.stat.exists != True
- name: Wait for rackconnect automation to complete
uri:
url: "https://{{ rax_region.stdout|trim }}.api.rackconnect.rackspace.com/v1/automation_status?format=json"
return_content: yes
register: automation_status
when: bootstrap.stat.exists != True
until: automation_status['automation_status']|default('') == 'DEPLOYED'
retries: 30
delay: 10
- name: Wait for managed cloud automation to complete
wait_for:
path: /tmp/rs_managed_cloud_automation_complete
delay: 10
when: bootstrap.stat.exists != True
- name: Set bootstrap completed
file:
path: /etc/bootstrap_complete
state: touch
owner: root
group: root
mode: 0400
- name: Base Configure Servers
hosts: all
roles:
- role: users
- role: openssh
opensshd_PermitRootLogin: "no"
- role: ntp
XenStore での Ansible Pull の使用¶
---
- name: Ensure Rackconnect and Managed Cloud Automation is complete
hosts: all
tasks:
- name: Check for completed bootstrap
stat:
path: /etc/bootstrap_complete
register: bootstrap
- name: Wait for rackconnect_automation_status xenstore key to exist
command: xenstore-exists vm-data/user-metadata/rackconnect_automation_status
register: rcas_exists
when: bootstrap.stat.exists != True
failed_when: rcas_exists.rc|int > 1
until: rcas_exists.rc|int == 0
retries: 30
delay: 10
- name: Wait for rackconnect automation to complete
command: xenstore-read vm-data/user-metadata/rackconnect_automation_status
register: rcas
when: bootstrap.stat.exists != True
until: rcas.stdout|replace('"', '') == 'DEPLOYED'
retries: 30
delay: 10
- name: Wait for rax_service_level_automation xenstore key to exist
command: xenstore-exists vm-data/user-metadata/rax_service_level_automation
register: rsla_exists
when: bootstrap.stat.exists != True
failed_when: rsla_exists.rc|int > 1
until: rsla_exists.rc|int == 0
retries: 30
delay: 10
- name: Wait for managed cloud automation to complete
command: xenstore-read vm-data/user-metadata/rackconnect_automation_status
register: rsla
when: bootstrap.stat.exists != True
until: rsla.stdout|replace('"', '') == 'DEPLOYED'
retries: 30
delay: 10
- name: Set bootstrap completed
file:
path: /etc/bootstrap_complete
state: touch
owner: root
group: root
mode: 0400
- name: Base Configure Servers
hosts: all
roles:
- role: users
- role: openssh
opensshd_PermitRootLogin: "no"
- role: ntp
高度な使用方法¶
Tower を使用した自動スケーリング¶
Red Hat Ansible Tower には、自動スケーリングのユースケースに使用する非常に優れた機能も含まれています。 このモードでは、簡単な curl スクリプトは定義された URL を呼び出すことができ、サーバーはリクエスターに「ダイヤルアウト」し、 起動しているインスタンスを構成します。 これは、一時ノードを再設定する優れた方法です。 詳細は Tower のドキュメントを参照してください。
プルモードの Tower でコールバックを使用する利点は、ジョブの結果が依然として中央に記録されることです。 また、リモートホストと共有する情報も少なくなります。
Rackspace Cloud のオーケストレーション¶
Ansible は強力なオーケストレーションツールであり、rax モジュールを使用すると複雑なタスク、デプロイメント、および設定のオーケストレーションが可能になります。 ここでは、環境内にあるソフトウェアの他の部分と同様に、インフラストラクチャーのプロビジョニングを自動化することが重要になります。 複雑なデプロイメントでは、以前ロードバランサーの手動操作またはサーバーの手動プロビジョニングが必要になる場合があります。 Ansible に含まれる rax モジュールを利用することで、現在実行中のノードの数に応じてノードを追加したり、共通のメタデータを持つノードの数に応じてクラスターアプリケーションを構成できます。 たとえば、以下のようなシナリオを自動化できます。
- Cloud Load Balancer から 1 つずつ削除され、更新され、検証され、ロードバランサープールに返されるサーバー
- ノードのプロビジョニング、ブートストラップ、設定、およびソフトウェアがインストールされている、すでにオンライン環境の拡張
- ノードが非推奨になる前に、アプリケーションログファイルが中央の場所 (Cloud Files など) にアップロードされる手順
- DNS レコードが作成時に作成され、廃止時に破棄されるサーバーとロードバランサー