ansible 跳过的虚假目标 $

Phony-Targets for ansible skips $

我是 Makefile 的新手。这是我在 Makefile

中针对 ansible 的 PHONY 目标
.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 }}

在Shell应该这样执行。

#docker exec webproxy sh -c 'curl -k -s https://localhost:${nginx_https_port}/healthcheck'

您需要转义 makefile 中的 $。把 ${nginx_https_port} 变成 ${nginx_https_port}.

您的 makefile 中的字符串是:

"command='curl -k -s https://localhost:${nginx_https_port}/healthcheck'"

因为它是一个用双引号括起来的字符串,所以变量 substitution/expansion 发生了。所以 ${nginx_https_port} 在 makefile 中展开,在 makefile 运行的主机上。为防止这种情况,您需要对 $ 进行转义,以便将字符串加载到 ansible as-is.

在单引号字符串中(例如 'echo $hello')没有变量 substitution/expansion 发生,这也是 docker exec(在 shell 上执行)对你有用的原因:

docker exec webproxy sh -c 'curl -k -s https://localhost:${nginx_https_port}/healthcheck'

此处字符串curl -k -s https://localhost:${nginx_https_port}/healthcheck'被as-is赋给docker容器内的sh,然后在没有任何引号的情况下执行,并且可以扩展变量。