Re-add windows ssh key (#390)

Adds a scaleset specific setup script, which allows us to save the scaleset based SSH keys into the VM on setup.
This commit is contained in:
bmc-msft
2021-01-04 14:52:27 -05:00
committed by GitHub
parent 3441790322
commit 4c2679d61e
4 changed files with 46 additions and 21 deletions

View File

@ -8,7 +8,7 @@ from typing import List, Optional
from uuid import UUID from uuid import UUID
from onefuzztypes.enums import OS, AgentMode from onefuzztypes.enums import OS, AgentMode
from onefuzztypes.models import AgentConfig, ReproConfig from onefuzztypes.models import AgentConfig, Pool, ReproConfig, Scaleset
from onefuzztypes.primitives import Extension, Region from onefuzztypes.primitives import Extension, Region
from .azure.containers import ( from .azure.containers import (
@ -22,16 +22,6 @@ from .azure.monitor import get_monitor_settings
from .azure.queue import get_queue_sas from .azure.queue import get_queue_sas
from .reports import get_report from .reports import get_report
# TODO: figure out how to create VM specific SSH keys for Windows.
#
# Previously done via task specific scripts:
# if is_windows and auth is not None:
# ssh_key = auth.public_key.strip()
# ssh_path = "$env:ProgramData/ssh/administrators_authorized_keys"
# commands += ['Set-Content -Path %s -Value "%s"' % (ssh_path, ssh_key)]
# return commands
def generic_extensions(region: Region, vm_os: OS) -> List[Extension]: def generic_extensions(region: Region, vm_os: OS) -> List[Extension]:
extensions = [monitor_extension(region, vm_os)] extensions = [monitor_extension(region, vm_os)]
@ -94,9 +84,24 @@ def dependency_extension(region: Region, vm_os: OS) -> Optional[Extension]:
return None return None
def build_pool_config(pool_name: str) -> str: def build_scaleset_script(pool: Pool, scaleset: Scaleset) -> str:
commands = []
extension = "ps1" if pool.os == OS.windows else "sh"
filename = f"{scaleset.scaleset_id}/scaleset-setup.{extension}"
sep = "\r\n" if pool.os == OS.windows else "\n"
if pool.os == OS.windows and scaleset.auth is not None:
ssh_key = scaleset.auth.public_key.strip()
ssh_path = "$env:ProgramData/ssh/administrators_authorized_keys"
commands += [f'Set-Content -Path {ssh_path} -Value "{ssh_key}"']
save_blob("vm-scripts", filename, sep.join(commands) + sep, StorageType.config)
return get_file_sas_url("vm-scripts", filename, StorageType.config, read=True)
def build_pool_config(pool: Pool) -> str:
config = AgentConfig( config = AgentConfig(
pool_name=pool_name, pool_name=pool.name,
onefuzz_url=get_instance_url(), onefuzz_url=get_instance_url(),
instrumentation_key=os.environ.get("APPINSIGHTS_INSTRUMENTATIONKEY"), instrumentation_key=os.environ.get("APPINSIGHTS_INSTRUMENTATIONKEY"),
heartbeat_queue=get_queue_sas( heartbeat_queue=get_queue_sas(
@ -108,16 +113,18 @@ def build_pool_config(pool_name: str) -> str:
instance_id=get_instance_id(), instance_id=get_instance_id(),
) )
filename = f"{pool.name}/config.json"
save_blob( save_blob(
"vm-scripts", "vm-scripts",
"%s/config.json" % pool_name, filename,
config.json(), config.json(),
StorageType.config, StorageType.config,
) )
return get_file_sas_url( return get_file_sas_url(
"vm-scripts", "vm-scripts",
"%s/config.json" % pool_name, filename,
StorageType.config, StorageType.config,
read=True, read=True,
) )
@ -240,10 +247,10 @@ def agent_config(
raise NotImplementedError("unsupported OS: %s" % vm_os) raise NotImplementedError("unsupported OS: %s" % vm_os)
def fuzz_extensions(region: Region, vm_os: OS, pool_name: str) -> List[Extension]: def fuzz_extensions(pool: Pool, scaleset: Scaleset) -> List[Extension]:
urls = [build_pool_config(pool_name)] urls = [build_pool_config(pool), build_scaleset_script(pool, scaleset)]
fuzz_extension = agent_config(region, vm_os, AgentMode.fuzz, urls=urls) fuzz_extension = agent_config(scaleset.region, pool.os, AgentMode.fuzz, urls=urls)
extensions = generic_extensions(region, vm_os) extensions = generic_extensions(scaleset.region, pool.os)
extensions += [fuzz_extension] extensions += [fuzz_extension]
return extensions return extensions

View File

@ -701,7 +701,7 @@ class Scaleset(BASE_SCALESET, ORMMixin):
return return
logging.info("creating scaleset: %s", self.scaleset_id) logging.info("creating scaleset: %s", self.scaleset_id)
extensions = fuzz_extensions(self.region, pool.os, self.pool_name) extensions = fuzz_extensions(pool, self)
result = create_vmss( result = create_vmss(
self.region, self.region,
self.scaleset_id, self.scaleset_id,
@ -1034,7 +1034,7 @@ class Scaleset(BASE_SCALESET, ORMMixin):
return return
logging.debug("updating scaleset configs: %s", self.scaleset_id) logging.debug("updating scaleset configs: %s", self.scaleset_id)
extensions = fuzz_extensions(self.region, pool.os, self.pool_name) extensions = fuzz_extensions(pool, self)
try: try:
update_extensions(self.scaleset_id, extensions) update_extensions(self.scaleset_id, extensions)
except UnableToUpdate: except UnableToUpdate:

View File

@ -11,6 +11,7 @@ INSTANCE_SETUP="/onefuzz/instance-specific-setup/setup.sh"
USER_SETUP="/onefuzz/setup/setup.sh" USER_SETUP="/onefuzz/setup/setup.sh"
TASK_SETUP="/onefuzz/bin/task-setup.sh" TASK_SETUP="/onefuzz/bin/task-setup.sh"
MANAGED_SETUP="/onefuzz/bin/managed.sh" MANAGED_SETUP="/onefuzz/bin/managed.sh"
SCALESET_SETUP="/onefuzz/bin/scaleset-setup.sh"
export ONEFUZZ_ROOT=/onefuzz export ONEFUZZ_ROOT=/onefuzz
export ASAN_SYMBOLIZER_PATH=/onefuzz/bin/llvm-symbolizer export ASAN_SYMBOLIZER_PATH=/onefuzz/bin/llvm-symbolizer
@ -44,6 +45,10 @@ fi
if [ -f /onefuzz/downloaded/repro-stdout.sh ]; then if [ -f /onefuzz/downloaded/repro-stdout.sh ]; then
mv /onefuzz/downloaded/repro-stdout.sh /onefuzz/bin/ mv /onefuzz/downloaded/repro-stdout.sh /onefuzz/bin/
fi fi
if [ -f /onefuzz/downloaded/scaleset-setup.sh ]; then
mv /onefuzz/downloaded/scaleset-setup.sh /onefuzz/bin
fi
chmod -R a+rx /onefuzz/bin chmod -R a+rx /onefuzz/bin
if [ -f ${MANAGED_SETUP} ]; then if [ -f ${MANAGED_SETUP} ]; then
@ -55,6 +60,15 @@ else
logger "onefuzz: no managed setup script" logger "onefuzz: no managed setup script"
fi fi
if [ -f ${SCALESET_SETUP} ]; then
logger "onefuzz: scaleset setup script start"
chmod +x ${SCALESET_SETUP}
${SCALESET_SETUP} 2>&1 | logger -s -i -t 'onefuzz-scaleset-setup'
logger "onefuzz: scaleset setup script stop"
else
logger "onefuzz: no scaleset setup script"
fi
if [ -f ${INSTANCE_SETUP} ]; then if [ -f ${INSTANCE_SETUP} ]; then
logger "onefuzz: instance setup script start" logger "onefuzz: instance setup script start"
chmod +x ${INSTANCE_SETUP} chmod +x ${INSTANCE_SETUP}

View File

@ -41,6 +41,10 @@ function Install-OnefuzzSetup {
log "onefuzz: executing managed-setup" log "onefuzz: executing managed-setup"
./managed.ps1 ./managed.ps1
} }
if (Test-Path -Path scaleset-setup.ps1) {
log "onefuzz: executing scaleset-setup"
./scaleset-setup.ps1
}
if (Test-Path -Path task-setup.ps1) { if (Test-Path -Path task-setup.ps1) {
log "onefuzz: executing task-setup" log "onefuzz: executing task-setup"
./task-setup.ps1 ./task-setup.ps1