zoukankan      html  css  js  c++  java
  • confd template src格式和 templates 语法

    Template Resources

    Template resources are written in TOML and define a single template resource. Template resources are stored under the/etc/confd/conf.d directory by default.

    Required

    • dest (string) - The target file.
    • keys (array of strings) - An array of keys.
    • src (string) - The relative path of a configuration template.

    Optional

    • gid (int) - The gid that should own the file. Defaults to the effective gid.
    • mode (string) - The permission mode of the file.
    • uid (int) - The uid that should own the file. Defaults to the effective uid.
    • reload_cmd (string) - The command to reload config.
    • check_cmd (string) - The command to check config. Use {{.src}} to reference the rendered source template.
    • prefix (string) - The string to prefix to keys.

    Notes

    When using the reload_cmd feature it's important that the command exits on its own. The reload command is not managed by confd, and will block the configuration run until it exits.

    Example

    [template]
    src = "nginx.conf.tmpl"
    dest = "/etc/nginx/nginx.conf"
    uid = 0
    gid = 0
    mode = "0644"
    keys = [
      "/nginx",
    ]
    check_cmd = "/usr/sbin/nginx -t -c {{.src}}"
    reload_cmd = "/usr/sbin/service nginx restart"
     
     
     

    Templates

    Templates define a single application configuration template. Templates are stored under the /etc/confd/templates directory by default.

    Templates are written in Go's text/template.

    Template Functions

    map

    creates a key-value map of string -> interface{}

    1.  
      {{$endpoint := map "name" "elasticsearch" "private_port" 9200 "public_port" 443}}
    2.  
       
    3.  
      name: {{index $endpoint "name"}}
    4.  
      private-port: {{index $endpoint "private_port"}}
    5.  
      public-port: {{index $endpoint "public_port"}}

    specifically useful if you a sub-template and you want to pass multiple values to it.

    base

    Alias for the path.Base function.

    1.  
      {{with get "/key"}}
    2.  
      key: {{base .Key}}
    3.  
      value: {{.Value}}
    4.  
      {{end}}

    exists

    Checks if the key exists. Return false if key is not found.

    1.  
      {{if exists "/key"}}
    2.  
      value: {{getv "/key"}}
    3.  
      {{end}}

    get

    Returns the KVPair where key matches its argument. Returns an error if key is not found.

    1.  
      {{with get "/key"}}
    2.  
      key: {{.Key}}
    3.  
      value: {{.Value}}
    4.  
      {{end}}

    gets

    Returns all KVPair, []KVPair, where key matches its argument. Returns an error if key is not found.

    1.  
      {{range gets "/*"}}
    2.  
      key: {{.Key}}
    3.  
      value: {{.Value}}
    4.  
      {{end}}

    getv

    Returns the value as a string where key matches its argument or an optional default value. Returns an error if key is not found and no default value given.

    value: {{getv "/key"}}
    

    With a default value

    value: {{getv "/key" "default_value"}}
    

    getvs

    Returns all values, []string, where key matches its argument. Returns an error if key is not found.

    1.  
      {{range getvs "/*"}}
    2.  
      value: {{.}}
    3.  
      {{end}}

    getenv

    Wrapper for os.Getenv. Retrieves the value of the environment variable named by the key. It returns the value, which will be empty if the variable is not present. Optionally, you can give a default value that will be returned if the key is not present.

    export HOSTNAME=`hostname`
    
    hostname: {{getenv "HOSTNAME"}}
    

    With a default value

    ipaddr: {{getenv "HOST_IP" "127.0.0.1"}}
    

    datetime

    Alias for time.Now

    # Generated by confd {{datetime}}
    

    Outputs:

    # Generated by confd 2015-01-23 13:34:56.093250283 -0800 PST
    
    # Generated by confd {{datetime.Format "Jan 2, 2006 at 3:04pm (MST)"}}
    

    Outputs:

    # Generated by confd Jan 23, 2015 at 1:34pm (EST)
    

    See the time package for more usage: http://golang.org/pkg/time/

    split

    Wrapper for strings.Split. Splits the input string on the separating string and returns a slice of substrings.

    1.  
      {{ $url := split (getv "/deis/service") ":" }}
    2.  
      host: {{index $url 0}}
    3.  
      port: {{index $url 1}}

    toUpper

    Alias for strings.ToUpper Returns uppercased string.

    key: {{toUpper "value"}}
    

    toLower

    Alias for strings.ToLower. Returns lowercased string.

    key: {{toLower "Value"}}
    

    json

    Returns an map[string]interface{} of the json value.

    lookupSRV

    Wrapper for net.LookupSRV. The wrapper also sorts the SRV records alphabetically by combining all the fields of the net.SRV struct to reduce unnecessary config reloads.

    1.  
      {{range lookupSRV "mail" "tcp" "example.com"}}
    2.  
      target: {{.Target}}
    3.  
      port: {{.Port}}
    4.  
      priority: {{.Priority}}
    5.  
      weight: {{.Weight}}
    6.  
      {{end}}

    Add keys to etcd

    1.  
      etcdctl set /services/zookeeper/host1 '{"Id":"host1", "IP":"192.168.10.11"}'
    2.  
      etcdctl set /services/zookeeper/host2 '{"Id":"host2", "IP":"192.168.10.12"}'

    Create the template resource

    1.  
      [template]
    2.  
      src = "services.conf.tmpl"
    3.  
      dest = "/tmp/services.conf"
    4.  
      keys = [
    5.  
      "/services/zookeeper/"
    6.  
      ]

    Create the template

    1.  
      {{range gets "/services/zookeeper/*"}}
    2.  
      {{$data := json .Value}}
    3.  
      id: {{$data.Id}}
    4.  
      ip: {{$data.IP}}
    5.  
      {{end}}

    Advanced Map Traversals

    Once you have parsed the JSON, it is possible to traverse it with normal Go template functions such as index.

    A more advanced structure, like this:

    1.  
      {
    2.  
      "animals": [
    3.  
      {"type": "dog", "name": "Fido"},
    4.  
      {"type": "cat", "name": "Misse"}
    5.  
      ]
    6.  
      }

    It can be traversed like this:

    1.  
      {{$data := json (getv "/test/data/")}}
    2.  
      type: {{ (index $data.animals 1).type }}
    3.  
      name: {{ (index $data.animals 1).name }}
    4.  
      {{range $data.animals}}
    5.  
      {{.name}}
    6.  
      {{end}}

    jsonArray

    Returns a []interface{} from a json array such as ["a", "b", "c"].

    1.  
      {{range jsonArray (getv "/services/data/")}}
    2.  
      val: {{.}}
    3.  
      {{end}}

    ls

    Returns all subkeys, []string, where path matches its argument. Returns an empty list if path is not found.

    1.  
      {{range ls "/deis/services"}}
    2.  
      value: {{.}}
    3.  
      {{end}}

    lsdir

    Returns all subkeys, []string, where path matches its argument. It only returns subkeys that also have subkeys. Returns an empty list if path is not found.

    1.  
      {{range lsdir "/deis/services"}}
    2.  
      value: {{.}}
    3.  
      {{end}}

    dir

    Returns the parent directory of a given key.

    1.  
      {{with dir "/services/data/url"}}
    2.  
      dir: {{.}}
    3.  
      {{end}}

    join

    Alias for the strings.Join function.

    1.  
      {{$services := getvs "/services/elasticsearch/*"}}
    2.  
      services: {{join $services ","}}

    replace

    Alias for the strings.Replace function.

    1.  
      {{$backend := getv "/services/backend/nginx"}}
    2.  
      backend = {{replace $backend "-" "_" -1}}

    lookupIP

    Wrapper for net.LookupIP function. The wrapper also sorts (alphabeticaly) the IP addresses. This is crucial since in dynamic environments DNS servers typically shuffle the addresses linked to domain name. And that would cause unnecessary config reloads.

    1.  
      {{range lookupIP "some.host.local"}}
    2.  
      server {{.}};
    3.  
      {{end}}

    Example Usage

    etcdctl set /nginx/domain 'example.com'
    etcdctl set /nginx/root '/var/www/example_dotcom'
    etcdctl set /nginx/worker_processes '2'
    etcdctl set /app/upstream/app1 "10.0.1.100:80"
    etcdctl set /app/upstream/app2 "10.0.1.101:80"

    /etc/confd/templates/nginx.conf.tmpl

    1.  
      worker_processes {{getv "/nginx/worker_processes"}};
    2.  
       
    3.  
      upstream app {
    4.  
      {{range getvs "/app/upstream/*"}}
    5.  
      server {{.}};
    6.  
      {{end}}
    7.  
      }
    8.  
       
    9.  
      server {
    10.  
      listen 80;
    11.  
      server_name www.{{getv "/nginx/domain"}};
    12.  
      access_log /var/log/nginx/{{getv "/nginx/domain"}}.access.log;
    13.  
      error_log /var/log/nginx/{{getv "/nginx/domain"}}.log;
    14.  
       
    15.  
      location / {
    16.  
      root {{getv "/nginx/root"}};
    17.  
      index index.html index.htm;
    18.  
      proxy_pass http://app;
    19.  
      proxy_redirect off;
    20.  
      proxy_set_header Host $host;
    21.  
      proxy_set_header X-Real-IP $remote_addr;
    22.  
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    23.  
      }
    24.  
      }

    Output: /etc/nginx/nginx.conf

    1.  
      worker_processes 2;
    2.  
       
    3.  
      upstream app {
    4.  
      server 10.0.1.100:80;
    5.  
      server 10.0.1.101:80;
    6.  
      }
    7.  
       
    8.  
      server {
    9.  
      listen 80;
    10.  
      server_name www.example.com;
    11.  
      access_log /var/log/nginx/example.com.access.log;
    12.  
      error_log /var/log/nginx/example.com.error.log;
    13.  
       
    14.  
      location / {
    15.  
      root /var/www/example_dotcom;
    16.  
      index index.html index.htm;
    17.  
      proxy_pass http://app;
    18.  
      proxy_redirect off;
    19.  
      proxy_set_header Host $host;
    20.  
      proxy_set_header X-Real-IP $remote_addr;
    21.  
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    22.  
      }
    23.  
      }

    Complex example

    This examples show how to use a combination of the templates functions to do nested iteration.

    Add keys to etcd

    1.  
      etcdctl mkdir /services/web/cust1/
    2.  
      etcdctl mkdir /services/web/cust2/
    3.  
      etcdctl set /services/web/cust1/2 '{"IP": "10.0.0.2"}'
    4.  
      etcdctl set /services/web/cust2/2 '{"IP": "10.0.0.4"}'
    5.  
      etcdctl set /services/web/cust2/1 '{"IP": "10.0.0.3"}'
    6.  
      etcdctl set /services/web/cust1/1 '{"IP": "10.0.0.1"}'

    Create the template resource

    1.  
      [template]
    2.  
      src = "services.conf.tmpl"
    3.  
      dest = "/tmp/services.conf"
    4.  
      keys = [
    5.  
      "/services/web"
    6.  
      ]

    Create the template

    1.  
      {{range $dir := lsdir "/services/web"}}
    2.  
      upstream {{base $dir}} {
    3.  
      {{$custdir := printf "/services/web/%s/*" $dir}}{{range gets $custdir}}
    4.  
      server {{$data := json .Value}}{{$data.IP}}:80;
    5.  
      {{end}}
    6.  
      }
    7.  
       
    8.  
      server {
    9.  
      server_name {{base $dir}}.example.com;
    10.  
      location / {
    11.  
      proxy_pass {{base $dir}};
    12.  
      }
    13.  
      }
    14.  
      {{end}}

    Output:/tmp/services.conf



    原文 https://blog.csdn.net/ztsinghua/article/details/51643732
    官网 https://github.com/kelseyhightower/confd/blob/master/docs/templates.md
  • 相关阅读:
    WebSocket
    CORS跨域请求
    Flask基础应用
    Python之人工智能(一)
    Linux(CentOS7)安装Nginx(附简单配置)
    SpringBoot异步调用--@Async详解
    Java8遍历Map、Map转List、List转Map
    Linux修改系统时间为东八区北京时间(上海时间)
    Docker 安装并部署Tomcat、Mysql8、Redis
    Mysql8.0新特性【详细版本】
  • 原文地址:https://www.cnblogs.com/zhengchunyuan/p/9682049.html
Copyright © 2011-2022 走看看