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"]
我是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"]