2016-08-24 2 views
2

Я пытаюсь настроить один набор хостов [nodes] используя факты с другого набора хостов [etcd]. Вот мои хосты файлИспользование фактов из одной группы хостов для настройки другой группы хостов с помощью Ansible

 
[master] 
kubernetes ansible_ssh_host=10.2.23.108 

[nodes] 
n1 ansible_ssh_host=10.2.23.192 
n2 ansible_ssh_host=10.2.23.47 

[etcd] 
etcd01 ansible_ssh_host=10.2.23.11 
etcd02 ansible_ssh_host=10.2.23.10 
etcd03 ansible_ssh_host=10.2.23.9 

Обратите внимание, что группа [etcd] не цель предоставления - [узлы] есть. Но предоставление ресурсов [nodes] требует информации о фактах [etcd].

Вот мой сборник пьес:

 
--- 
- name: Configure common 
    hosts: nodes 
    sudo: True 
    tasks: 
    - name: etcd endpoints 
     file: dest=/etc/kubernetes state=directory 

    - name: etcd endpoints 
     template: src=files/k.j2 dest=/etc/kubernetes/apiserver 

Наконец, вот шаблон для файлов/k.j2

 
KUBE_ETCD_SERVERS="--etcd_servers="{% for host in groups['etcd'] %}https://{{hostvars[host]['ansible_eth0']["ipv4"]["address"]}}:2380{% if not loop.last %},{% endif %}{% endfor %}" 

Цель состоит в том, чтобы произвести значение KUBE_ETCD_SERVERS, которое выглядит как

 
--etcd_servers=https://10.2.23.11:2380,https://10.2.23.10:2380,https://10.2.23.10:2380 

Когда я запускаю эту пьесу, я получаю консольный выход

 
TASK [etcd endpoints] ********************************************************** 
fatal: [n1]: FAILED! => {"changed": false, "failed": true, "msg": "AnsibleUndefinedVariable: 'dict object' has no attribute 'ansible_eth0'"} 
fatal: [n2]: FAILED! => {"changed": false, "failed": true, "msg": "AnsibleUndefinedVariable: 'dict object' has no attribute 'ansible_eth0'"} 

Что такое идиоматический способ, способный сделать факты и т. Д. Доступными для узла?

+1

Вы можете запустить модуль 'setup' против одного из серверов и вставить выходные данные. Может быть, у него нет 'ansible_eth0' –

+0

Возможно, нет' eth0' на etcd. Или, однажды, я стал такой же ошибкой при смене iptables на firewalld (некоторые зависящие пакеты были удалены как «неиспользуемые») –

+0

Спасибо. Вот установочный модуль работает на сервере etcd: https://gist.github.com/ae6rt/44f2567e287dd502e714b811bcd0ba92. eth0 действительно существует. – ae6rt

ответ

3

Если вы хотите использовать факты какого-либо хоста, вы должны сначала их собрать.
Запуск setup Задача на [etcd] хостов для заполнения hostvars.

--- 
- name: Gather etcd facts 
    hosts: etcd 
    tasks: 
    - setup: 

- name: Configure common 
    hosts: nodes 
    sudo: True 
    tasks: 
    - name: etcd endpoints 
     file: dest=/etc/kubernetes state=directory 

    - name: etcd endpoints 
     template: src=files/k.j2 dest=/etc/kubernetes/apiserver 
+0

Работал отлично. Большое вам спасибо. – ae6rt

+0

Последующий вопрос: когда я перебираю группу хостов и т. Д., Я хочу иметь возможность использовать имя сервера etcd в шаблоне, поскольку это имя появляется в файле инвентаризации. То есть, в шаблоне, как я могу ссылаться на серверы таким образом, чтобы я мог обрабатывать возвращаемые значения «etcd01», «etcd02» и «etcd03»? – ae6rt

+0

Я только что понял это, и это очевидно: для этого выражения мне нужно иметь в самом значении * host *: {% для хоста в группах ['etcd']%} https: // {{host} }: 2379 {% if not loop.last%}, {% endif%} {% endfor%} – ae6rt

Смежные вопросы