У меня есть некоторые проблемы с Ansible и способом, которым он принимает значение по умолчанию к значениям. То, что я пытаюсь выполнить, должно связать контейнер Докера с на eth1, если он существует, иначе используйте lo.
Мой начальный подход должен был использовать принимающие значение по умолчанию неопределенные переменные следующим образом:
shell: docker run -d -p {{ ansible_eth1.ipv4.address | default(127.0.0.1) }}:27017:27017 [...] dockerfile/mongodb
К сожалению, Ansible бросил следующую ошибку.
fatal: [server] => One or more undefined variables: 'ansible_eth1' is undefined
Я также попробовал версии этого, такие как:
shell: docker run -d -p {{ ansible_eth1.ipv4.address | ansible_lo.ipv4.address }}:27017:27017 [...] dockerfile/mongodb
Это дало мне другую ошибку:
failed: [server] => {"changed": true, "cmd": "docker run -d -p {# ansible_eth1.ipv4.address | ansible_lo.ipv4.address #}:27017:27017 [...]", "delta": "0:00:00.021053", "end": "2014-11-01 17:22:04.457375", "rc": 127, "start": "2014-11-01 17:22:04.436322"}
stderr: /bin/sh: 1: ansible_lo.ipv4.address: not found
2014/11/01 17:22:04 Invalid containerPort: {{
Затем я пытался использовать when
и 'не определяется' условие вместо этого. Это - меньше DRY, поскольку мне нужны две строки файла конфигурации затем.
- name: Start Mongo on loopback
shell: docker run -d -p {{ ansible_lo.ipv4.address }}:27017:27017 [...] dockerfile/mongodb
when: ansible_eth1.ipv4.address is not defined
Это дало мне следующую ошибку:
error while evaluating conditional: ansible_eth1.ipv4.address is not defined
Какие-либо эксперты Ansible там, которые могут указать на меня в правильном направлении?
О, и я выполняю тонну Ansible 1.7.2.
Проблема с этим:
ansible_eth1.ipv4.address | default(127.0.0.1)
В том, что если ansible_eth1
не является определенной переменной, то ansible_eth1.ipv4.address
(или даже ansible_eth1.ipv4
) работать не будет. Решение состоит в том, чтобы применить фильтр по умолчанию
к переменной, которой может не быть, а именно ansible_eth1
:
(ansible_eth1 | default(ansible_lo)).ipv4.address
Также обратите внимание, что лучше использовать команду
вместо оболочки
, если вам не нужна какая-либо функция оболочки, например канал или перенаправление:
command: docker run -d -p {{ (ansible_eth1 | default(ansible_lo)).ipv4.address }}:27017:27017 [...] dockerfile/mongodb
Наконец, обратите внимание, что Ansible имеет модуль докера , поэтому вы можете использовать его напрямую здесь.
docker: "ports={{ (ansible_eth1 | default(ansible_lo)).ipv4.address }}:27017:27017 ..."