PowerShell Crescendo 소개

23591 단어 crescendopowershell
특히 맥OS나 리눅스 등 유닉스 플랫폼에서는 PowerShell만으로는 할 수 없는 관리 임무가 많다.일상적인 작업에 문제가 되지 않습니다. 이 프로그램은 사용하고 필요할 때 PowerShell로 돌아갑니다.그러나 이러한 네이티브 애플리케이션을 더 복잡한 PowerShell 솔루션에 통합해야 하는 경우에는 어떻게 해야 합니까?
이를 실현할 수 있는 몇 가지 방법이 있습니다this blog post.
그러나 최근 마이크로소프트가 이 컴퓨터의 명령을 더욱 잘 지원하기 위해 새로운 모듈인 Crescendo를 발표했다. 본문 here 을 참고하십시오.
이 모듈Crescendo은 프레임워크입니다.이것은 동사 Noum 이름 규약, 명령 파라미터에 비친 PowerShell 파라미터를 사용하여 cmdlet을 만들고 결과를 대상으로 출력할 수 있도록 합니다.
모듈을 설치하려면 PowerShell 7을 사용해야 합니다.X
Install-Module Microsoft.PowerShell.Crescendo
현재 이 모듈이 설치되어 있습니다. 첫 번째 cmdlet을 만들기 시작할 수 있습니다.이를 위해서는 대상 명령, 매개변수, 출력 등을 사용하는 방법을 설명하는 JSON 프로필이 필요합니다.
같은 예시를 만드는 방법을 보여 드리겠습니다. 이름 공간에 따라 POD를 보여 줍니다.
명령
kubectl get pods -o json
그것은 당신이 연결된 쿠베르네트스 성계단의 기중기 정보를 보여 줍니다.
이 명령에서 특정한 이름 공간을 선택하려면 파라미터를 추가해야 합니다. 이 파라미터가 존재하지 않으면 기본 이름 공간의pod를 보여 주십시오.
명령은 다음과 같습니다.
kubectl get pods -o json –namespace XXX 
해당 JSON 구성 파일은 다음과 같습니다.
{
"$schema": "https://raw.githubusercontent.com/PowerShell/Crescendo/master/Microsoft.PowerShell.Crescendo/src/Microsoft.PowerShell.Crescendo.Schema.json",
"Verb": "Get",
    "Noun":"k8spods", 
    "OriginalName": "kubectl", 
    "OriginalCommandElements": [
        "get",
        "pods",
        "-o",
        "json"
    ],
    "Parameters": [  
        {
            "Name":"namespace",
            "OriginalName": "--namespace",
            "ParameterType": "string",
            "Description": "Namespace name",
            "DefaultValue": "default"
        }
    ]
}
$Schema 섹션은 선택 사항이지만 VisualStudio 코드에서 구성 파일을 작성하는 데 도움이 됩니다.로컬 파일(macOs에서 $HOME/.local/share/powershell/Modules/Microsoft.powershell.Crescendo/Microsoft.powershell.Crescendo.Schema.json)을 사용할 수도 있고 GitHub의 온라인 버전(https://raw.githubusercontent.com/PowerShell/Crescendo/master/Microsoft.PowerShell.Crescendo/src/Microsoft.PowerShell.Crescendo.Schema.json을 사용할 수도 있습니다.
동사 부분은 cmdlet 동사를 설계할 것이다.올바른 PowerShell 동사를 선택해야 합니다.이 명령을 사용하면 유효한 동사의 목록을 얻을 수 있습니다
Get-verb
Noun은 만들 cmdlet의 두 번째 부분입니다.너는 네가 원하는 것을 선택할 수 있다.
originalName은 매개 변수가 없는 명령의 이름(또는 경로)입니다.
명령이 작동하려면 Original Command Elements를 사용해야 합니다.이 매개 변수는 cmdlet의 일부분이 필요하지 않지만, 명령이 실행되는 동안 반드시 존재해야 합니다.이것은 하나의 수조이다.
마지막으로 매개변수는 JSON 객체 배열입니다.모든 대상은 cmdlet에서 매개 변수를 정의합니다.이름, PowerShell cmdlet의 매개 변수 이름,originalName, 로컬 명령에 해당하는 이름을 제공해야 합니다.
추가 속성은 매개변수를 설계하는 데 도움이 됩니다.

  • 설명, 함수
  • 의 주석 기반 도움말에 추가

  • DefaultValue, 매개 변수의 기본값

  • ParameterType, 모든 PowerShell 값(문자열, Int,...) 또는 스위치(매개변수에 값이 필요하지 않은 경우)

  • 매개 변수를 강제 매개 변수
  • 로 설정하려면 강제,true 또는false
    이 프로필은 cmdlet을 만들 수 있습니다.이것은 파라미터 부분의 파라미터를 사용하여 함수를 만들고, 본 컴퓨터의 명령에 패키지를 만들 것입니다.
    cmdlet을 만들려면 다음과 같이 하십시오.
    Export-CrescendoModule -ConfigurationFile ./pods.json -ModuleName pods.psm1
    
    현재 디렉터리에 모듈 파일을 만들 것입니다. (이 파일이 존재하면 cmdlet에서 오류가 발생합니다.)
    사용 가능
    Import-Module ./pods1.psm1
    
    이제 cmdlet을 사용할 수 있어요.
    Get-k8spods -namespace MyNameSpace
    
    하지만 그것을 사용하면 kubectl 명령의 직접 출력을 받을 수 있습니다.우리가 더 잘 해서 맞춤형 PowerShell 대상을 출력할 수 있습니까?
    최초의 게시물에서kubectl의 출력은 JSON 데이터에서 변환된 것으로pod명칭, 상태(또는 단계), 리셋 계수, 시작 날짜 시간, 이미지, 명칭 공간 노드 명칭과 노드 유형만 검색됩니다.
    cmdlet의 출력을 수정해야 합니다.지금까지 설정 파일은 명령을 어떻게 실행하고 cmdlet 입력을 만드는지와만 관련이 있습니다.출력을 수정하려면 outputHandlers 속성을 추가해야 합니다.이것은 하나의 대상 그룹입니다. 각 요소는 두 가지 필수 속성을 포함합니다. 그것이 바로 ParameterSetName, 출력과 관련된parameterSet의 이름, 출력을 위한 코드입니다.
    Handler 속성에는 로컬 명령 출력에 대해 실행되는 코드가 포함되어 있습니다.출력을 매개 변수로 하다.$args 그룹의 첫 번째 요소 ($args[0]) 를 사용할 수도 있고,param 키워드를 매개 변수 이름과 함께 사용할 수도 있습니다.
    JSON은 기본적으로 여러 줄 문자열을 지원하지 않더라도 PowerShell에서 지원하지만 Visual Studio 코드는 그렇지 않습니다. 구성 파일을 편집할 때 경고를 무시할 수 있습니다.
    {
        "$schema": "https://raw.githubusercontent.com/PowerShell/Crescendo/master/Microsoft.PowerShell.Crescendo/src/Microsoft.PowerShell.Crescendo.Schema.json",
        "Verb": "Get",
        "Noun":"pods2", 
        "OriginalName": "kubectl", 
            "OriginalCommandElements": [
                "get",
                "pods",
                "-o",
                "json"
            ],
            "Parameters": [  
                {
                    "Name":"namespace",
                    "OriginalName": "--namespace",
                    "ParameterType": "string",
                    "Description": "Namespace name",
                    "DefaultValue": "default",
                    "Mandatory": true
                }
            ],
            "OutputHandlers": [
                {
                "ParameterSetName": "Default",
                "Handler":"param ( $kubectlOutput )
                    $Podslist = $kubectlOutput | convertfrom-Json
                    $PodsArrayList = [System.Collections.ArrayList]::new()
                    foreach ($pod in $Podslist.items) {
                        [void]$PodsArrayList.Add([pscustomobject]@{ 
                            PodName                 =   $pod.metadata.name
                            Status                  =   $pod.status.phase
                            restartCount            =   $pod.status.containerStatuses[0].restartCount
                            StartTime               =   $pod.status.startTime
                            image                   =   $pod.status.containerStatuses[0].image
                            Node                    =   $pod.spec.nodeName 
                            NodeType                =   $pod.spec.nodeSelector
                            NameSpace               =   $pod.metadata.namespace
                        })
                    }
                    $PodsArrayList
                "
                }
            ]
        }
    
    Handler 속성의 코드는 kubectl 출력을 PowerShell 객체로 변환합니다.원하는 값을 반복적으로 추출하여 객체를 반환하기 전에 사용자 객체에 추가합니다.
    결과는요

    cmdlet은 거의 완성되었지만kubectl 명령도 --all 이름 공간을 받아들였습니다.이 스위치는 --namespace 매개 변수를 포함하지 않습니다.
    매개변수 섹션에 매개변수를 추가해야 합니다.cmdlet에서 --namespace를 제외하려면 매개 변수에parameterSetName 속성을 추가해야 합니다.
            "Parameters": [  
                {
                    "Name":"namespace",
                    "OriginalName": "--namespace",
                    "ParameterType": "string",
                    "Description": "Namespace name",
                    "DefaultValue": "default",
                    "ParameterSetName": [
                        "default"
                    ]
                },
                {
                    "Name":"allNameSpace",
                    "OriginalName": "--all-namespace",
                    "ParameterType": "switch",
                    "Description": "to get all namespace",
                    "ParameterSetName": [
                        "allnamespace"
                    ]
                }
            ]
    
    첫 번째 파라미터namespace는 파라미터 집합 이름default을 추가하는 것으로 수정되었습니다.두 번째 파라미터는 allnamespace 스위치에 연결되어 있으며, 파라미터 형식은 switch이며, 이 파라미터는 allnamespace 파라미터 집중에 추가됩니다.
    아직 해야 할 일이 하나 더 있다.handler 부분에서 모든 대상은parameterSetName 속성을 가지고 있어야 합니다.이것은 allnamespace 매개 변수 집합에 다른 항목을 만들어야 한다는 것을 의미합니다.
    {
        "$schema": "https://raw.githubusercontent.com/PowerShell/Crescendo/master/Microsoft.PowerShell.Crescendo/src/Microsoft.PowerShell.Crescendo.Schema.json",
        "Verb": "Get",
        "Noun":"pods3", 
        "OriginalName": "kubectl", 
            "OriginalCommandElements": [
                "get",
                "pods",
                "-o",
                "json"
            ],
            "Parameters": [  
                {
                    "Name":"namespace",
                    "OriginalName": "--namespace",
                    "ParameterType": "string",
                    "Description": "Namespace name",
                    "DefaultValue": "default",
                    "ParameterSetName": [
                        "default"
                    ]
                },
                {
                    "Name":"allnamespace",
                    "OriginalName": "--all-namespaces",
                    "ParameterType": "switch",
                    "Description": "to get all namespace",
                    "ParameterSetName": [
                        "allnamespace"
                    ]
                }
            ],
            "OutputHandlers": [
                {
                "ParameterSetName": "Default",
                "Handler":"param ( $kubectlOutput )
                    $Podslist = $kubectlOutput | convertfrom-Json
                    $PodsArrayList = [System.Collections.ArrayList]::new()
                    foreach ($pod in $Podslist.items) {
                        [void]$PodsArrayList.Add([pscustomobject]@{ 
                            PodName                 =   $pod.metadata.name
                            Status                  =   $pod.status.phase
                            restartCount            =   $pod.status.containerStatuses[0].restartCount
                            StartTime               =   $pod.status.startTime
                            image                   =   $pod.status.containerStatuses[0].image
                            Node                    =   $pod.spec.nodeName 
                            NodeType                =   $pod.spec.nodeSelector
                            NameSpace               =   $pod.metadata.namespace
                        })
                    }
                    $PodsArrayList
                "
                },
                {
                    "ParameterSetName": "allnamespace",
                    "Handler":"param ( $kubectlOutput )
                        $Podslist = $kubectlOutput | convertfrom-Json
                        $PodsArrayList = [System.Collections.ArrayList]::new()
                        foreach ($pod in $Podslist.items) {
                            [void]$PodsArrayList.Add([pscustomobject]@{ 
                                PodName                 =   $pod.metadata.name
                                Status                  =   $pod.status.phase
                                restartCount            =   $pod.status.containerStatuses[0].restartCount
                                StartTime               =   $pod.status.startTime
                                image                   =   $pod.status.containerStatuses[0].image
                                Node                    =   $pod.spec.nodeName 
                                NodeType                =   $pod.spec.nodeSelector
                                NameSpace               =   $pod.metadata.namespace
                            })
                        }
                        $PodsArrayList
                    "
                    }
            ]
        }
    
    Crescendo 프레임워크에서 만든 모듈은 함수가 있는 PSM1 파일일 뿐입니다.그것으로 완전한 모듈을 만들거나 프로젝트에 기능을 통합시키려고 할 수도 있습니다.
    Crescendo 프레임은 미리보기 중이므로 결함과 제한을 찾을 수 있습니다.항목GitHub pages에서 항목을 보고 질문을 열 수 있습니다.

    좋은 웹페이지 즐겨찾기