何が出来るの?

Ansible 1.7 より 外部インベントリ(Dynamic Inventory)に SoftLayerのプラグインがCommitされていました。外部インベントリとして利用できるため Ansible の hosts を記載しなくても動的に SoftLayerの管理ポータル上からサーバのリスト等が取得できるはずです。どのような感じで利用できるのか試してみます。

準備

古いバージョンの場合には Ansible 1.7 にアップデートします。今回はUbuntu上の環境でpipで過去のバージョンを導入している場合です。

1
$ sudo pip install ansible --upgrade

不勉強なので分かっていないですが pip で入れると pluginが入らないので(何かどこかに入るのかもしれませんが)自分でダウンロードしておきます。

1
2
3
4
$ git clone https://github.com/ansible/ansible.git
$ cd ansible/plugins/inventory
$ ls -l softlayer.py
-rwxrwxr-x 1 vagrant vagrant 6112 Aug  8 03:03 softlayer.py

また、SoftLayer CLIが利用可能になっている必要があるので導入をしておきます。

1
2
$ sudo pip install softlayer
$ sl config setup

SoftLayerの管理ポータルから、USER名、APIキーを控えておきセットアップします。slコマンドが利用できるようになっている必要があります。

プラグインの実行

プラグインを単体で実行してみます。

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
$ ./softlayer.py --list
{
  "_meta": {
    "hostvars": {
      "119.81.131.10": {
        "datacenter": {
          "id": 352494,
          "longName": "Hong Kong 2",
          "name": "hkg02"
        },
        "domain": "niandc.co.jp",
        "fullyQualifiedDomainName": "kensyu05.niandc.co.jp",
        "globalIdentifier": "461a86f4-3e4f-4b78-90df-9207d2337ee4",
        "hostname": "kensyu05",
        "id": 5509848,
        "maxCpu": 1,
        "maxMemory": 1024,
        "powerState": {
          "keyName": "RUNNING",
          "name": "Running"
        },
        "primaryBackendIpAddress": "10.x.x.x",
        "primaryIpAddress": "119.81.x.x",
        "status": {
          "keyName": "ACTIVE",
          "name": "Active"
        }
      },

という形でホストの情報が出てくるとともに以下のグルーピングでもJSONが返ってきています。

  • cpu_“数”
  • datacenter_“DC名”
  • “HOSTNAME”
  • “HOSTNAME”.”DOMAINNAME”>
  • hardware
  • virtual
  • memory_“サイズ”
  • “DOMAINNAME”

などです。これらはいずれも

1
2
3
4
5
6
 "datacenter_sng01": [
    "119.81.xx.x",
    "119.81.xx.x",
    "119.81.xx.x",
    "119.81.xx.x"
  ],

のような形でIPアドレスが応答されます。

使ってみる

先ほどのJSON形式が渡されるためどうもIPアドレスで sshの設定が必要になりそうです。したがって ~/.ssh/confg内にてIPアドレスでログイン出来るように設定しておきます。パスワードありで接続する場合、-kまたは--ask-pass --ask-sudo-passなどを引数につけます。

1
2
3
4
5
6
ansible -i `pwd`/softlayer.py docker02 -u root -m ping -k
SSH password:
119.81.x.x | success >> {
    "changed": false,
    "ping": "pong"
}

このようにPingが実行できました。同様に alldatacenter_hkg02 等の括りで制御する事が出来ます。

Tips

常にこの softlayer.py を指定するには

  • softlayer.py を /etc/ansible/hostsに上書き
  • 環境変数ANSIBLE_HOSTSに softlayer.py を指定

の2通りの方法があります。

まとめ

台数が多くなると便利な Ansible の External Inventory ですが、SoftLayerのプラグインが出ていることでより簡単に利用することが出来るように成りました。 データセンター単位やドメイン単位で変更が発生する際などは特に便利そうですね。