сопоставление пары ключ-значение в ansible для передачи запуска роли с соответствующим значением - PullRequest
1 голос
/ 16 января 2020

Я новичок в ansible. У меня небольшой сценарий. Поэтому я передаю имя ветви, используя ansible при запуске. В моей книге игр у меня есть:

# Deploy docker container
- include_role:
    name: devops/deployment.docker
  vars:
    docker_name: "docker name is based on the branch id develop dev if UAT test if master then it should be prod"
  when: build_type in "develop master UAT"

и в devops / deploy. docker У меня есть роль, которая развертывает образ docker.

- name: push docker container
  docker_image:
    name: "{{ docker.registery }}/docker_name"
    source: build
    build: 
      nocache: true
      path: "{{ travis.base_build_path }}"
    tag: "{{ ucd.component_version }}"
    push: yes

Поэтому я отправляю build_type По мере развития, UAT или мастер, когда я запускаю ansible, эта роль будет называться. Теперь возникает проблема:

Мне нужно построить свой образ на основе ветви, поэтому код должен быть интеллектуальным, и при отправке разработки он должен go найти ключ, назначенный для разработки, и получить соответствующий docker назови и построй его. что-то похожее на это:

{
 develop: {
  dockerName:dev
 },
 master: {
  dockerName: prod
  },
 UAT: {
   dockerName: test
 }
}

Если кто-нибудь поможет мне, как это сделать в ansible Я действительно ценю это

Ответы [ 2 ]

1 голос
/ 16 января 2020

TLDR;

- name: push docker container
  vars:
    docker_name: "{{ vars[build_type].dockerName }}"
  docker_image:
    name: "{{ docker.registery }}/{{ docker_name }}"
    source: build
    build: 
      nocache: true
      path: "{{ travis.base_build_path }}"
    tag: "{{ ucd.component_version }}"
    push: yes

нотация Vars

Ansible имеет 2 нотации для доступа к элементам dict:

  • Точечная нотация: {{ my_var.my_key.my_subkey }}
  • Обозначение в скобках: {{ my_var['my_key']['my_subkey'] }}

Вы можете смешивать эти два обозначения, когда вы будете sh

  • {{ my_var.my_key['my_subkey'] }}
  • {{ my_var['my_key'].my_subkey }}

Обратите внимание, что к спискам можно обращаться одинаково, используя их индекс:

  • {{ my_list.0 }}
  • {{ my_list[0] }}

Варь "точка доступа"

Каждое из ваших определений среды - вар первого уровня. Вы можете обычно вызывать эти переменные в выражении шаблона напрямую, например, {{ master.dockerName }}. Но эти переменные также доступны через первый уровень vars dict, так что следующее в точности эквивалентно {{ vars.master.dockerName }}.

Наконец ...

Зная выше и что вы отправляете имя соответствующего ключа в переменной build_type ожидаемое значение можно получить с помощью: {{ vars[build_type].dockerName }}


Не относящегося к вашему текущему вопросу

Относительно вашего условия include_role:

when: build_type in "develop master UAT"

Обратите внимание, что это будет работать для значения "develop", как вы ожидаете, но также будет соответствовать для "AT", "mast", "devel" или даже "op mas". Это может нарушить остальные операции в случае опечатки.

Чтобы убедиться, что вы соответствуете точному слову, поместите свои совпадения в список, и сравнение переместится с "is it a substring of" на "is it an element of"

when: build_type in ["develop", "master", "UAT"]
1 голос
/ 16 января 2020

Вот кое-что, что работает, но есть несколько способов, которыми это может быть достигнуто.

Предполагается, что вы передаете переменные из командной строки при запуске ansible-playbook.

Это будет ваша команда, о которой вы, возможно, уже знаете.

ansible-playbook mydocker-playbook.yml --extra-vars "build_type=develop"

Ниже приведен пример того, как вы можете этого достичь.

mydocker-playbook.yaml

---
- name: Docker deployment
  hosts: devops
  become: yes
  roles:
    - devops-role

И ваша задача может выглядеть примерно так

- name: push docker container
  docker_image:
    name: "{{ docker.registery }}/{{item.name}}"
    source: build
    build: 
      nocache: true
      path: "{{ travis.base_build_path }}"
    tag: "{{ ucd.component_version }}"
    push: yes
  when: build_type == item.type
  with_items:
    - { name: "dev", type: "develop" }
    - { name: "master", type: "prod" }
    - { name: "UAT", type: "test" }

Задача повторяется по заданному списку. Но выполняется только тогда, когда build_type является одним из значений type. И присваиваете ваше docker имя с помощью {{item.name}}, то есть либо dev, либо master, либо UAT.

Опять же, есть несколько способов сделать это, это только один из них .

Надеюсь, это полезно.

...