ansible如何从另一个角色加载变量,而不执行它?
我的任务是创建一个一次性的清理剧本,该剧本使用角色中的变量,但我不需要执行该角色。有没有一种方法可以提供一个角色名来获取它的默认值和变量,而不必硬编码到它的路径?我还希望使用组变量或主机变量中定义的变量,其优先级高于角色中包含的变量 示例任务:ansible如何从另一个角色加载变量,而不执行它?,ansible,Ansible,我的任务是创建一个一次性的清理剧本,该剧本使用角色中的变量,但我不需要执行该角色。有没有一种方法可以提供一个角色名来获取它的默认值和变量,而不必硬编码到它的路径?我还希望使用组变量或主机变量中定义的变量,其优先级高于角色中包含的变量 示例任务: -名称:停止卡夫卡和zookeeper服务(如果存在) 服务: 名称:“{{item}}” 状态:停止 有以下项目: -“{{kafka_service_name}” -“{{zookeeper_service_name}}” 忽略错误:true 其中
-名称:停止卡夫卡和zookeeper服务(如果存在)
服务:
名称:“{{item}}”
状态:停止
有以下项目:
-“{{kafka_service_name}”
-“{{zookeeper_service_name}}”
忽略错误:true
其中
kafka\u service\u name
和zookeeper\u service\u name
包含在rolekafka
中,但也可能存在于组变量中。我提出了一个相当粗糙的解决方案,如下所示:
-名称:保存旧主机\u变量
设定事实:
旧的主机变量:“{{hostvars[inventory\u hostname]}”
-名称:加载kafka角色变量
包括以下变量:
目录:“{item.root}/{{item.path}”
变量:
参数:
文件夹:
-卡夫卡
路径:“{{['roles']+查找('config','DEFAULT_roles_PATH')}”
与_filetree一起:“{{lookup('first_found',params)}”
当:item.state=='directory'和item.path位于['defaults','vars']
-名称:停止卡夫卡和动物园管理员服务(如果存在)
服务:
名称:“{{item}}”
状态:停止
有以下项目:
-“{old_host_vars['kafka_service_name']|默认值(kafka_service_name)}”
-“{old_host_vars['zookeeper_service_name'];默认值(zookeeper_service_name)}”
include_vars任务在./roles和默认角色位置中查找第一个kafka
role文件夹,然后按照正确的顺序包括目录defaults和vars中的文件
我不得不保存旧的hostvars,因为include\u vars
的优先级高于除额外vars之外的任何变量,并且只有在旧的hostvars没有返回任何内容时才使用included var
如果您不需要加载组变量,那么include变量在一个任务中工作得非常好,而且看起来更好
UPD:这是我用来用old\u host\u vars
hack替换vars的regexp。
这是在vscode搜索/替换中测试的,但可以针对任何其他编辑器进行调整
搜索以卡夫卡开头的变量:
\{(卡夫卡*)\}
替换为:
<代码> {{OdjHoosivAvs[’$ 1’〕缺省值(1美元)} < /COD> < /P>请考虑编辑您的答案以使用YAML的语法高亮标记block@mdaniel,很好,我不习惯SO最终使用语法高亮显示的事实