Пропуски поддельных целей для ansible $

#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, где затем она выполняется без каких-либо кавычек, и переменная может быть расширена.