yq用法

yq介绍 在开始使用yq之前,我们首先需要安装它。当你在谷歌上搜索yq时,你会发现两个项目/存储库。 首先,在https://github.com/kislyuk/yq是jq(JSON处理器)的包装器。如果你已经熟悉jq,你可能想抓住这个,使用你已经知道的语法。 不过,在本文中,我们将使用https://github.com/mikefarah/yq 这个版本,这个版本没有100%匹配jq语法,但它的优点是它没有依赖性(不依赖于jq),有关差异的更多上下文,请参阅下面的GitHub问题。 https://github.com/mikefarah/yq/issues/193 mikefarah版本的yq的具体用法参见文档:https://mikefarah.gitbook.io/yq/ 工作实践 业务需求 由于公司产品需要部署在无网环境,所以需要制作适配各个组件的离线安装源,包括rpm/apt之类的系统相关软件包,以及各个二进制/压缩包之类的离线文件,原来是做法是统一将所有的离线源统一整合到一个yml文件当中去,现在的做法是将一个名为packages.yaml的文件放到各个组件的工程里,通过git下载然后进行聚合生成最后的全量列表。 聚合之前,通过生成一个config.yaml来进行选择哪些组件的聚合,下面是全量的配置:

通过流水线传参,生成以分号为分隔符的参数,来自定义生成config_custom.yaml:

解析: 由于yq的contains不支持多个匹配,所以在这里用到了test来测试是否包含以‘|’分隔的多个字符 del的用法: 用del删除之前,先要能查询打印出需要删除的部分,才能进一步使用del删除,如: 如果选择了只生成middleware和paas-installer, 则先查出不包含middleware和paas-installer的部分:

然后调用del删除:

  如果只选择了paas,nginx和redis,则需再次筛选, 只保留middleware大类下的小类,如’redis, nginx’:  

          osInfo=$(awk ‘BEGIN{split(“‘${os_names}’”, arr, “,”);for(key in arr) if(arr[key] ~ “ubuntu”) print arr[key]”:apt”;else print arr[key]”:yum”}’) 最后生成的格式如下:

需要再次通过yq来进行提取过滤: 提取不需要配repo的以及带arch=amd64/x86_64或不带key为arch的列表: Read more…