ansible中的键值对映射传递运行具有适当值的角色

key value pair mapping in ansible to pass run the role with the appropriate value

我是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/deployment 中。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 作为 develop、UAT 或 master 当我 运行 ansible 这个角色将被调用时。现在有一个问题:

我需要基于分支构建我的映像,因此代码需要智能,当我发送 develop 时,它应该搜索分配给 develop 的键并获取相关的 docker 名称并构建它.与此类似的内容:

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

如果有人帮助我如何在 ansible 中做到这一点,我真的很感激

这是可行的方法,但有多种方法可以实现。

假设您在 运行 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 的值之一时才执行。并用 {{item.name}} 分配你的 docker 名称,即 dev,或 master,或 UAT

同样,我们可以通过多种方式做到这一点,这只是其中之一。

希望这对您有所帮助。

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

变量表示法

Ansible 有 2 个符号来访问字典项:

  • 点符号:{{ my_var.my_key.my_subkey }}
  • 括号表示法:{{ my_var['my_key']['my_subkey'] }}

您可以根据需要混合使用这两种表示法

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

请注意,可以使用索引以相同的方式访问列表:

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

变量 "access point"

您的每个环境定义都是一级变量。您通常可以直接在模板表达式中调用这些变量,例如{{ 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"]