在ansible中重用模板化变量

在ansible中重用模板化变量,ansible,ansible-2.x,Ansible,Ansible 2.x,我有一组任务,需要一个通用的变量列表。 这种列表的问题在于,它需要对每个任务进行一定的定制。 公共块是docker容器的标签列表(因此它们由traefik发现)。 我可以将标签列表放在剧本的vars部分的一个变量中,但它只会被评估一次,我希望每个任务都使用一组新的变量重新评估它 这是标签列表(ansible格式): 标签: -“traefik.enable=true” -“traefik.backend={{service_name}}” -“traefik.frontend.rule=Host

我有一组任务,需要一个通用的变量列表。 这种列表的问题在于,它需要对每个任务进行一定的定制。 公共块是docker容器的标签列表(因此它们由traefik发现)。 我可以将标签列表放在剧本的
vars
部分的一个变量中,但它只会被评估一次,我希望每个任务都使用一组新的变量重新评估它

这是标签列表(ansible格式):

标签:
-“traefik.enable=true”
-“traefik.backend={{service_name}}”
-“traefik.frontend.rule=Host:${DOMAINNAME};PathPrefixStrip:/{{service_name}”
-“traefik.port={{service_port}}”
-“traefik.docker.network=traefik\u代理”
-“traefik.frontend.headers.SSLRedirect=true”
-“traefik.frontend.headers.STSSeconds=315360000”
-“traefik.frontend.headers.contentTypeNosniff=true”
-“traefik.frontend.headers.STSIncludeSubdomains=true”
所以我想这样使用它:

---
-主机:nas
变量:
traefik_标签:此处列出
任务:
-名称:运行postgres容器
变量:
服务名称:“myService”
服务端口:“8080”
docker_集装箱:
名称:“服务”
图片:“服务:最新”
状态:“已开始”
内存:1G
网络:
-名称:traefik_代理
环境:
POSTGRESQL\u用户:用户名
POSTGRESQL_密码:“密码”
标签:{{traefik_标签}}”

尽管没有文档记录,但您可以使用重新评估模板化变量:

---
-名称:“变量测试”
连接:本地
主机:本地主机
变成:不
变量:
名单:
-“服务名称{{服务名称}”
-“服务端口{{服务端口}”
任务:
-名称:示例任务
变量:
服务名称:“myService”
服务端口:“8080”
调试:
msg:{{lookup('vars','list')}
#您甚至可以在wit_items部分中使用评估列表:
-名称:模板化变量上的项目列表示例
变量:
服务名称:“myService”
服务端口:“服务端口8080”
调试:
msg:“{{item}}”
带_项:“{{lookup('vars','list')}”
输出:

TASK [example task] ***************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "service_name myService",
        "service_port 8080"
    ]
}

TASK [example with items list on a templated var] *********************************************************************************************************************************************************************
ok: [localhost] => (item=service_name myService) => {
    "msg": "service_name myService"
}
ok: [localhost] => (item=service_port service port 8080) => {
    "msg": "service_port service port 8080"
}