---
title: 05-video-cm
description: 
published: true
date: 2023-11-09T15:05:32.795Z
tags: 
editor: markdown
dateCreated: 2023-11-09T15:05:32.795Z
---

# Видео пять. ConfigMap
> Файлы для лабы:
[05-video-cm.zip](/attachments/05-video-cm.zip)

В директории templates есть два файла с ConfigMap:
* configmap-conf.yaml - содержит конфигурационный файл default.conf.
* configmap-html.yaml - содержит html файлы.

Посмотрим как эти файлы можно использовать в шаблонах.

## Вариант раз

Файлы, которые находятся непосредственно в ConfigMaps, неудобно редактировать.
Редакторы теряются в формате. Например, в configmap-html.yaml основной
формат - yaml, а формат вложенных файлов html.

Было бы неплохо, вынести содержимое вложенных файлов в отдельный файл.
А в шаблоне, в нужном месте вставлять его содержимое.

### configmap-conf.yaml

Начнём с конфигурационного файла приложения. В директории openresty-art
создадим файл default.conf и поместим в него конфигурационные параметры
openresty.

В файле configmap-conf.yaml удалим содержимое секции data и 
вставим следующий шаблон.

```yaml
data:
  default.conf: |-
{{ .Files.Get "default.conf" | indent 4 }}
```

В шаблоне мы использовали встроенный объект Files. При помощи которого
мы можем работать с файлами, находящимися внутри чарта.

При помощи функции Get получаем содержимое файла default.conf. Сдвигаем
каждую строку на 4 символа. Шаблон должен быть помещен строго в начало
строки.

Проверим, работает шаблон или нет.

    helm template app ./openresty-art/ -f my-values.yaml > app.yaml

### configmap-html.yaml

В директории openresty-art создадим директорию html. В которой добавим
два файла: 50x.html и index.html

В фале configmap-html.yaml удалим все в разделе data и добавим следующий
шаблон:

```yaml
data:
{{- range $path, $_ :=  .Files.Glob  "html/*" }}
  {{ base $path }}: |
{{ $.Files.Get $path | indent 4 }}
{{- end }}
```

При помощи функции [Glob](https://pkg.go.dev/github.com/gobwas/glob) 
мы получаем список файлов из указанной директории, подходящих под шаблон.
При помощи range перебираем его. В каждой итерации в переменной %path получаем 
путь к файлу.

Функция [base](https://pkg.go.dev/path#example-Base) возвращает имя файла.

$.Files.Get читает его содержимое.

В итоге, в configMap мы получим столько файлов, сколько их есть в директории
html.

Проверяем:

    helm template app ./openresty-art/ -f my-values.yaml > app.yaml

Вроде бы всё хорошо, но при использовании .Files мы не сможем изменить 
содержимое файлов при помощи кастомных файлов values и параметров --set.
Во всяком случае мне такой способ не известен.

### Вариант два.

Добавить содержимое файлов в файл values.yaml.

```yaml
conf:
  defaultConf: |-
    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/local/openresty/nginx/html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/openresty/nginx/html;
        }
    }
html:
  index: |-
    <html>
      <head>
        <title>Тестовая страница</title>
        <meta charset="UTF-8">
      </head>
      <body>
        <h1>Тестовая страница</h1>
      </body>
    </html>
  50x: |-
    <!DOCTYPE html>
    <html>
    <head>
    <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
    <meta content="utf-8" http-equiv="encoding">
    <title>Error</title>
    <style>
        body {
            width: 35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
    </style>
    </head>
    <body>
    <h1>An error occurred.</h1>
    <p>Sorry, the page you are looking for is currently unavailable.<br/>
    Please try again later.</p>
    </body>
    </html>
```

В файле configmap-conf.yaml нам необходимо подставить всего один файл с
известным именем. Поэтому шаблон будет простой.

```yaml
data:
  default.conf: |-
{{ .Values.conf.defaultConf | indent 4 }}
```

В файле configmap-html.yaml, количество html файлов заранее не известно.
Поэтому шаблон будет чуть сложнее.

```yaml
data:
{{- range $file, $value :=  .Values.html }}
  {{ $file }}.html: |
{{ $value | indent 4 }}
{{- end }}
```

Проверяем работу шаблона по умолчанию:

    helm template app ./openresty-art/ -f my-values.yaml > app.yaml

Теперь посмотрим, как подставить свои файлы, при вызове helm.
Создадим в директории 05-video-cm директорию html и поместим в неё
файла index.html, попутно нмного его изменив. Что бы он отличался
от файла index.html файла values.yaml.

Сначала подставим только my-default.conf:

    helm template app ./openresty-art/ -f my-values.yaml \
    --set-file conf.defaultConf=my-default.conf  > app.yaml

А теперь изменим html/index.html:

    helm template app ./openresty-art/ -f my-values.yaml \
    --set-file conf.defaultConf=my-default.conf \
    --set-file html.index=html/index.html > app.yaml

Добавим 3-й html файл:

    helm template app ./openresty-art/ -f my-values.yaml \
    --set-file conf.defaultConf=my-default.conf \
    --set-file html.test=html/index.html > app.yaml

## Видео

[<img src="https://img.youtube.com/vi/rb_qifNyDdA/maxresdefault.jpg" width="50%">](https://youtu.be/rb_qifNyDdA)
