在执行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"
}
}
}