Ответ на этот вопрос немного сложен, потому что вы еще не опубликовали полный репродуктор. Это означает, что этот вопрос может быть немного странным, потому что я должен был сделать некоторые предположения о том, что вы делаете.
Если я попытаюсь воспроизвести вашу проблему с помощью следующего примера playbook, он работает без ошибок:
---
- hosts: localhost
gather_facts: false
vars:
office1:
web01:
myip: 10.10.10.10
peer: 10.10.10.20
web02:
myip: 10.10.10.20
peer: 10.10.10.10
office2:
web01:
myip: 10.20.20.30
peer: 10.20.20.40
web02:
myip: 10.20.20.40
peer: 10.20.20.30
trimd_hostname: web01
ansible_hostname: debn-web01
ansible_eth0:
ipv4:
address: 1.2.3.4
tasks:
- copy:
dest: ./output.txt
content: |
{% set trimd_hostname = ansible_hostname.split("-")[1] %}
host_name: {{ ansible_hostname }}
web01 host_ip: {{ ansible_eth0.ipv4.address }}
host_peer: {{ office1[trimd_hostname].peer }}
, который производит следующее в output.txt
:
host_name: debn-web01
web01 host_ip: 1.2.3.4
host_peer: 10.10.10.20
Я уже указал на опечатку в вашем вопросе, но трудно сказать, является ли это фактической ошибкой или это была просто ошибка копирования / вставки, когда вы писали вопрос.
Я хотел бы предложить другой способ организации ваших данных. Избавьтесь от переменных office1
и office2
и вместо этого используйте ansible host_vars для хранения информации.
То есть создайте host_vars/dbn-web01.yml
со следующим содержимым:
myip: 10.10.10.10
peer: 10.10.10.20
И аналогично для других хостов. Тогда ваш шаблон станет просто:
host_name: {{ ansible_hostname }}
web01 host_ip: {{ ansible_eth0.ipv4.address }}
host_peer: {{ peer }}
Значение переменной peer
будет любым, подходящим для конкретного хоста, на котором выполняется задача.