Skip to content

列表生成器

List 生成器根据任意键/值对列表生成参数(只要值是字符串值即可)。 在本例中,我们的目标是名为 engineering-dev 的本地集群:

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: guestbook
  namespace: argocd
spec:
  goTemplate: true
  goTemplateOptions: ["missingkey=error"]
  generators:
  - list:
      elements:
      - cluster: engineering-dev
        url: https://kubernetes.default.svc
      - cluster: engineering-prod
        url: https://kubernetes.default.svc
  template:
    metadata:
      name: '{{.cluster}}-guestbook'
    spec:
      project: "my-project"
      source:
        repoURL: https://github.com/argoproj/argo-cd.git
        targetRevision: HEAD
        path: applicationset/examples/list-generator/guestbook/{{.cluster}}
      destination:
        server: '{{.url}}'
        namespace: guestbook

完整示例见 此处

在本例中,List 生成器会将 urlcluster 字段作为参数传递到模板中。 如果我们想添加第二个环境,可以取消对第二个元素的注释,ApplicationSet 控制器就会自动将其作为已定义应用程序的目标。

在 ApplicationSet v0.1.0 发布时,人们只能_指定url集群元素字段(加上任意)。 从 ApplicationSet v0.2.0 开始,支持任何键/值元素对(这也完全向后兼容 v0.1.0 表单):

spec:
  generators:
  - list:
      elements:
        # v0.1.0 form - requires cluster/url keys:
        - cluster: engineering-dev
          url: https://kubernetes.default.svc
          values:
            additional: value
        # v0.2.0+ form - does not require cluster/URL keys
        # (but they are still supported).
        - staging: "true"
          gitRepo: https://kubernetes.default.svc   
# (...)

注意 "集群必须在 Argo CD 中预定义",这些集群_必须_已经在 Argo CD 中定义,以便为这些 Values 生成应用程序。 ApplicationSet 控制器不会在 Argo CD 中创建集群(例如,它没有这样做的凭证)。

动态生成元素

列表生成器还可以根据从上一个生成器(如 git)获取的 yaml/json 动态生成元素,方法是将两者与矩阵生成器结合使用。 在本例中,我们将矩阵生成器与 git 结合使用,然后再与列表生成器结合使用,并将 git 中的文件内容作为输入传递给列表生成器的 elementsYaml 字段:

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: elementsYaml
  namespace: argocd
spec:
  goTemplate: true
  goTemplateOptions: ["missingkey=error"]
  generators:
  - matrix:
      generators:
      - git:
          repoURL: https://github.com/argoproj/argo-cd.git
          revision: HEAD
          files:
          - path: applicationset/examples/list-generator/list-elementsYaml-example.yaml
      - list:
          elementsYaml: "{{ .key.components | toJson }}"
  template:
    metadata:
      name: '{{.name}}'
    spec:
      project: default
      syncPolicy:
        automated:
          selfHeal: true    
        syncOptions:
        - CreateNamespace=true        
      sources:
        - chart: '{{.chart}}'
          repoURL: '{{.repoUrl}}'
          targetRevision: '{{.version}}'
          helm:
            releaseName: '{{.releaseName}}'
      destination:
        server: https://kubernetes.default.svc
        namespace: '{{.namespace}}'

list-elementsYaml-example.yaml "内容:

key:
  components:
    - name: component1
      chart: podinfo
      version: "6.3.2"
      releaseName: component1
      repoUrl: "https://stefanprodan.github.io/podinfo"
      namespace: component1
    - name: component2
      chart: podinfo
      version: "6.3.3"
      releaseName: component2
      repoUrl: "ghcr.io/stefanprodan/charts"
      namespace: component2