초 단위로 설정 파일을 템플릿화하는syringe 도구 만들기

9633 단어 Gotooltemplate

TL;DR

  • 인프라 시설 시스템의 설정을 템플릿화할 때 매크로나 템플릿 시스템의 스크립트를 쓸 때가 있다.
  • 그러나 매크로 코드가 지루하고 관리가 번거로워지기 쉽다.템플릿 엔진을 사용하는 스크립트도 모든 사람이 쓸 수 없기 때문에 난이도가 비교적 높다.
  • 따라서 설정을 간단하게 템플릿화할 수 있는syringe 도구를 만들었다.
  • 에서 다운로드하십시오.
  • 배경.


    인프라 작업을 하면 호스트 이름과 IP 등 부분적으로 다른 구성을 대량으로 제작할 수 있다.
    이럴 때는 매크로(VBA)를 템플릿화해야 하지만 좋은 방법이라고 할 수는 없다.VBA는 원래 프로듀싱에 적합한 언어가 아니기 때문이다.
    참고와 공식만으로도 해결할 수 있는 단계는 괜찮지만, 순환과 조건 분기에서 고릴라 문자열을 가공·결합하기 시작하면 블랙박스화가 추진되고 유지보수가 까다로워져 다른 일에 유용하기 어렵다.
    그렇다면 좋은 방법은 무엇일까, 템플릿 엔진을 사용하는 방법.
    Go 언어의 템플릿 엔진을 사용하여 간단한 Cisco의 구성을 템플릿화한 다음 그림과 같습니다.
    Releases · tanksuzuki/syringe
    package main
    
    import (
        "fmt"
        "os"
        "text/template"
    )
    
    func main() {
        m := map[string]string{
            "hostname": "Router1",
            "ip":       "192.168.0.1",
            "mask":     "255.255.255.0",
        }
    
        s := `hostname {{.hostname}}
    !
    interface GigabitEthernet0/0
     ip address {{.ip}} {{.mask}}
    !`
    
        t := template.New("config")
        t, err := t.Parse(s)
        if err != nil {
            fmt.Fprintf(os.Stderr, "%s", err)
            os.Exit(1)
        }
        t.Execute(os.Stdout, &m)
    }
    
    실행 결과:
    hostname Router1
    !
    interface GigabitEthernet0/0
     ip address 192.168.0.1 255.255.255.0
    !
    
    매크로와 달리 문자열을 전문적으로 처리하고 코드도 비교적 간단하게 쓸 수 있다.
    ...도대체 宏과 비교되는 상황이다.
    상기 코드의 본질 부분에서 삽입할 값을 정의합니다
    "hostname": "Router1",
    "ip":       "192.168.0.1",
    "mask":     "255.255.255.0",
    
    값을 삽입할 위치 정의
    hostname {{.hostname}}
    !
    interface GigabitEthernet0/0
     ip address {{.ip}} {{.mask}}
    !
    
    그냥그 외에는 인간에게 무용지물이다.
    코드를 써 본 적이 없는 사람에게는 단지 하나의 장애일 뿐이다.
    그래서 나는 상관없는 코드를 쓰지 않아도 목적을 달성할 수 있는 도구를 만들었다.

    데모


    다음은 간단한 사용 예이다.
    Go 템플릿으로 작성된 파일에 명령행에 정의된 값을 삽입합니다.
    Go Playground
    삽입된 값이 많으므로 정렬을 사용하려는 경우 TOML, JSON, 환경 변수에 의해 정의된 값을 가져옵니다.

    사용법

    $ syringe --help
    Usage:
      syringe [options] <template> [<backend>...]
    
    Application Options:
      -b, --backend=     Backend type (default: toml) [$SY_BACKEND]
          --debug        Enable debug logging [$SY_DEBUG]
          --delim-left=  Template start delimiter (default: {{) [$SY_DELIML]
          --delim-right= Template end delimiter (default: }}) [$SY_DELIMR]
      -h, --help         Show this help
      -v, --variable=    Set key/values (format key:value)
          --version      Show version information
    
    값을 삽입할 템플릿을 <template>에 지정합니다.
    삽입된 값은 -v, --variable 플래그 및 <backend> 파일로 지정됩니다.-v, --variable 플래그 및 <backend>를 여러 번 지정할 수 있습니다.
    출력까지의 절차는 다음과 같다.
  • 파이프를 통해 전달되는 값이 있으면 가져오기
  • <backend> 파일 또는 환경 변수에서 추출
  • 명령-v, --variable 태그)에 의해 지정된 값 캡처
  • 캡처된 값을 템플릿에 포함
  • 포함된 결과를 표준 출력
  • 으로 출력
    ※ 동일한 키만 있으면 이후 입력한 값으로 덮어씁니다.
    +-------------------------+      +-----------+         +------------+
    | 1. Stdin from pipe      |----->|           |         |            |
    +-------------------------+      |           |         |            |
                                     |           |         |            |
    +-------------------------+      |           | Insert  |   Golang   | Merged string  +----------+
    | 2. <backend> or Env var |----->| Key/Value |-------->|  Template  |--------------->|  Stdout  |
    +-------------------------+      |   Table   |         | <template> |                +----------+
                                     |           |         |            |
    +-------------------------+      |           |         |            |
    | 3. -v, --variable flag  |----->|           |         |            |
    +-------------------------+      +-----------+         +------------+
    
    <backend>에 지정된 파일 및 파이핑 전송에 대한 입력은 기본적으로 TOML로 해석됩니다.다른 형식을 사용할 때는 -b, --backend 플래그를 사용하여 다음을 지정합니다.
  • env
  • json
  • toml(기본값)
  • ※ 지정env시 지정<backend>할 수 없습니다.또한 파이프 입력은 폐기됩니다.

    설치하다.


    에서 다운로드할 수 있습니다.
    외부에 의존하지 않고 이진 1개만 있으면 사용할 수 있다.
    Windows, Linux, Mac 지원

    총결산


    총괄해 보면 이런 느낌이다.

    VS 핸드메이드(비템플릿)

  • 손으로 쓴 것보다 빠르고 오류도 감소
  • 외부 파일을 일목요연하게 가져오는 매개 변수를 지정해야 합니다
  • .

    VS 매크로

  • 코드를 장황하게 쓸 필요 없음
  • 블랙박스 방지
  • 운용부하 감소(변경 용이)
  • 템플릿이git 관리가 용이함
  • VS 템플릿 엔진

  • 언어별 환경 조정 없이도 실행 가능(바이너리 1개만 있으면 OK)
  • 프로그래밍 지식이 없어도 사용할 수 있다(난이도 낮음)
  • 부록: 역인용 간이 수첩


    외부 명령의 출력 결과를 템플릿으로 가져오기

    exec 함수를 사용하여 지정된 명령의 결과를 템플릿으로 가져옵니다.
    This configuration was generated at {{exec "date +%Y-%m-%d"}}
    
    실행 결과:
    This configuration was generated at 2016-05-02
    
    exec 함수 내의 파이프가 지원되지 않기 때문에 exec에서 외부 스크립트를 차거나 sh -c 방법으로 대응하십시오.

    네트워크 주소 구하기

    toNetwork 함수를 사용합니다.
    두 번째 매개변수는 서브넷 마스크 형식과 접두어 길이 형식이 될 수 있습니다.
    Network address is {{toNetwork "192.168.1.1" "255.255.255.0"}}
    
    or
    Network address is {{toNetwork "192.168.1.1" "24"}}
    
    실행 결과:
    Network address is 192.168.1.0
    

    서브넷 마스크에서 접두어 길이로 변환

    toPrefixLen 함수를 사용합니다.
    Prefix length is {{toPrefixLen "255.255.255.0"}}
    
    실행 결과:
    Prefix length is 24
    

    접두사 길이에서 서브넷 마스크로 변환

    toSubnetMask 함수를 사용합니다.
    Subnet mask is {{toSubnetMask "24"}}
    
    실행 결과:
    Subnet mask is 255.255.255.0
    

    템플릿에서 다른 템플릿 불러오기

    exec 함수에서 실행하십시오syringe.
    parent.txt
    This is parent.txt
    {{exec "syringe child.txt"}}
    
    child.txt
    This is child.txt
    
    실행 결과syringe parent.txt:
    This is parent.txt
    This is child.txt
    

    순환하다


    TOML로 정렬 중지(Arry of tables), 템플릿으로 지정range하면 OK.
    route.toml
    [[static]]
    destination = "192.168.0.0"
    mask = "255.255.255.0"
    nexthop = "172.16.0.1"
    
    [[static]]
    destination = "192.168.1.0"
    mask = "255.255.255.0"
    nexthop = "172.16.0.1"
    
    [[static]]
    destination = "192.168.2.0"
    mask = "255.255.255.0"
    nexthop = "172.16.0.1"
    
    template.txt
    {{range .static}}
    ip route {{.destination}} {{.mask}} {{.nexthop}}
    {{end}}
    
    실행 결과syringe template.txt route.toml:
    ip route 192.168.0.0 255.255.255.0 172.16.0.1
    ip route 192.168.1.0 255.255.255.0 172.16.0.1
    ip route 192.168.2.0 255.255.255.0 172.16.0.1
    

    평론을 쓰다


    TOML의 경우:
    # この行はコメントです
    key = "value" # 行の途中からもコメントを書けます
    
    Go 템플릿의 경우:
    {{/* この行はコメントです */}}
    {{/* 複数行の
    コメントも
    書くことができます */}}
    

    실행 결과를 파일로 내보내기


    syringe에 파일 출력 기능이 없습니다. 다시 처리하십시오.
    $ syringe template.txt -v foo:bar > out.txt
    

    좋은 웹페이지 즐겨찾기