Use Ansible provisioner for Windows builds 68/11568/14
authorThanh Ha <thanh.ha@linuxfoundation.org>
Tue, 26 Jun 2018 22:26:06 +0000 (18:26 -0400)
committerThanh Ha <thanh.ha@linuxfoundation.org>
Wed, 11 Jul 2018 00:30:33 +0000 (20:30 -0400)
Issue: RELENG-939 RELENG-999
Change-Id: Ided88b444f76c5461bed313dc06ba79a51139c9c
Signed-off-by: Thanh Ha <thanh.ha@linuxfoundation.org>
.gitignore
provision/connection_plugins/packer.py [new file with mode: 0644]
provision/windows-builder.yaml [new file with mode: 0644]
provision/windows-user_data.ps1
templates/windows-builder.json

index 11bb7e3..1b37311 100644 (file)
@@ -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 (file)
index 0000000..f8b35e6
--- /dev/null
@@ -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 (file)
index 0000000..fd9e0f3
--- /dev/null
@@ -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
index fd23495..4e26e61 100644 (file)
@@ -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
 </powershell>
index a2bb8fb..8b21fd6 100644 (file)
@@ -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",
   ],
   "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"
       ]
     }
   ]