From a1cf01959ee9159f3413f50066a90094319ad0c2 Mon Sep 17 00:00:00 2001 From: Thanh Ha Date: Tue, 26 Jun 2018 18:26:06 -0400 Subject: [PATCH] Use Ansible provisioner for Windows builds Issue: RELENG-939 RELENG-999 Change-Id: Ided88b444f76c5461bed313dc06ba79a51139c9c Signed-off-by: Thanh Ha --- .gitignore | 2 + provision/connection_plugins/packer.py | 295 +++++++++++++++++++++++++++++++++ provision/windows-builder.yaml | 32 ++++ provision/windows-user_data.ps1 | 5 + templates/windows-builder.json | 10 +- 5 files changed, 340 insertions(+), 4 deletions(-) create mode 100644 provision/connection_plugins/packer.py create mode 100644 provision/windows-builder.yaml diff --git a/.gitignore b/.gitignore index 11bb7e3..1b37311 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ .galaxy/ .tox/ +__pycache__/ docs/_build/ cloud-env.json +*.pyc *.retry diff --git a/provision/connection_plugins/packer.py b/provision/connection_plugins/packer.py new file mode 100644 index 0000000..f8b35e6 --- /dev/null +++ b/provision/connection_plugins/packer.py @@ -0,0 +1,295 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from ansible.plugins.connection.ssh import Connection as SSHConnection + +DOCUMENTATION = ''' + connection: packer + short_description: ssh based connections for powershell via packer + description: + - This connection plugin allows ansible to communicate to the target + packer machines via ssh based connections for powershell. + author: Packer + version_added: na + options: + host: + description: Hostname/ip to connect to. + default: inventory_hostname + vars: + - name: ansible_host + - name: ansible_ssh_host + host_key_checking: + description: Determines if ssh should check host keys + type: boolean + ini: + - section: defaults + key: 'host_key_checking' + - section: ssh_connection + key: 'host_key_checking' + version_added: '2.5' + env: + - name: ANSIBLE_HOST_KEY_CHECKING + - name: ANSIBLE_SSH_HOST_KEY_CHECKING + version_added: '2.5' + vars: + - name: ansible_host_key_checking + version_added: '2.5' + - name: ansible_ssh_host_key_checking + version_added: '2.5' + password: + description: + Authentication password for the C(remote_user). + Can be supplied as CLI option. + vars: + - name: ansible_password + - name: ansible_ssh_pass + ssh_args: + description: Arguments to pass to all ssh cli tools + default: '-C -o ControlMaster=auto -o ControlPersist=60s' + ini: + - section: 'ssh_connection' + key: 'ssh_args' + env: + - name: ANSIBLE_SSH_ARGS + ssh_common_args: + description: Common extra args for all ssh CLI tools + ini: + - section: 'ssh_connection' + key: 'ssh_common_args' + version_added: '2.7' + env: + - name: ANSIBLE_SSH_COMMON_ARGS + version_added: '2.7' + vars: + - name: ansible_ssh_common_args + ssh_executable: + default: ssh + description: + - This defines the location of the ssh binary. It defaults to `ssh` + which will use the first ssh binary available in $PATH. + - This option is usually not required, it might be useful when + access to system ssh is restricted, or when using ssh wrappers to + connect to remote hosts. + env: [{name: ANSIBLE_SSH_EXECUTABLE}] + ini: + - {key: ssh_executable, section: ssh_connection} + yaml: {key: ssh_connection.ssh_executable} + #const: ANSIBLE_SSH_EXECUTABLE + version_added: "2.2" + vars: + - name: ansible_ssh_executable + version_added: '2.7' + sftp_executable: + default: sftp + description: + - This defines the location of the sftp binary. It defaults to + ``sftp`` which will use the first binary available in $PATH. + env: [{name: ANSIBLE_SFTP_EXECUTABLE}] + ini: + - {key: sftp_executable, section: ssh_connection} + version_added: "2.6" + vars: + - name: ansible_sftp_executable + version_added: '2.7' + scp_executable: + default: scp + description: + - This defines the location of the scp binary. It defaults to `scp` + which will use the first binary available in $PATH. + env: [{name: ANSIBLE_SCP_EXECUTABLE}] + ini: + - {key: scp_executable, section: ssh_connection} + version_added: "2.6" + vars: + - name: ansible_scp_executable + version_added: '2.7' + scp_extra_args: + description: Extra exclusive to the ``scp`` CLI + vars: + - name: ansible_scp_extra_args + env: + - name: ANSIBLE_SCP_EXTRA_ARGS + version_added: '2.7' + ini: + - key: scp_extra_args + section: ssh_connection + version_added: '2.7' + sftp_extra_args: + description: Extra exclusive to the ``sftp`` CLI + vars: + - name: ansible_sftp_extra_args + env: + - name: ANSIBLE_SFTP_EXTRA_ARGS + version_added: '2.7' + ini: + - key: sftp_extra_args + section: ssh_connection + version_added: '2.7' + ssh_extra_args: + description: Extra exclusive to the 'ssh' CLI + vars: + - name: ansible_ssh_extra_args + env: + - name: ANSIBLE_SSH_EXTRA_ARGS + version_added: '2.7' + ini: + - key: ssh_extra_args + section: ssh_connection + version_added: '2.7' + retries: + # constant: ANSIBLE_SSH_RETRIES + description: Number of attempts to connect. + default: 3 + type: integer + env: + - name: ANSIBLE_SSH_RETRIES + ini: + - section: connection + key: retries + - section: ssh_connection + key: retries + vars: + - name: ansible_ssh_retries + version_added: '2.7' + port: + description: Remote port to connect to. + type: int + default: 22 + ini: + - section: defaults + key: remote_port + env: + - name: ANSIBLE_REMOTE_PORT + vars: + - name: ansible_port + - name: ansible_ssh_port + remote_user: + description: + - User name with which to login to the remote server, normally + set by the remote_user keyword. + - If no user is supplied, Ansible will let the ssh client binary + choose the user as it normally + ini: + - section: defaults + key: remote_user + env: + - name: ANSIBLE_REMOTE_USER + vars: + - name: ansible_user + - name: ansible_ssh_user + pipelining: + default: ANSIBLE_PIPELINING + description: + - Pipelining reduces the number of SSH operations required to + execute a module on the remote server, by executing many Ansible + modules without actual file transfer. + - This can result in a very significant performance improvement + when enabled. + - However this conflicts with privilege escalation (become). + For example, when using sudo operations you must first disable + 'requiretty' in the sudoers file for the target hosts, + which is why this feature is disabled by default. + env: + - name: ANSIBLE_PIPELINING + #- name: ANSIBLE_SSH_PIPELINING + ini: + - section: defaults + key: pipelining + #- section: ssh_connection + # key: pipelining + type: boolean + vars: + - name: ansible_pipelining + - name: ansible_ssh_pipelining + private_key_file: + description: + - Path to private key file to use for authentication + ini: + - section: defaults + key: private_key_file + env: + - name: ANSIBLE_PRIVATE_KEY_FILE + vars: + - name: ansible_private_key_file + - name: ansible_ssh_private_key_file + control_path: + description: + - This is the location to save ssh's ControlPath sockets, it uses + ssh's variable substitution. + - Since 2.3, if null, ansible will generate a unique hash. Use + `%(directory)s` to indicate where to use the control dir path + setting. + env: + - name: ANSIBLE_SSH_CONTROL_PATH + ini: + - key: control_path + section: ssh_connection + vars: + - name: ansible_control_path + version_added: '2.7' + control_path_dir: + default: ~/.ansible/cp + description: + - This sets the directory to use for ssh control path if the control + path setting is null. + - Also, provides the `%(directory)s` variable for the control path + setting. + env: + - name: ANSIBLE_SSH_CONTROL_PATH_DIR + ini: + - section: ssh_connection + key: control_path_dir + vars: + - name: ansible_control_path_dir + version_added: '2.7' + sftp_batch_mode: + default: 'yes' + description: 'TODO: write it' + env: [{name: ANSIBLE_SFTP_BATCH_MODE}] + ini: + - {key: sftp_batch_mode, section: ssh_connection} + type: bool + vars: + - name: ansible_sftp_batch_mode + version_added: '2.7' + scp_if_ssh: + default: smart + description: + - "Prefered method to use when transfering files over ssh" + - When set to smart, Ansible will try them until one succeeds or they + all fail + - If set to True, it will force 'scp', if False it will use 'sftp' + env: [{name: ANSIBLE_SCP_IF_SSH}] + ini: + - {key: scp_if_ssh, section: ssh_connection} + vars: + - name: ansible_scp_if_ssh + version_added: '2.7' + use_tty: + version_added: '2.5' + default: 'yes' + description: add -tt to ssh commands to force tty allocation + env: [{name: ANSIBLE_SSH_USETTY}] + ini: + - {key: usetty, section: ssh_connection} + type: bool + vars: + - name: ansible_ssh_use_tty + version_added: '2.7' +''' + +class Connection(SSHConnection): + '''ssh based connections for powershell via packer''' + + transport = 'packer' + has_pipelining = True + become_methods = [] + allow_executable = False + module_implementation_preferences = ('.ps1', '') + + def __init__(self, *args, **kwargs): + super(Connection, self).__init__(*args, **kwargs) diff --git a/provision/windows-builder.yaml b/provision/windows-builder.yaml new file mode 100644 index 0000000..fd9e0f3 --- /dev/null +++ b/provision/windows-builder.yaml @@ -0,0 +1,32 @@ +--- + +- hosts: all + + tasks: + - name: Install Tools + win_chocolatey: + name: '{{item}}' + state: present + with_items: + - cmake + - curl + - git + - openssh + - python2 + - python3 + - vim + - wget + - zulu8 + + - name: Install CMake + win_chocolatey: + name: cmake + state: present + install_args: ADD_CMAKE_TO_PATH=System + + - name: Install Visual Studio Community Edition + win_chocolatey: + name: '{{item}}' + with_items: + - visualstudio2017community + - visualstudio2017-workload-nativedesktop diff --git a/provision/windows-user_data.ps1 b/provision/windows-user_data.ps1 index fd23495..4e26e61 100644 --- a/provision/windows-user_data.ps1 +++ b/provision/windows-user_data.ps1 @@ -28,4 +28,9 @@ Stop-Service -Name WinRM Set-Service -Name WinRM -StartupType Automatic netsh advfirewall firewall set rule name="Windows Remote Management (HTTP-In)" new action=allow localip=any remoteip=any Start-Service -Name WinRM + +# Resize first partition of first disk to maximum size +Get-Partition -DiskNumber 0 -PartitionNumber 1 +$size = (Get-PartitionSupportedSize -DiskNumber 0 -PartitionNumber 1) +Resize-Partition -DiskNumber 0 -PartitionNumber 1 -Size $size.SizeMax diff --git a/templates/windows-builder.json b/templates/windows-builder.json index a2bb8fb..8b21fd6 100644 --- a/templates/windows-builder.json +++ b/templates/windows-builder.json @@ -14,7 +14,7 @@ "builders": [ { "name": "vexxhost", - "image_name": "{{user `distro`}} - win-builder - {{user `arch`}} - {{isotime \"20060102-150405.000\"}}", + "image_name": "ZZCI - {{user `distro`}} - win-builder - {{user `arch`}} - {{isotime \"20060102-150405.000\"}}", "instance_name": "{{user `distro`}}-win-builder-{{uuid}}", "source_image_name": "{{user `base_image`}}", "type": "openstack", @@ -40,9 +40,11 @@ ], "provisioners": [ { - "type": "powershell", - "inline": [ - "dir c:\\" + "type": "ansible", + "playbook_file": "provision/windows-builder.yaml", + "extra_arguments": [ + "--connection", "packer", + "--extra-vars", "ansible_shell_type=powershell ansible_shell_executable=None" ] } ] -- 2.16.6