针对之前写的一个 ansible bug https://blog.newtouch.com/ansible-2-3-0-0-bug-in-complex-network/ ,我今天给项目里相关的 role 加了个 meta/main.yml 文件,内容是:

---
dependencies:
  - role: build.CheckEnv

roles/build.CheckEnv/tasks/main.yml 内容:
- name: Checking hostname
  command: hostname
  register: hostname
  failed_when: hostname.stdout != inventory_hostname

由于我之前使用 ansible 把机器的 hostname 按照 hosts 文件里的定义名称统一改好了,所以就可以在执行相关 roles 之前,先执行 checkEnv 这个 role。如果 hostname 和 {{ inventory_hostname }} 不一致,直接视为执行失败,避免在错误的机器上执行操作。

你也可以简化一下,前提是你的 ansible-playbook 默认是会 gather_facts

- name: Checking hostname
  command: hostname
  failed_when: ansible_hostname != inventory_hostname
修改 hostname 的 playbook 内容:
- name: Temporary set hostname as localhost
  hostname:
    name: localhost

- name: Set hostname as "{{ inventory_hostname }}"
  hostname:
    name: "{{ inventory_hostname }}"