PROGRAMMING
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来进行选择哪些组件的聚合,下面是全量的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
--- downMode: git project: - name: offline-packages url: https://git.xxx.com/PaaS/offline-packages.git branch: autoupdate-git item: - name: yks url: https://git.xxx.com/PaaS/paas-installer.git branch: develop item: - name: middleware url: https://git.xxx.com/PaaS/middleware.git branch: develop item: - redis - nginx - elasticsearch - kafka - kibana - license-server - minio |
通过流水线传参,生成以分号为分隔符的参数,来自定义生成config_custom.yaml:
1 2 3 4 5 6 7 8 9 10 11 12 |
# 生成聚合用的config.yml if [ "$middleware_names" != "all" ]; then middleware_pattern="middleware|$(echo ${middleware_names} |sed 's/;/\|/g')" # 只保留选择的大类,如'yks, middleware, offline-packages' yq 'del(.project[] | select(.name | test("'$middleware_pattern'")|not))' config.yml > ./config_custom_tmp.yml # 再次筛选, 只保留middleware大类下的小类,如'redis, nginx' yq 'del(.project[].item.[] | select(. |test("'$middleware_pattern'")|not) )' config_custom_tmp.yml > ./config_custom.yml config_file=config_custom.yml rm -rf config_custom_tmp.yml else config_file=config.yml fi |
解析: 由于yq的contains不支持多个匹配,所以在这里用到了test来测试是否包含以‘|’分隔的多个字符 del的用法: 用del删除之前,先要能查询打印出需要删除的部分,才能进一步使用del删除,如: 如果选择了只生成middleware和paas-installer, 则先查出不包含middleware和paas-installer的部分:
1 2 3 4 5 |
[root@jenkins1-iuap-hb2-ali offline-packages]# cat config.yml |yq '.project[]| select(.name | test("middleware|yks")|not)' name: offline-packages url: https://git.xxx.com/paas/offline-packages.git branch: develop item: |
然后调用del删除:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[root@jenkins1 offline-packages]# cat config.yml |yq 'del(.project[]| select(.name | test("middleware|yks")|not))' --- downMode: git project: - name: paas url: https://git.xxx.com/PaaS/paas-installer.git branch: develop item: - name: middleware url: https://git.xxx.com/PaaS/middleware.git branch: develop item: - redis - nginx - elasticsearch - kafka - kibana - license-server - minio |
如果只选择了paas,nginx和redis,则需再次筛选, 只保留middleware大类下的小类,如’redis, nginx’:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[root@jenkins1 offline-packages]# yq 'del(.project[].item.[] | select(. |test("redis|nginx")|not) )' config_custom_tmp.yml --- downMode: git project: - name: yks url: https://git.xxx.com/PaaS/paas-installer.git branch: develop item: [] - name: middleware url: https://git.xxx.com/PaaS/middleware.git branch: develop item: - 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”}’) 最后生成的格式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
os: kylin version: v10-sp3 package: - name: - telnet - curl - wget - name: - docker-ce-20.10.17 - docker-ce-cli-20.10.17 - containerd.io-1.6.28 arch: amd64 repo: - https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo - http://mirrors.aliyun.com/repo/Centos-7.repo replace: - item: repo from: $releasever to: "7" - name: - docker-ce-20.10.17 - docker-ce-cli-20.10.17 - containerd.io-1.6.28 arch: arm64 repo: - https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo - http://mirrors.aliyun.com/repo/Centos-altarch-7.repo replace: - item: repo from: $releasever to: "7" file: - name: cni-plugins arch: amd64 src: http://bucket.oss-cn-beijing.aliyuncs.com/download/nexus2/raw-apis/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz dest: raw-apis/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz |
需要再次通过yq来进行提取过滤: 提取不需要配repo的以及带arch=amd64/x86_64或不带key为arch的列表: Read more…