在执行ansible-playbook期间重新获取Facts的方法是什么?

简介 jiè)

最近把docker-engine从1.8.3升级到1.9.0后,发现应用程序全部无法运行。经过调查,发现网络接口docker0的IP地址已从172.17.42.1更改为172.17.0.1,并且需要将配置文件中直接写明的172.17.42.1的部分全部替换掉。(真是要好好看看发行说明啊。)

起初,我说过只需要将ansible-playbook中指定的172.17.42.1替换为ansible_docker0.ipv4.address就可以了,很简单对吧?然而,使用ansible-playbook时无法获取到ansible_docker0.ipv4.address的值,出现了错误,陷入了困境。

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

综上所述,由于完全失败了,我将以反省之心记录下方法。

为什么你迷上了它?

在使用ansible-playbook安装docker-engine之后,ansible的Facts没有更新,无法获取新增的docker0信息。

重新获取Facts的方法

提前先说结论,在设置中可以搞定。
通常情况下,在冒号后面要写一堆东西,但好像不需要做那样的事。

安装docker-engine后,重新获取facts。

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

事实?

ansible-playbook执行后出现的那个东西。

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

我正在做的是获取目标主机的硬件信息等等。
可以使用以下的Ansible命令来确认获取的内容。

获取所有组中所有主机的主机信息

$ ansible -i hosts all -m setup

公式在这里。
Ansible >> 文档 >> 变量

验证动作

我们正在GCE的虚拟机上进行动作验证。
– 操作系统:Debian Wheezy(3.16.7-ckt11-1+deb8u4~bpo70+1)
– 机器类型:n1-standard-1

評估操作手冊

在这个playbook中,为了简化操作,我们假设已经完成了安装docker-engine的前期准备工作。简化的步骤是在Debian系统上进行安装,具体操作是为你的Debian操作系统添加一个条目。

- 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之前

在安装docker-engine之前,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已安装并且在操作系统上实际启动了docker0接口,
但在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"
        }
    }
}
广告
将在 10 秒后关闭
bannerAds