#ansible #ansible-2.x #makefile
#ansible #ansible-2.x #makefile
Вопрос:
Я новичок в Makefile. Вот моя ФАЛЬШИВАЯ цель для ansible в Makefile
.PHONY: healthcheck-webproxy
healthcheck-webproxy:
ansible-playbook -i inventory.py -e "env=dev" -e "group=webproxy" -e "command='curl -k
-s https://localhost:${nginx_https_port}/healthcheck'" site.yaml --
limit=vm4node.lite.com -bv
Когда я запускаю make healthcheck-webproxy
, он пропускает ${nginx_https_port}
я получаю нижеприведенный ansible adhoc
$make healthcheck-webproxy
ansible-playbook -i inventory.py -e "env=dev" -e "group=webproxy" -e "command='curl -k -s https://localhost:/healthcheck'" limit=vm4node.lite.com -bv
не мог бы кто-нибудь, пожалуйста, помочь мне с этим. Я не хочу, чтобы makefile пропускал ${nginx_https_port}
Любая помощь будет высоко оценена.
Я хотел бы добавить код сюда.
- hosts: "{{ env }}"
gather_facts: false
become: true
become_method: sudo
tasks:
- name: Check HealthService
shell: docker exec {{ container_name }} sh -c {{ command | quote }}
В командной оболочке это должно выполняться таким образом.
#docker exec webproxy sh -c ‘curl -k -s https://localhost :${nginx_https_port}/ проверка работоспособности’
Комментарии:
1.
nginx_https_port
Случайно ли предполагается, что это переменная окружения ? Правило в том виде, в каком оно написано, попытается интерпретировать его какmake
переменную. Вы можете исправить это, удвоив$
, чтобы избежать его вmake
. В качестве альтернативы вы можете указать для него значение (какmake
переменную) либо в makefile, либо вmake
командной строке.2. @JohnBollinger Если бы это была переменная окружения, она была бы импортирована в GNU make как переменная make, так что это сработало бы.
3. Make не «пропускает» эту переменную: он расширяет эту переменную, и эта переменная не имеет значения, поэтому она расширяется до пустой строки, как вы видите. Вам нужно присвоить этой переменной какое-то значение. Где это должно быть установлено? Есть ли где-нибудь еще в вашем makefile, который должен это устанавливать? Предполагается ли, что это должно быть установлено в командной строке (
make nginx_https_port=8888
)? Вам придется предоставить больше информации, прежде чем мы сможем помочь, потому что приведенная выше часть makefile не сообщает нам.4. да, это переменная env.
5. да, это переменная env. Я не определяю переменную .. она должна брать ее из указанного контейнера. я пробовал с localhost: $$ {nginx_https_port}/ проверка работоспособности и localhost: $($ {nginx_https_port}) / оба они не работают.
Ответ №1:
Вам нужно экранировать $
в makefile. Превратитесь ${nginx_https_port}
в ${nginx_https_port}
.
Строка в вашем makefile является:
"command='curl -k -s https://localhost:${nginx_https_port}/healthcheck'"
Поскольку это строка, заключенная в двойные кавычки, происходит подстановка / расширение переменной. Поэтому ${nginx_https_port}
расширяется в makefile на хосте, на котором выполняется makefile. Чтобы предотвратить это, вам нужно экранировать $, поэтому строка загружается в ansible как есть.
В строках, заключенных в одинарные кавычки (например, ‘echo $ hello’), замена / расширение переменных не происходит, что также является причиной того, что docker exec (выполняемый в командной строке) работает для вас:
docker exec webproxy sh -c 'curl -k -s https://localhost:${nginx_https_port}/healthcheck'
Здесь строка curl -k -s https://localhost:${nginx_https_port}/healthcheck'
передается как есть в sh внутри контейнера docker, где затем она выполняется без каких-либо кавычек, и переменная может быть расширена.