зеркало из https://github.com/Azure/acs-engine.git
Enabled preprovisioning on windows dcos agents (#2228)
This commit is contained in:
Родитель
79a057ffb5
Коммит
e7b78cedb9
|
@ -0,0 +1,46 @@
|
||||||
|
# hello-world-dcos Extension
|
||||||
|
|
||||||
|
Sample hello-world extension. Calls the following on the master:
|
||||||
|
|
||||||
|
```
|
||||||
|
curl -X post http://localhost:8080/v2/apps -d "{ \"id\": \"hello-marathon\", \"cmd\": \"while [ true ] ; do echo 'Hello World' ; sleep 5 ; done\", \"cpus\": 0.1, \"mem\": 10.0, \"instances\": 1 }" -H "Content-type:application/json"
|
||||||
|
```
|
||||||
|
|
||||||
|
You can validate that the extension was run by running (make sure you have tunneled into the master):
|
||||||
|
```
|
||||||
|
dcos auth login
|
||||||
|
dcos task log hello-marathon
|
||||||
|
```
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
|Name|Required|Acceptable Value|
|
||||||
|
|---|---|---|
|
||||||
|
|name|yes|hello-world-k8s|
|
||||||
|
|version|yes|v1|
|
||||||
|
|extensionParameters|no||
|
||||||
|
|rootURL|optional||
|
||||||
|
|
||||||
|
# Example
|
||||||
|
``` javascript
|
||||||
|
"masterProfile": {
|
||||||
|
...
|
||||||
|
"extensions": [
|
||||||
|
{
|
||||||
|
"name": "hello-world-dcos",
|
||||||
|
"singleOrAll": "single"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
...
|
||||||
|
"extensionProfiles": [
|
||||||
|
{
|
||||||
|
"name": "hello-world-dcos",
|
||||||
|
"version": "v1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
# Supported Orchestrators
|
||||||
|
"DCOS", "DCOS173", "DCOS184", "DCOS188"
|
|
@ -0,0 +1,20 @@
|
||||||
|
# Script file to run hello-world in dcos
|
||||||
|
|
||||||
|
#!/usr/bin/pwsh
|
||||||
|
|
||||||
|
|
||||||
|
Write-Host "$(date) - Starting Script"
|
||||||
|
|
||||||
|
# Deploy container
|
||||||
|
Write-Host "$(date) - Deploying hello-world"
|
||||||
|
|
||||||
|
$uri = "http://"+($env:DCOS_AGENT_IP)+":5051/metrics/snapshot"
|
||||||
|
while($true) {
|
||||||
|
$obj = ((Invoke-Webrequest -Method GET -URI $uri ).Content | ConvertFrom-JSON )
|
||||||
|
Write-Host "$(date) - system/cpus_total = " ($obj.'system/cpus_total') ", mem free bytes = " ($obj.'system/mem_free_bytes') ", mem total bytes = " ($obj.'system/mem_total_bytes')
|
||||||
|
sleep 5
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "$(date) - view resources in mesos UI to validate"
|
||||||
|
Write-Host "$(date) - Script complete"
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
["DCOS", "DCOS173", "DCOS184", "DCOS188", "DCOS190"]
|
|
@ -0,0 +1,33 @@
|
||||||
|
{
|
||||||
|
"name": "[concat(EXTENSION_TARGET_VM_NAME_PREFIX, copyIndex(EXTENSION_LOOP_OFFSET), 'HelloWorldDcos')]",
|
||||||
|
"type": "Microsoft.Resources/deployments",
|
||||||
|
"apiVersion": "[variables('apiVersionLinkDefault')]",
|
||||||
|
"dependsOn": [
|
||||||
|
"[resourceId('Microsoft.Compute/virtualMachines/extensions', concat(variables('masterVMNamePrefix'), sub(variables('masterCount'), 1)), 'waitforleader')]"
|
||||||
|
],
|
||||||
|
"copy": {
|
||||||
|
"count": "EXTENSION_LOOP_COUNT",
|
||||||
|
"name": "helloWorldExtensionLoop"
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"mode": "Incremental",
|
||||||
|
"templateLink": {
|
||||||
|
"uri": "EXTENSION_URL_REPLACEextensions/hello-world-dcos-windows/v1/template.json",
|
||||||
|
"contentVersion": "1.0.0.0"
|
||||||
|
},
|
||||||
|
"parameters": {
|
||||||
|
"artifactsLocation": {
|
||||||
|
"value": "EXTENSION_URL_REPLACE"
|
||||||
|
},
|
||||||
|
"apiVersionDefault": {
|
||||||
|
"value": "[variables('apiVersionDefault')]"
|
||||||
|
},
|
||||||
|
"targetVMName": {
|
||||||
|
"value": "[concat(EXTENSION_TARGET_VM_NAME_PREFIX, copyIndex(EXTENSION_LOOP_OFFSET))]"
|
||||||
|
},
|
||||||
|
"extensionParameters": {
|
||||||
|
"value": "EXTENSION_PARAMETERS_REPLACE"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
{
|
||||||
|
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
|
||||||
|
"contentVersion": "1.0.0.0",
|
||||||
|
"parameters": {
|
||||||
|
"artifactsLocation": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"metadata": {
|
||||||
|
"description": "Artifacts Location - URL"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"apiVersionDefault": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"metadata": {
|
||||||
|
"description": "Compute API Version"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"targetVMName":{
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"metadata": {
|
||||||
|
"description": "Name of the vm to run the "
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"extensionParameters": {
|
||||||
|
"type": "securestring",
|
||||||
|
"minLength": 0,
|
||||||
|
"metadata": {
|
||||||
|
"description": "Custom Parameter for Extension - for hello-world, this is empty"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"variables": {
|
||||||
|
"singleQuote": "'",
|
||||||
|
"initScriptUrl": "[concat(parameters('artifactsLocation'), 'extensions/hello-world-dcos-windows/v1/hello-world-dcos.ps1')]"
|
||||||
|
},
|
||||||
|
"resources": [
|
||||||
|
{
|
||||||
|
"apiVersion": "[parameters('apiVersionDefault')]",
|
||||||
|
"dependsOn": [],
|
||||||
|
"location": "[resourceGroup().location]",
|
||||||
|
"type": "Microsoft.Compute/virtualMachines/extensions",
|
||||||
|
"name": "[concat(parameters('targetVMName'),'/waitforleader')]",
|
||||||
|
"properties": {
|
||||||
|
"publisher": "Microsoft.OSTCExtensions",
|
||||||
|
"type": "CustomScriptForLinux",
|
||||||
|
"typeHandlerVersion": "1.5",
|
||||||
|
"autoUpgradeMinorVersion": true,
|
||||||
|
"settings": {
|
||||||
|
"fileUris": [
|
||||||
|
"[variables('initScriptUrl')]"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"protectedSettings": {
|
||||||
|
"commandToExecute": "[concat('powershell \"./hello-world-dcos.ps1 ', variables('singleQuote'), parameters('extensionParameters'), variables('singleQuote'), ' >> c:/azuredata/hello-world-dcos-provision.log 2>&1 &\" &')]"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": { }
|
||||||
|
}
|
|
@ -37,7 +37,11 @@ param(
|
||||||
|
|
||||||
[string]
|
[string]
|
||||||
[AllowNull()]
|
[AllowNull()]
|
||||||
$customAttrs = ""
|
$customAttrs = "",
|
||||||
|
|
||||||
|
[string]
|
||||||
|
[AllowNull()]
|
||||||
|
$preprovisionExtensionParams = ""
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -139,7 +143,7 @@ try
|
||||||
# the output.
|
# the output.
|
||||||
Write-Log "Get the install script"
|
Write-Log "Get the install script"
|
||||||
|
|
||||||
Write-Log ("Parameters = isAgent = ["+ $isAgent + "] mastercount = ["+$MasterCount + "] First master ip= [" + $firstMasterIp+ "] boostrap URI = ["+ $bootstrapUri+"] Subnet = ["+ $subnet +"]" + " -customAttrs " + $customAttrs )
|
Write-Log ("Parameters = isAgent = ["+ $isAgent + "] mastercount = ["+$MasterCount + "] First master ip= [" + $firstMasterIp+ "] boostrap URI = ["+ $bootstrapUri+"] Subnet = ["+ $subnet +"]" + " -customAttrs " + $customAttrs + " -preprovisionExtensionParms = "+ $preprovisionExtensionParams )
|
||||||
|
|
||||||
# Get the boostrap script
|
# Get the boostrap script
|
||||||
|
|
||||||
|
@ -201,6 +205,8 @@ try
|
||||||
Write-Log "run setup script $run_cmd"
|
Write-Log "run setup script $run_cmd"
|
||||||
Invoke-Expression $run_cmd
|
Invoke-Expression $run_cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PREPROVISION_EXTENSION
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
|
|
|
@ -7,11 +7,11 @@
|
||||||
{{if IsPublic .Ports}}
|
{{if IsPublic .Ports}}
|
||||||
"{{.Name}}VMNamePrefix": "[concat('wp', variables('winResourceNamePrefix'), add(900,variables('{{.Name}}Index')))]",
|
"{{.Name}}VMNamePrefix": "[concat('wp', variables('winResourceNamePrefix'), add(900,variables('{{.Name}}Index')))]",
|
||||||
"{{.Name}}windowsAgentCustomAttributes": "[concat(' -customAttrs ', variables('doubleSingleQuote'), '{{GetDCOSWindowsAgentCustomNodeAttributes . }}', variables('doubleSingleQuote') )]",
|
"{{.Name}}windowsAgentCustomAttributes": "[concat(' -customAttrs ', variables('doubleSingleQuote'), '{{GetDCOSWindowsAgentCustomNodeAttributes . }}', variables('doubleSingleQuote') )]",
|
||||||
"{{.Name}}windowsAgentCustomScriptArguments": "[concat('$arguments = ', variables('singleQuote'), '-subnet ', variables('{{.Name}}Subnet'), ' -MasterCount ', variables('masterCount'), ' -firstMasterIP ', parameters('firstConsecutiveStaticIP'), ' -bootstrapUri ', '\"', variables('dcosWindowsBootstrapURL'), '\"', ' -isAgent $true -isPublic $true ', variables('{{.Name}}windowsAgentCustomAttributes'), variables('singleQuote'), ' ; ')]",
|
"{{.Name}}windowsAgentCustomScriptArguments": "[concat('$arguments = ', variables('singleQuote'), '-subnet ', variables('{{.Name}}Subnet'), ' -MasterCount ', variables('masterCount'), ' -firstMasterIP ', parameters('firstConsecutiveStaticIP'), ' -bootstrapUri ', '\"', variables('dcosWindowsBootstrapURL'), '\"', ' -isAgent $true -isPublic $true ', variables('{{.Name}}windowsAgentCustomAttributes'), ' -preprovisionExtensionParams \"{{GetDCOSWindowsAgentPreprovisionParameters .}}\"', variables('singleQuote'), ' ; ')]",
|
||||||
{{else}}
|
{{else}}
|
||||||
"{{.Name}}VMNamePrefix": "[concat('w', variables('winResourceNamePrefix'), add(900,variables('{{.Name}}Index')))]",
|
"{{.Name}}VMNamePrefix": "[concat('w', variables('winResourceNamePrefix'), add(900,variables('{{.Name}}Index')))]",
|
||||||
"{{.Name}}windowsAgentCustomAttributes": "[concat(' -customAttrs ', variables('doubleSingleQuote'), '{{GetDCOSWindowsAgentCustomNodeAttributes . }}', variables('doubleSingleQuote') )]",
|
"{{.Name}}windowsAgentCustomAttributes": "[concat(' -customAttrs ', variables('doubleSingleQuote'), '{{GetDCOSWindowsAgentCustomNodeAttributes . }}', variables('doubleSingleQuote') )]",
|
||||||
"{{.Name}}windowsAgentCustomScriptArguments": "[concat('$arguments = ', variables('singleQuote'), '-subnet ', variables('{{.Name}}Subnet'), ' -MasterCount ', variables('masterCount'), ' -firstMasterIP ', parameters('firstConsecutiveStaticIP'), ' -bootstrapUri ', '\"', variables('dcosWindowsBootstrapURL'), '\"', ' -isAgent $true -isPublic $false ', variables('{{.Name}}windowsAgentCustomAttributes'), variables('singleQuote'), ' ; ')]",
|
"{{.Name}}windowsAgentCustomScriptArguments": "[concat('$arguments = ', variables('singleQuote'), '-subnet ', variables('{{.Name}}Subnet'), ' -MasterCount ', variables('masterCount'), ' -firstMasterIP ', parameters('firstConsecutiveStaticIP'), ' -bootstrapUri ', '\"', variables('dcosWindowsBootstrapURL'), '\"', ' -isAgent $true -isPublic $false ', variables('{{.Name}}windowsAgentCustomAttributes'), ' -preprovisionExtensionParams \"{{GetDCOSWindowsAgentPreprovisionParameters .}}\"', variables('singleQuote'), ' ; ')]",
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
"{{.Name}}windowsAgentCustomScript": "[concat('powershell.exe -ExecutionPolicy Unrestricted -command \"', variables('{{.Name}}windowsAgentCustomScriptArguments'), variables('windowsCustomScriptSuffix'), '\" > %SYSTEMDRIVE%\\AzureData\\dcosWindowsProvision.log 2>&1')]",
|
"{{.Name}}windowsAgentCustomScript": "[concat('powershell.exe -ExecutionPolicy Unrestricted -command \"', variables('{{.Name}}windowsAgentCustomScriptArguments'), variables('windowsCustomScriptSuffix'), '\" > %SYSTEMDRIVE%\\AzureData\\dcosWindowsProvision.log 2>&1')]",
|
||||||
|
|
|
@ -71,7 +71,7 @@ mounts:
|
||||||
- /dcos/volume2
|
- /dcos/volume2
|
||||||
- - /dev/sdf1
|
- - /dev/sdf1
|
||||||
- /dcos/volume3
|
- /dcos/volume3
|
||||||
runcmd:
|
runcmd: PREPROVISION_EXTENSION
|
||||||
- - ln
|
- - ln
|
||||||
- -s
|
- -s
|
||||||
- /bin/rm
|
- /bin/rm
|
||||||
|
|
|
@ -1021,12 +1021,33 @@ func (t *TemplateGenerator) getTemplateFuncMap(cs *api.ContainerService) templat
|
||||||
return fmt.Sprintf("\"customData\": \"[base64(concat('#cloud-config\\n\\n', '%s'))]\",", str)
|
return fmt.Sprintf("\"customData\": \"[base64(concat('#cloud-config\\n\\n', '%s'))]\",", str)
|
||||||
},
|
},
|
||||||
"GetDCOSWindowsAgentCustomData": func(profile *api.AgentPoolProfile) string {
|
"GetDCOSWindowsAgentCustomData": func(profile *api.AgentPoolProfile) string {
|
||||||
str := getBase64CustomScript(dcosWindowsProvision)
|
agentPreprovisionExtension := ""
|
||||||
|
if profile.PreprovisionExtension != nil {
|
||||||
|
agentPreprovisionExtension += "\n"
|
||||||
|
agentPreprovisionExtension += makeAgentExtensionScriptCommands(cs, profile)
|
||||||
|
}
|
||||||
|
b, err := Asset(dcosWindowsProvision)
|
||||||
|
if err != nil {
|
||||||
|
// this should never happen and this is a bug
|
||||||
|
panic(fmt.Sprintf("BUG: %s", err.Error()))
|
||||||
|
}
|
||||||
|
// translate the parameters
|
||||||
|
csStr := string(b)
|
||||||
|
csStr = strings.Replace(csStr, "PREPROVISION_EXTENSION", agentPreprovisionExtension, -1)
|
||||||
|
csStr = strings.Replace(csStr, "\r\n", "\n", -1)
|
||||||
|
str := getBase64CustomScriptFromStr(csStr)
|
||||||
return fmt.Sprintf("\"customData\": \"%s\"", str)
|
return fmt.Sprintf("\"customData\": \"%s\"", str)
|
||||||
},
|
},
|
||||||
"GetDCOSWindowsAgentCustomNodeAttributes": func(profile *api.AgentPoolProfile) string {
|
"GetDCOSWindowsAgentCustomNodeAttributes": func(profile *api.AgentPoolProfile) string {
|
||||||
return getDCOSWindowsAgentCustomAttributes(profile)
|
return getDCOSWindowsAgentCustomAttributes(profile)
|
||||||
},
|
},
|
||||||
|
"GetDCOSWindowsAgentPreprovisionParameters": func(profile *api.AgentPoolProfile) string {
|
||||||
|
agentPreprovisionExtensionParameters := ""
|
||||||
|
if profile.PreprovisionExtension != nil {
|
||||||
|
agentPreprovisionExtensionParameters = getDCOSWindowsAgentPreprovisionParameters(cs, profile)
|
||||||
|
}
|
||||||
|
return agentPreprovisionExtensionParameters
|
||||||
|
},
|
||||||
"GetMasterAllowedSizes": func() string {
|
"GetMasterAllowedSizes": func() string {
|
||||||
if t.ClassicMode {
|
if t.ClassicMode {
|
||||||
return GetClassicAllowedSizes()
|
return GetClassicAllowedSizes()
|
||||||
|
@ -1609,6 +1630,10 @@ func makeAgentExtensionScriptCommands(cs *api.ContainerService, profile *api.Age
|
||||||
if profile.IsAvailabilitySets() {
|
if profile.IsAvailabilitySets() {
|
||||||
copyIndex = fmt.Sprintf("',copyIndex(variables('%sOffset')),'", profile.Name)
|
copyIndex = fmt.Sprintf("',copyIndex(variables('%sOffset')),'", profile.Name)
|
||||||
}
|
}
|
||||||
|
if profile.OSType == api.Windows {
|
||||||
|
return makeWindowsExtensionScriptCommands(profile.PreprovisionExtension,
|
||||||
|
cs.Properties.ExtensionProfiles, copyIndex)
|
||||||
|
}
|
||||||
return makeExtensionScriptCommands(profile.PreprovisionExtension,
|
return makeExtensionScriptCommands(profile.PreprovisionExtension,
|
||||||
cs.Properties.ExtensionProfiles, copyIndex)
|
cs.Properties.ExtensionProfiles, copyIndex)
|
||||||
}
|
}
|
||||||
|
@ -1633,6 +1658,42 @@ func makeExtensionScriptCommands(extension *api.Extension, extensionProfiles []*
|
||||||
scriptFilePath, scriptURL, scriptFilePath, scriptFilePath, extensionsParameterReference, extensionProfile.Name)
|
scriptFilePath, scriptURL, scriptFilePath, scriptFilePath, extensionsParameterReference, extensionProfile.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func makeWindowsExtensionScriptCommands(extension *api.Extension, extensionProfiles []*api.ExtensionProfile, copyIndex string) string {
|
||||||
|
var extensionProfile *api.ExtensionProfile
|
||||||
|
for _, eP := range extensionProfiles {
|
||||||
|
if strings.EqualFold(eP.Name, extension.Name) {
|
||||||
|
extensionProfile = eP
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if extensionProfile == nil {
|
||||||
|
panic(fmt.Sprintf("%s extension referenced was not found in the extension profile", extension.Name))
|
||||||
|
}
|
||||||
|
|
||||||
|
scriptURL := getExtensionURL(extensionProfile.RootURL, extensionProfile.Name, extensionProfile.Version, extensionProfile.Script, extensionProfile.URLQuery)
|
||||||
|
scriptFileDir := fmt.Sprintf("$env:SystemDrive:/AzureData/extensions/%s", extensionProfile.Name)
|
||||||
|
scriptFilePath := fmt.Sprintf("%s/%s", scriptFileDir, extensionProfile.Script)
|
||||||
|
return fmt.Sprintf("New-Item -ItemType Directory -Force -Path \"%s\" ; Invoke-WebRequest -Uri \"%s\" -OutFile \"%s\" ; powershell \"%s %s\"\n", scriptFileDir, scriptURL, scriptFilePath, scriptFilePath, "$preprovisionExtensionParams")
|
||||||
|
}
|
||||||
|
|
||||||
|
func getDCOSWindowsAgentPreprovisionParameters(cs *api.ContainerService, profile *api.AgentPoolProfile) string {
|
||||||
|
extension := profile.PreprovisionExtension
|
||||||
|
parms := ""
|
||||||
|
|
||||||
|
var extensionProfile *api.ExtensionProfile
|
||||||
|
|
||||||
|
for _, eP := range cs.Properties.ExtensionProfiles {
|
||||||
|
if strings.EqualFold(eP.Name, extension.Name) {
|
||||||
|
extensionProfile = eP
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
parms = extensionProfile.ExtensionParameters
|
||||||
|
return parms
|
||||||
|
}
|
||||||
|
|
||||||
func getPackageGUID(orchestratorType string, orchestratorVersion string, masterCount int) string {
|
func getPackageGUID(orchestratorType string, orchestratorVersion string, masterCount int) string {
|
||||||
if orchestratorType == api.DCOS {
|
if orchestratorType == api.DCOS {
|
||||||
switch orchestratorVersion {
|
switch orchestratorVersion {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче