gpt4 book ai didi

azure - 在ansible中构建复杂字符串的正确方法

转载 作者:行者123 更新时间:2023-12-03 01:38:15 26 4
gpt4 key购买 nike

在ansible中构建复杂字符串的正确方法是什么?

给出命令模块中 az cli 的示例:

---
- name: >
LISTDELETED {{ DATABASE_LISTDELETED_DATABASE }} databases
FROM {{ DATABASE_LISTDELETED_SQLSERVER }} sqlserver
command: >
az sql db list-deleted
--resource-group "{{ DATABASE_LISTDELETED_RESOURCEGROUP }}"
--server "{{ DATABASE_LISTDELETED_SQLSERVER }}"
--query "{{ DATABASE_LISTDELETED_QUERY | default('[*]') }}"
--output json
register: DATABASE_LISTDELETED_RESULT
  • 它需要处理缺失的参数,例如如果查询缺失,则省略 --query 参数。
  • 我想提前构建字符串,以便可以轻松调试构建的结果。
  • 首选解决方案位于同一任务中,并且易于阅读。

编辑:基于@Zeitounator gist我最终得到了这个。

---
- name: >
LISTDELETED {{ DATABASE_LISTDELETED_DATABASE }} databases
FROM {{ DATABASE_LISTDELETED_SQLSERVER }} sqlserver
vars:
listdelted_command: >
az sql db list-deleted
--resource-group "{{ DATABASE_LISTDELETED_RESOURCEGROUP }}"
--server "{{ DATABASE_LISTDELETED_SQLSERVER }}"
{% if DATABASE_LISTDELETED_QUERY is defined %}
--query "{{ DATABASE_LISTDELETED_QUERY }}"
{% endif %}
command: "{{ listdelted_command }}"
register: DATABASE_LISTDELETED_RESULT

最佳答案

要求 2 和 3 是互斥的:您可以在任务中提前(例如,在执行 ansible 模块之前)构建一个 var,但它仅适用于此任务(请参阅我的救援任务中的说明)示例如下)。

default 您使用的过滤器将允许您处理特定未设置变量的默认值。如果您想省略更复杂的字符串,则必须用 if 将其括起来。 jinja2表达式使用相关测试。

这就是我在您的情况下尝试的方法(未完全测试,因为我没有安装 az,因此没有可运行的数据库/查询)

- name: Store my command in a var
set_fact:
my_command: >-
az sql db list-deleted
--resource-group "{{ DATABASE_LISTDELETED_RESOURCEGROUP }}"
--server "{{ DATABASE_LISTDELETED_SQLSERVER }}"
{% if DATABASE_LISTDELETED_QUERY is defined %}
--query "{{ DATABASE_LISTDELETED_QUERY }}"
{% if %}
--output json

- block:
- name: >
LISTDELETED {{ DATABASE_LISTDELETED_DATABASE }} databases
FROM {{ DATABASE_LISTDELETED_SQLSERVER }} sqlserver
command: "{{ my_command }}"
register: DATABASE_LISTDELETED_RESULT
rescue:
- name: debug failed az command
var:
msg: |
There as been an error running the following command:
{{ my_command }}
The reported error was:
{{ DATABASE_LISTDELETED_RESULT.stderr }}
debug:
msg: "{{ msg.split('\n') }}"

注释:

  • set_fact 会将提到的变量存储为当前主机的事实。然后,您可以在其他任务中为同一主机重复使用此变量。
  • 我用了 block rescue 来说明条件调试。根据您的需要进行修改。
  • - yaml 折叠 block 上的标志是 strip chomping indicator确保为了可读性而引入的代码中的新行不会干扰构造的命令。
  • msg.split('\n')在调试任务中,只需将多行消息字符串转换为列表,以便于屏幕阅读。
  • 如果你的变量 DATABASE_LISTDELETED_QUERY可以设置为空字符串,并且您还想处理这种情况以跳过 --query参数,可以将测试改为DATABASE_LISTDELETED_QUERY | default() | length > 0

关于azure - 在ansible中构建复杂字符串的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56233684/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com