Ansible 中的键值对映射传递使用适当的值运行角色



我是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作为开发,UAT或master发送,这个角色将被调用。现在有一个问题:

我需要基于分支构建我的映像,因此代码需要智能,当我发送开发时,它应该搜索分配给开发的密钥并获取相关的 docker 名称并构建它。 类似于这样的东西:

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

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

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] }}

变量"接入点">

每个环境定义都是一级变量。您通常可以直接在模板表达式中调用这些变量,例如{{ master.dockerName }}.但是这些变量也可以通过第一级vars字典获得,因此以下内容与{{ 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"]

这是有效的方法,但有几种方法可以实现。

假设您在运行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}}devmasterUAT

同样,我们有几种方法可以做到这一点,这只是其中之一。

希望这是有帮助的。

最新更新