我的问题:Inline $(eval…)先求值,然后"IF"是评估。我对SSM目标的期望是"IF条件首先求值,然后才是$(eval…)
➜ make staging ssm TARGET=i-0d334b9e3f763bfeb
if test "i-0d334b9e3f763bfeb" == "" ; then
echo "OK";
echo "✔ Selected desired nodegroup staging-grafana-v1";
echo "✔ Selected desired instgance-id i-07cef18e93c64c795";
aws ssm start-session --target i-07cef18e93c64c795;
else
echo "✔ Selected desired instgance-id i-0d334b9e3f763bfeb";
aws ssm start-session --target i-0d334b9e3f763bfeb;
fi
✔ Selected desired instgance-id i-0d334b9e3f763bfeb
Starting session with SessionId: master-admin-06c7c2b63ca2554c4
sh-4.2$
得到"fzf"如果TARGET为非空,则应该跳过IF顶部块中的相关功能。
也就是:
- 如果目标是不是
- 如果TARGET被定义,那么我首先得到两个fzf接口用于模糊搜索,然后才执行ELSE块的步骤。
.PHONY: all
.DEFAULT_GOAL := help
# ----------------------------------------------------------------------------
# Local Variables
#
# ============================================================================
help:
@grep -E '^[.0-9a-zA-Z_-]+:.*?## .*$$' Makefile | awk 'BEGIN {FS = ":.*?## "}; {printf "⚡ 33[34m%-15s 33[0m %sn", $$1, $$2}'
staging: ## setup staging env (use: make staging plan)
@echo -n
$(eval export ENVIRONMENT=staging)
prod: ## setup prod env (use: make prod plan)
@echo -n
$(eval export ENVIRONMENT=prod)
.ONESHELL:
ssm: ## start ssm sessione
if test "$(TARGET)" == "" ; then
echo "OK";
$(eval NG = $(shell aws ec2 describe-instances
--filter Name=tag:Name,Values=$(ENVIRONMENT)*
--query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[] | [0]]'
--output text
| fzf))
$(eval INSTANCE_ID = $(shell aws ec2 describe-instances
--filter Name=tag:Name,Values=${NG}
--query 'Reservations[].Instances[].{id: InstanceId}'
--output text
| fzf))
echo "✔ Selected desired nodegroup ${NG}";
echo "✔ Selected desired instgance-id ${INSTANCE_ID}";
aws ssm start-session --target ${INSTANCE_ID};
else
echo "✔ Selected desired instgance-id ${TARGET}";
aws ssm start-session --target ${TARGET};
fi
不要将Make语法与配方中的shell命令混淆。是的,Make在将命令传递给shell之前扩展了$(eval ...
函数,甚至在决定是否运行ssm
规则之前。
解决方案很简单;这里似乎没有任何理由使用eval
。NG
和INSTANCE_ID
变量可以是shell变量,而不是Make变量。
ssm: ## start ssm sessione
if test "$(TARGET)" == "" ; then
echo "OK";
NG=`aws ec2 describe-instances
--filter Name=tag:Name,Values=$(ENVIRONMENT)*
--query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[] | [0]]'
--output text
| fzf`;
INSTANCE_ID=`aws ec2 describe-instances
--filter Name=tag:Name,Values=$$NG
--query 'Reservations[].Instances[].{id: InstanceId}'
--output text
| fzf`;
echo "✔ Selected desired nodegroup $$NG";
echo "✔ Selected desired instgance-id $$INSTANCE_ID";
aws ssm start-session --target $$INSTANCE_ID;
else
echo "✔ Selected desired instgance-id ${TARGET}";
aws ssm start-session --target ${TARGET};
fi
(注:如果您打算稍后在其他规则中使用这些变量,那么分配值的if-then-else
应该在规则之外,并使用Make语法编写。