可以在YAML文件中使用抽象吗?

可以在YAML文件中使用抽象吗?,yaml,abstraction,Yaml,Abstraction,是否可以使用参数或抽象来最小化YAML文件中的重复代码 我正在编写一个触发部署的YAML文件,在部署之前和之后,我希望调用一个空闲通道,指示部署正在开始、完成,以及部署失败的情况 这是我写的,但感觉太冗长了: example_deploy: - call: notify in: msgText: "Deployment starting for environment *${environment}*" - try: - ${oneops.envi

是否可以使用
参数
抽象
最小化YAML文件中的重复代码

我正在编写一个触发部署的YAML文件,在部署之前和之后,我希望调用一个空闲通道,指示部署正在开始、完成,以及部署失败的情况

这是我写的,但感觉太冗长了

example_deploy:
    - call: notify
    in:
      msgText: "Deployment starting for environment *${environment}*"
    - try:
      - ${oneops.environmentCommitAndDeploy(environment = 'production', platform = '${platform}', deployAllPlatforms = false )}
      error:
    - log: "Error trying to deploy: ${lastError.cause}"
    - call: notify
      in:
        msgText: " :fire: Deployment failed for environment *${environment}* http://concord.com/#/process/${txId}/log"
    - exit
  - call: notify
    in:
      msgText: " :party: Deployment succeeded for environment *${environment}* http://concord.com/#/process/${txId}/log"
现在,如果我想让
example\u deploy\u 2
做同样的事情,我需要重写所有的代码吗?或者有没有一种方法可以让“函数”或抽象YAML的重复部分

更新 我曾使用
call
来抽象对slack的调用,但现在我想知道是否可以对slack进行一般调用并动态更新消息-因为现在我正在重复传递给定义为
call
ed的代码块的参数

示例

  example_deploy:
    - call: slack_start_deploy
    - try:
      - ${transitionVariableUpdate(platform = '${platform}', environment = '${environment}', component = '${component_ear}' variables = { appVersion = '${BRANCH_NAME}-${BUILD_NUMBER}' })}
      - ${environmentCommitAndDeploy(environment = 'qa', platform = '${platform}', deployAllPlatforms = false )}
      error:
    - log: "Error trying to deploy: ${lastError.cause}"
    - call: slack_deploy_error
    - exit
  - call: slack_deploy_success

  slack_start_deploy:
  - slack.postMessage:
      text: "${entryPoint} Deployment starting for environment *${environment}*"
      channelId: ${alerts}
      username: ${slackname}
      iconEmoji: ${slackEmojiConcord}

  slack_deploy_error:
  - slack.postMessage:
      text: " :fire: ${entryPoint} Deployment failed for environment *${environment}* http://concord.com/#/process/${txId}/log"
      channelId: ${alerts}
      username: ${slackname}
      iconEmoji: ${slackEmojiConcord}

  slack_deploy_success:
  - slack.postMessage:
      text: " :party: Deployment succeeded for environment *${environment}* http://concord.com/#/process/${txId}/log"
      channelId: ${alerts}
      username: ${slackname}
      iconEmoji: ${slackEmojiConcord}

YAML规范中唯一允许 尽量减少重复就是使用 在一个节点上 使用别名引用该节点。这适用于两个叶节点 (即任何类型的标量值)和集合节点 (映射、序列)。锚定集合的别名 “替换”集合下的整个子树


除此之外,还有
您的示例无效YAML
错误:
是一个与前面的序列项缩进相同的映射项,
-call:
是一个与
exampel\u deplay:
键缩进相同的序列项。你不能把这样的收藏混合在一起YAML@anthon别告诉我细节了,我对大局感兴趣。
  example_deploy:
    - call: slack_start_deploy
    - try:
      - ${transitionVariableUpdate(platform = '${platform}', environment = '${environment}', component = '${component_ear}' variables = { appVersion = '${BRANCH_NAME}-${BUILD_NUMBER}' })}
      - ${environmentCommitAndDeploy(environment = 'qa', platform = '${platform}', deployAllPlatforms = false )}
      error:
    - log: "Error trying to deploy: ${lastError.cause}"
    - call: slack_deploy_error
    - exit
  - call: slack_deploy_success

  slack_start_deploy:
  - slack.postMessage:
      text: "${entryPoint} Deployment starting for environment *${environment}*"
      channelId: ${alerts}
      username: ${slackname}
      iconEmoji: ${slackEmojiConcord}

  slack_deploy_error:
  - slack.postMessage:
      text: " :fire: ${entryPoint} Deployment failed for environment *${environment}* http://concord.com/#/process/${txId}/log"
      channelId: ${alerts}
      username: ${slackname}
      iconEmoji: ${slackEmojiConcord}

  slack_deploy_success:
  - slack.postMessage:
      text: " :party: Deployment succeeded for environment *${environment}* http://concord.com/#/process/${txId}/log"
      channelId: ${alerts}
      username: ${slackname}
      iconEmoji: ${slackEmojiConcord}
example_deploy:
  - call: slack_start_deploy
  - try:
    - ${transitionVariableUpdate(platform = '${platform}', environment = '${environment}', component = '${component_ear}' variables = { appVersion = '${BRANCH_NAME}-${BUILD_NUMBER}' })}
    - ${environmentCommitAndDeploy(environment = 'qa', platform = '${platform}', deployAllPlatforms = false )}
error:
  - log: "Error trying to deploy: ${lastError.cause}"
  - call: slack_deploy_error
  - exit
  - call: slack_deploy_success

slack_start_deploy:
- slack.postMessage: &pm
    text: "${entryPoint} Deployment starting for environment *${environment}*"
    channelId: ${alerts}
    username: ${slackname}
    iconEmoji: ${slackEmojiConcord}

slack_deploy_error:
- slack.postMessage:
    text: " :fire: ${entryPoint} Deployment failed for environment *${environment}* http://concord.com/#/process/${txId}/log"
    <<: *pm

slack_deploy_success:
- slack.postMessage:
    text: " :party: Deployment succeeded for environment *${environment}* http://concord.com/#/process/${txId}/log"
    <<: *pm
import sys
from pathlib import Path
import ruamel.yaml

example = Path('example.yaml')

yaml = ruamel.yaml.YAML(typ='safe')
yaml.default_flow_style = False
data = yaml.load(example)
yaml.dump(data, sys.stdout)
error:
- log: 'Error trying to deploy: ${lastError.cause}'
- call: slack_deploy_error
- exit
- call: slack_deploy_success
example_deploy:
- call: slack_start_deploy
- try:
  - ${transitionVariableUpdate(platform = '${platform}', environment = '${environment}',
    component = '${component_ear}' variables = { appVersion = '${BRANCH_NAME}-${BUILD_NUMBER}'
    })}
  - ${environmentCommitAndDeploy(environment = 'qa', platform = '${platform}', deployAllPlatforms
    = false )}
slack_deploy_error:
- slack.postMessage:
    channelId: ${alerts}
    iconEmoji: ${slackEmojiConcord}
    text: ' :fire: ${entryPoint} Deployment failed for environment *${environment}*
      http://concord.com/#/process/${txId}/log'
    username: ${slackname}
slack_deploy_success:
- slack.postMessage:
    channelId: ${alerts}
    iconEmoji: ${slackEmojiConcord}
    text: ' :party: Deployment succeeded for environment *${environment}* http://concord.com/#/process/${txId}/log'
    username: ${slackname}
slack_start_deploy:
- slack.postMessage:
    channelId: ${alerts}
    iconEmoji: ${slackEmojiConcord}
    text: ${entryPoint} Deployment starting for environment *${environment}*
    username: ${slackname}