초 단위로 설정 파일을 템플릿화하는syringe 도구 만들기
TL;DR
배경.
인프라 작업을 하면 호스트 이름과 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>
를 여러 번 지정할 수 있습니다.
출력까지의 절차는 다음과 같다.
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>
를 여러 번 지정할 수 있습니다.
출력까지의 절차는 다음과 같다.
$ 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
<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
시 지정<backend>
할 수 없습니다.또한 파이프 입력은 폐기됩니다.설치하다.
에서 다운로드할 수 있습니다.
외부에 의존하지 않고 이진 1개만 있으면 사용할 수 있다.
Windows, Linux, Mac 지원
총결산
총괄해 보면 이런 느낌이다.
VS 핸드메이드(비템플릿)
총괄해 보면 이런 느낌이다.
VS 핸드메이드(비템플릿)
VS 매크로
VS 템플릿 엔진
부록: 역인용 간이 수첩
외부 명령의 출력 결과를 템플릿으로 가져오기
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"}}
orNetwork 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.txtThis is parent.txt
{{exec "syringe child.txt"}}
child.txtThis 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
Reference
이 문제에 관하여(초 단위로 설정 파일을 템플릿화하는syringe 도구 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tanksuzuki/items/5b4661219631a014ce58
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
This configuration was generated at {{exec "date +%Y-%m-%d"}}
This configuration was generated at 2016-05-02
Network address is {{toNetwork "192.168.1.1" "255.255.255.0"}}
Network address is {{toNetwork "192.168.1.1" "24"}}
Network address is 192.168.1.0
Prefix length is {{toPrefixLen "255.255.255.0"}}
Prefix length is 24
Subnet mask is {{toSubnetMask "24"}}
Subnet mask is 255.255.255.0
This is parent.txt
{{exec "syringe child.txt"}}
This is child.txt
This is parent.txt
This is child.txt
[[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"
{{range .static}}
ip route {{.destination}} {{.mask}} {{.nexthop}}
{{end}}
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
# この行はコメントです
key = "value" # 行の途中からもコメントを書けます
{{/* この行はコメントです */}}
{{/* 複数行の
コメントも
書くことができます */}}
$ syringe template.txt -v foo:bar > out.txt
Reference
이 문제에 관하여(초 단위로 설정 파일을 템플릿화하는syringe 도구 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tanksuzuki/items/5b4661219631a014ce58텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)