LoginSignup
6
3

More than 5 years have passed since last update.

ansible-playbook実行中にFactsを再取得する方法

Last updated at Posted at 2015-11-14

あらまし

先日docker-engineを1.8.3から1.9.0にverupしたところ
アプリケーションが軒並み動かなくなり、調べたところ
Network Interfaceのdocker0
172.17.42.1 から 172.17.0.1に仕様変更されており
設定ファイルに直接172.17.42.1と記載していた部分を
総置き換えすることになった。
(Release noteちゃんと読めよって話ではある。)

最初は
「ansible-playbookで指定している172.17.42.1
ansible_docker0.ipv4.addressに置き換えるだけっしょ?ちょろいっしょ。」
とか言ってたんだけど、ansible-palybookで
ansible_docker0.ipv4.addressの値を取得できずエラーとなり、ハマった。

fatal: [IP_ADDR] => One or more undefined variables: 'ansible_docker0' is undefined

要するに全然ちょろくなかったので、自戒を込めて方法を記載しておく。

なぜハマったのか

ansible-playbookでdocker-engineをinstallした後
ansibleのFactsが更新されておらず
追加されたdocker0の情報が取得できなかった。

Factsの再取得方法

結論を先に書いておくとsetupでOK。
通常:の後に諸々書くのだが、そんなことはしなくていいらしい。

ex) docker-engine install後にFacts再取得。

facts-setup.yml
- hosts: all
  become: true
  tasks:
    - apt: name=docker-engine
    - setup:

Factsって?

ansible-playbook実行後に出てくるアレ。

GATHERING FACTS ***************************************************************
ok: [IP_ADDR]

なにやってるかっていうと、対象HostのHW情報やらなんやら取得している。
取得内容は以下のようなansibleコマンドで確認可能。

ex) inventory hostsall groupsのHost情報を取得

$ ansible -i hosts all -m setup

公式はこちら。
Ansible >> Docs >> Variables

動作検証

GCEのVMで動作検証を実施しています。
- OS:Debian Wheezy (3.16.7-ckt11-1+deb8u4~bpo70+1)
- MachineType:n1-standard-1

評価するplaybook

このplaybookでは簡略化の為
docker-engineをinstallする為の前準備は
済ませているものとしています。
簡略化した手順とは Installation on Debian
Add an entry for your Debian operating system.
までの手順となります。

docker-test.yml
- hosts: all
  become: true
  tasks:
    # ipコマンドでdocker0のinterface情報取得
    # (docker-engine install前)
    - command: bash -c "ip addr show dev docker0"
      register: docker0_info
      changed_when: false
      ignore_errors: true
      always_run: yes
    - debug: var=docker0_info.stdout

    # Install Docker.
    - apt: name=docker-engine=1.9.0-0~wheezy

    # ipコマンドでdocker0のinterface情報取得
    # (docker-engine install後)
    - command: bash -c "ip addr show dev docker0"
      register: docker0_info
      changed_when: false
      ignore_errors: true
      always_run: yes
    - debug: var=docker0_info.stdout

    # Facts再取得前のinterfase情報確認
    - debug: var=ansible_interfaces
    - debug: var=ansible_docker0

    # docker0 interface 起動まで待機
    - wait_for: path=/proc/sys/net/ipv4/conf/docker0 state=present
    # Facts再取得
    - setup:

    # Facts再取得後のinterfase情報確認
    - debug: var=ansible_interfaces
    - debug: var=ansible_docker0

docker-engine Install前

docker-engineのinstall前はdocker0は作成されていないので
情報は取得できない。
(ipコマンドはエラーとなっているが、ignore-errors: trueをつけることにより
playbook終了を回避している。)

TASK: [command bash -c "ip addr show dev docker0"] ****************************
failed: [IP_ADDR] => {"changed": true, "cmd": ["bash", "-c", "ip addr show dev docker0"], "delta": "0:00:00.002841", "end": "2015-11-14 14:59:57.483245", "rc": 1, "start": "2015-11-14 14:59:57.480404", "warnings": []}
stderr: Device "docker0" does not exist.
...ignoring

TASK: [debug var=docker0_info.stdout] *****************************************
ok: [IP_ADDR] => {
    "var": {
        "docker0_info.stdout": ""
    }
}

Factsを再取得してない場合

docker-engineはinstallされて、実際にOS上にはdocker0のIFは起動しているのに
ansible上には情報はない。
このままdocker0.ipv4.addressを取得しようものならplaybookがエラーとなる。

TASK: [debug var=docker0_info.stdout] *****************************************
ok: [IP_ADDR] => {
    "var": {
        "docker0_info.stdout": "3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN \n    link/ether 02:42:29:0c:98:f0 brd ff:ff:ff:ff:ff:ff\n    inet 172.17.0.1/16 scope global docker0\n       valid_lft forever preferred_lft forever"
    }
}

TASK: [debug var=ansible_interfaces] ******************************************
ok: [IP_ADDR] => {
    "var": {
        "ansible_interfaces": [
            "lo",
            "eth0"
        ]
    }
}

TASK: [debug var=ansible_docker0] *********************************************
ok: [IP_ADDR] => {
    "var": {
        "ansible_docker0": "ansible_docker0"
    }
}

Factsを再取得した場合

docker0の情報が確認できる。やったね。

TASK: [setup ] ****************************************************************
ok: [IP_ADDR]

TASK: [debug var=ansible_interfaces] ******************************************
ok: [IP_ADDR] => {
    "var": {
        "ansible_interfaces": [
            "lo",
            "docker0",
            "eth0"
        ]
    }
}

TASK: [debug var=ansible_docker0] *********************************************
ok: [IP_ADDR] => {
    "var": {
        "ansible_docker0": {
            "active": false,
            "device": "docker0",
            "id": "8000.0242290c98f0",
            "interfaces": [],
            "ipv4": {
                "address": "172.17.0.1",
                "netmask": "255.255.0.0",
                "network": "172.17.0.0"
            },
            "macaddress": "02:42:29:0c:98:f0",
            "mtu": 1500,
            "promisc": false,
            "stp": false,
            "type": "bridge"
        }
    }
}
6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3