как передать многострочную строку json в map в рабочих процессах argo

#json #loops #multilinestring #argo-workflows #argo

#json #петли #многострочный #арго-рабочие процессы #арго

Вопрос:

Я работаю над созданием рабочего процесса argo с циклом withParam для переменной карты. На этой карте я хочу использовать многострочную строку json. Есть ли какой-нибудь способ его использовать?

Вот способ, который я использую policy в качестве многострочной строки, но он не работает

 apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata:  generateName: loops-param-arg- spec:  entrypoint: loop-param-arg-example  arguments:  parameters:  - name: os-list  value: |  [  { "image": "debian", "tag": "9.1", "policy": "{  "Version": "2012-10-17",  "Statement": [  {  "Sid": "BucketAdmin",  "Effect": "Allow",  "Principal": "*",  "Action": "s3:*",  "Resource": "*"  }  ]  }" },  { "image": "ubuntu", "tag": "17.10", "policy": "{  "Version": "2012-10-17",  "Statement": [  {  "Sid": "BucketAdmin",  "Effect": "Allow",  "Principal": "*",  "Action": "s3:*",  "Resource": "*"  }  ]  }"}  ]  templates:  - name: loop-param-arg-example  inputs:  parameters:  - name: os-list  steps:  - - name: test-linux  template: cat-os-release  arguments:  parameters:  - name: image  value: "{{item.image}}"  - name: tag  value: "{{item.tag}}"  withParam: "{{inputs.parameters.os-list}}"   - name: cat-os-release  inputs:  parameters:  - name: image  - name: tag  container:  image: "{{inputs.parameters.image}}:{{inputs.parameters.tag}} and policy is {{inputs.parameters.policy}}"  command: [cat]  args: [/etc/os-release]  

Есть ли какой-либо способ в рабочих процессах argo достичь этого? если нет, то каков альтернативный способ сделать это?

Ответ №1:

Есть три проблемы:

  1. Политики не являются допустимыми в формате JSON. Звездочки должны быть заключены в кавычки, так как они являются строками.
     {  "Sid": "BucketAdmin",  "Effect": "Allow", - "Principal": *,   "Principal": "*",  "Action": "s3:*", - "Resource": *   "Resource": "*"  }  
  2. (ОБНОВЛЕНИЕ: на самом деле это изменение не требуется — рабочие процессы Argo правильно обрабатывают объект policy JSON.) Политики должны быть закодированы в виде строк, чтобы их можно было легко передавать в качестве параметров. Например:
     "{"Version":"2012-10-17","Statement":[{"Sid":"BucketAdmin","Effect":"Allow","Principal":"*","Action":"s3:*","Resource":"*"}]}"  
  3. Значение политики должно быть явно передано в качестве параметра шаблону выпуска cat-os.

Окончательный рабочий процесс должен выглядеть следующим образом:

 apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata:  generateName: loops-param-arg- spec:  entrypoint: loop-param-arg-example  arguments:  parameters:  - name: os-list  value: |  [  {  "image": "debian",  "tag": "9.1",  "policy": "{"Version":"2012-10-17","Statement":[{"Sid":"BucketAdmin","Effect":"Allow","Principal":"*","Action":"s3:*","Resource":"*"}]}"  },  {  "image": "ubuntu",  "tag": "17.10",  "policy": "{"Version":"2012-10-17","Statement":[{"Sid":"BucketAdmin","Effect":"Allow","Principal":"*","Action":"s3:*","Resource":"*"}]}"  }  ]  templates:  - name: loop-param-arg-example  inputs:  parameters:  - name: os-list  steps:  - - name: test-linux  template: cat-os-release  arguments:  parameters:  - name: image  value: "{{item.image}}"  - name: tag  value: "{{item.tag}}"  - name: policy  value: "{{item.policy}}"  withParam: "{{inputs.parameters.os-list}}"   - name: cat-os-release  inputs:  parameters:  - name: image  - name: tag  - name: policy  container:  image: "{{inputs.parameters.image}}:{{inputs.parameters.tag}}"  command: [echo]  args: ["{{inputs.parameters.policy}}"]   

Комментарии:

1. Спасибо за ответ @michael crenshaw, он работает. Но у меня большие политики, если я добавляю escape-символы для каждой инструкции в политике, нам не хватает читабельности политики.

2. Я внес изменения в вопрос. Добавлены двойные кавычки для звездочек

3. @monu интересно, не знал, что у вас может быть нестроковый item.something член. Обновлю свой ответ!

Ответ №2:

Решения, предоставленные Майклом, работают, а также приведенное ниже решение работает для вас с некоторой удобочитаемостью политики

 kind: Workflow metadata:  generateName: loops-param-arg- spec:  entrypoint: loop-param-arg-example  arguments:  parameters:  - name: os-list  value: |  [  { "image": "debian", "tag": "9.1", "policy": {  "Version": "2012-10-17",  "Statement": [  {  "Sid": "BucketAdmin",  "Effect": "Allow",  "Principal": "*",  "Action": "s3:*",  "Resource": "*"  }  ]  } },  { "image": "ubuntu", "tag": "17.10", "policy": {  "Version": "2012-10-17",  "Statement": [  {  "Sid": "BucketAdmin",  "Effect": "Allow",  "Principal": "*",  "Action": "s3:*",  "Resource": "*"  }  ]  }  }  ]  templates:  - name: loop-param-arg-example  inputs:  parameters:  - name: os-list  steps:  - - name: test-linux  template: cat-os-release  arguments:  parameters:  - name: image  value: "{{item.image}}"  - name: tag  value: "{{item.tag}}"  withParam: "{{inputs.parameters.os-list}}"   - name: cat-os-release  inputs:  parameters:  - name: image  - name: tag  container:  image: "{{inputs.parameters.image}}:{{inputs.parameters.tag}} and policy is {{inputs.parameters.policy}}"  command: [cat]  args: [/etc/os-release]