Win patch (#11)
Add patching report for windows, cloud destroy VM, and Windows Full blueprint
6
cloud/blueprints/windows_full.yml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
vm_blueprint_providers:
|
||||||
|
- aws
|
||||||
|
aws_image_filter: 'Windows_Server-2019-English-Full-Base*'
|
||||||
|
aws_instance_size: t3.medium
|
||||||
|
aws_userdata_template: aws_windows_userdata
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
---
|
|
||||||
#######
|
|
||||||
# AWS VARS
|
|
||||||
#######
|
|
||||||
aws_vpc_name: ansible
|
|
||||||
aws_vpc_prefix: demo
|
|
||||||
aws_vpc_cidr_block: 10.0.0.0/16
|
|
||||||
aws_subnet_cidr: 10.0.1.0/24
|
|
||||||
aws_region: us-east-1
|
|
||||||
aws_vm_name: "{{ vm_name }}"
|
|
||||||
aws_vm_owner: "{{ vm_owner }}"
|
|
||||||
aws_blueprint: "{{ vm_blueprint }}"
|
|
||||||
aws_image_filter: "{{ omit }}"
|
|
||||||
aws_image_size: "{{ omit }}"
|
|
||||||
aws_image_architecture: "{{ omit }}"
|
|
||||||
aws_image_owners: "{{ omit }} "
|
|
||||||
aws_userdata_template: default
|
|
||||||
aws_keypair_name: "{{ aws_vpc_name }}-{{ aws_vpc_prefix }}-demo-key"
|
|
||||||
aws_securitygroup_name: "{{ aws_vpc_name }}-{{ aws_vpc_prefix }}-sec-group"
|
|
||||||
aws_env_tag: prod
|
|
||||||
aws_purpose_tag: ansible_demo
|
|
||||||
aws_ansiblegroup_tag: cloud
|
|
||||||
aws_ec2_wait: true
|
|
||||||
|
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
---
|
|
||||||
- name: AWS | CREATE INFRA | vpc
|
|
||||||
amazon.aws.ec2_vpc_net:
|
|
||||||
state: present
|
|
||||||
name: "{{ aws_vpc_name }}-{{ aws_vpc_prefix }}-vpc"
|
|
||||||
cidr_block: "{{ aws_vpc_cidr_block }}"
|
|
||||||
tenancy: default
|
|
||||||
region: "{{ aws_region }}"
|
|
||||||
tags:
|
|
||||||
owner: "{{ aws_vpc_name }}"
|
|
||||||
purpose: "{{ aws_purpose_tag }}"
|
|
||||||
register: aws_vpc
|
|
||||||
|
|
||||||
- name: AWS | CREATE INFRA | internet gateway
|
|
||||||
amazon.aws.ec2_vpc_igw:
|
|
||||||
state: present
|
|
||||||
vpc_id: "{{ aws_vpc.vpc.id }}"
|
|
||||||
region: "{{ aws_region }}"
|
|
||||||
tags:
|
|
||||||
Name: "{{ aws_vpc_name }}-{{aws_vpc_prefix }}-vpc-igw"
|
|
||||||
owner: "{{ aws_vpc_name }}"
|
|
||||||
purpose: "{{ aws_purpose_tag }}"
|
|
||||||
register: aws_gateway
|
|
||||||
|
|
||||||
- name: Create security group internal
|
|
||||||
amazon.aws.ec2_group:
|
|
||||||
state: present
|
|
||||||
name: "{{ aws_vpc_name }}-{{aws_vpc_prefix }}-sec-group"
|
|
||||||
region: "{{ aws_region }}"
|
|
||||||
description: Inbound WinRM and RDP, http for demo servers and internal AD ports
|
|
||||||
rules:
|
|
||||||
- proto: tcp
|
|
||||||
ports:
|
|
||||||
- 80 # HTTP
|
|
||||||
- 443 # HTTPS
|
|
||||||
- 22 # SSH
|
|
||||||
- 5986 # WinRM
|
|
||||||
- 3389 # RDP
|
|
||||||
cidr_ip: 0.0.0.0/0
|
|
||||||
- proto: icmp
|
|
||||||
to_port: -1
|
|
||||||
from_port: -1
|
|
||||||
cidr_ip: 0.0.0.0/0
|
|
||||||
- proto: tcp
|
|
||||||
ports:
|
|
||||||
- 80 # HTTP
|
|
||||||
- 5986 # WinRM
|
|
||||||
- 3389 # RDP
|
|
||||||
- 53 # DNS
|
|
||||||
- 88 # Kerberos Authentication
|
|
||||||
- 135 # RPC
|
|
||||||
- 139 # Netlogon
|
|
||||||
- 389 # LDAP
|
|
||||||
- 445 # SMB
|
|
||||||
- 464 # Kerberos Authentication
|
|
||||||
- 5432 # PostgreSQL
|
|
||||||
- 636 # LDAPS (LDAP over TLS)
|
|
||||||
- 873 # Rsync
|
|
||||||
- 3268-3269 # Global Catalog
|
|
||||||
- 1024-65535 # Ephemeral RPC ports
|
|
||||||
cidr_ip: 10.0.0.0/16
|
|
||||||
- proto: udp
|
|
||||||
ports:
|
|
||||||
- 53 # DNS
|
|
||||||
- 88 # Kerberos Authentication
|
|
||||||
- 123 # NTP
|
|
||||||
- 137-138 # Netlogon
|
|
||||||
- 389 # LDAP
|
|
||||||
- 445 # SMB
|
|
||||||
- 464 # Kerberos Authentication
|
|
||||||
- 1024-65535 # Ephemeral RPC ports
|
|
||||||
cidr_ip: 10.0.0.0/16
|
|
||||||
rules_egress:
|
|
||||||
- proto: -1
|
|
||||||
cidr_ip: 0.0.0.0/0
|
|
||||||
vpc_id: "{{ aws_vpc.vpc.id }}"
|
|
||||||
tags:
|
|
||||||
Name: "{{ aws_vpc_name }}-{{aws_vpc_prefix }}-sec-group"
|
|
||||||
owner: "{{ aws_vpc_name }}"
|
|
||||||
purpose: "{{ aws_purpose_tag }}"
|
|
||||||
|
|
||||||
- name: Create a subnet on the VPC
|
|
||||||
amazon.aws.ec2_vpc_subnet:
|
|
||||||
state: present
|
|
||||||
vpc_id: "{{ aws_vpc.vpc.id }}"
|
|
||||||
cidr: "{{ aws_subnet_cidr }}"
|
|
||||||
region: "{{ aws_region }}"
|
|
||||||
map_public: yes
|
|
||||||
tags:
|
|
||||||
Name: "{{ aws_vpc_name }}-{{aws_vpc_prefix }}-subnet"
|
|
||||||
owner: "{{ aws_vpc_name }}"
|
|
||||||
purpose: "{{ aws_purpose_tag }}"
|
|
||||||
register: aws_subnet
|
|
||||||
|
|
||||||
- name: Create a subnet route table
|
|
||||||
amazon.aws.ec2_vpc_route_table:
|
|
||||||
state: present
|
|
||||||
vpc_id: "{{ aws_vpc.vpc.id }}"
|
|
||||||
region: "{{ aws_region }}"
|
|
||||||
subnets:
|
|
||||||
- "{{ aws_subnet.subnet.id }}"
|
|
||||||
routes:
|
|
||||||
- dest: 0.0.0.0/0
|
|
||||||
gateway_id: "{{ aws_gateway.gateway_id }}"
|
|
||||||
tags:
|
|
||||||
Name: "{{ aws_vpc_name }}-{{aws_vpc_prefix }}-vpc-rtbl"
|
|
||||||
owner: "{{ aws_vpc_name }}"
|
|
||||||
purpose: "{{ aws_purpose_tag }}"
|
|
||||||
|
|
||||||
- name: Create AWS keypair
|
|
||||||
amazon.aws.ec2_key:
|
|
||||||
name: "{{ aws_vpc_name }}-{{aws_vpc_prefix }}-demo-key"
|
|
||||||
region: "{{ aws_region }}"
|
|
||||||
key_material: "{{ aws_public_key }}"
|
|
||||||
state: present
|
|
||||||
tags:
|
|
||||||
owner: "{{ aws_vpc_name }}"
|
|
||||||
purpose: "{{ aws_purpose_tag }}"
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
---
|
|
||||||
- name: AWS | CREATE VM | get subnet info
|
|
||||||
amazon.aws.ec2_vpc_subnet_info:
|
|
||||||
region: "{{ aws_region }}"
|
|
||||||
filters:
|
|
||||||
"tag:Name": "{{ aws_vpc_name }}-{{ aws_vpc_prefix }}-subnet"
|
|
||||||
register: aws_subnet
|
|
||||||
|
|
||||||
- name: AWS | CREATE VM | save subnet id
|
|
||||||
set_fact:
|
|
||||||
aws_subnet_id: "{{ aws_subnet.subnets|map(attribute='id')| list | last }}"
|
|
||||||
|
|
||||||
- name: AWS| CREATE VM | find ami
|
|
||||||
amazon.aws.ec2_ami_info:
|
|
||||||
region: "{{ aws_region }}"
|
|
||||||
owners: "{{ aws_image_owners }}"
|
|
||||||
filters:
|
|
||||||
name: "{{ aws_image_filter }}"
|
|
||||||
architecture: "{{ aws_image_architecture }}"
|
|
||||||
register: amis
|
|
||||||
|
|
||||||
- name: AWS| CREATE VM | save ami
|
|
||||||
set_fact:
|
|
||||||
aws_instance_ami: >
|
|
||||||
{{ amis.images | selectattr('name', 'defined') | sort(attribute='creation_date') | last }}
|
|
||||||
|
|
||||||
- name: AWS| CREATE VM | create instance
|
|
||||||
amazon.aws.ec2_instance:
|
|
||||||
network:
|
|
||||||
assign_public_ip: yes
|
|
||||||
key_name: "{{ aws_keypair_name }}"
|
|
||||||
instance_type: "{{ aws_instance_size }}"
|
|
||||||
image_id: "{{ aws_instance_ami.image_id }}"
|
|
||||||
region: "{{ aws_region }}"
|
|
||||||
security_group: "{{ aws_securitygroup_name }}"
|
|
||||||
tags:
|
|
||||||
blueprint: "{{ aws_blueprint }}"
|
|
||||||
purpose: "{{ aws_purpose_tag }}"
|
|
||||||
env: "{{ aws_env_tag }}"
|
|
||||||
ansible_group: "{{ aws_ansiblegroup_tag }}"
|
|
||||||
owner: "{{ aws_vm_owner }}"
|
|
||||||
info: "This instance was built by Red Hat Product Demos"
|
|
||||||
Name: "{{ aws_vm_name }}"
|
|
||||||
wait: "{{ aws_ec2_wait }}"
|
|
||||||
vpc_subnet_id: "{{ aws_subnet_id }}"
|
|
||||||
user_data: "{{ lookup('template', aws_userdata_template+'.j2', template_vars=dict(aws_vm_name=vm_name)) }}"
|
|
||||||
register: aws_vm_output
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
<powershell>
|
|
||||||
# Disable .Net Optimization Service
|
|
||||||
Get-ScheduledTask *ngen* | Disable-ScheduledTask
|
|
||||||
|
|
||||||
# Disable Windows Auto Updates
|
|
||||||
# https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/troubleshooting-windows-instances.html#high-cpu-issue
|
|
||||||
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update" /v AUOptions /t REG_DWORD /d 1 /f
|
|
||||||
net stop wuauserv
|
|
||||||
net start wuauserv
|
|
||||||
|
|
||||||
# Remove policies stopping us from enabling WinRM
|
|
||||||
reg delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WinRM\Service" /v AllowBasic /f
|
|
||||||
reg delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WinRM\Service" /v AllowUnencryptedTraffic /f
|
|
||||||
reg delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WinRM\Service" /v DisableRunAs /f
|
|
||||||
|
|
||||||
# Disable Windows Defender Monitoring
|
|
||||||
Set-MpPreference -DisableRealtimeMonitoring $true
|
|
||||||
|
|
||||||
# Enable WinRM
|
|
||||||
Invoke-WebRequest -Uri https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1 -OutFile C:\ConfigureRemotingForAnsible.ps1
|
|
||||||
C:\ConfigureRemotingForAnsible.ps1 -ForceNewSSLCert -EnableCredSSP
|
|
||||||
|
|
||||||
# add ec2-user
|
|
||||||
$Password = ConvertTo-SecureString {{ ansible_password }} -AsPlainText -Force
|
|
||||||
New-LocalUser -Name "ec2-user" -Description "Ansible Service Account" -Password $Password
|
|
||||||
Add-LocalGroupMember -Group "Administrators" -Member "ec2-user"
|
|
||||||
|
|
||||||
Rename-Computer -NewName {{ aws_vm_name }} -Force -Restart
|
|
||||||
</powershell>
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
##############
|
|
||||||
# Azure Vars
|
|
||||||
##############
|
|
||||||
az_region:
|
|
||||||
az_rg_name: ansible
|
|
||||||
az_rg_prefix: demo
|
|
||||||
az_vnet_cidr_block: 10.0.0.0/16
|
|
||||||
az_subnet_cidr: 10.0.1.0/24
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
---
|
|
||||||
- name: AZURE | CREATE INFRA | resource group
|
|
||||||
azure.azcollection.azure_rm_resourcegroup:
|
|
||||||
name: "{{ az_rg_name }}-{{ az_rg_prefix }}-rg"
|
|
||||||
location: "{{ az_region }}"
|
|
||||||
|
|
||||||
- name: AZURE | CREATE INFRA | virtual network
|
|
||||||
azure.azcollection.azure_rm_virtualnetwork:
|
|
||||||
resource_group: "{{ az_rg_name }}-{{ az_rg_prefix }}-rg"
|
|
||||||
name: "{{ az_rg_name }}-{{ az_rg_prefix }}-vnet"
|
|
||||||
address_prefixes: "{{ az_vnet_cidr }}"
|
|
||||||
|
|
||||||
- name: AZURE | CREATE INFRA | subnet
|
|
||||||
azure.azcollection.azure_rm_subnet:
|
|
||||||
resource_group: "{{ az_rg_name }}-{{ az_rg_prefix }}-rg"
|
|
||||||
name: "{{ az_rg_name }}-{{ az_rg_prefix }}-subnet }}"
|
|
||||||
address_prefix: "{{ az_subnet_cidr }}"
|
|
||||||
virtual_network: "{{ az_rg_name }}-{{ az_rg_prefix }}-vnet"
|
|
||||||
|
|
||||||
- name: AZURE | CREATE INFRA | security group
|
|
||||||
azure.azcollection.azure_rm_securitygroup:
|
|
||||||
resource_group: "{{ az_rg_name }}-{{ az_rg_prefix }}-rg"
|
|
||||||
name: "{{ az_rg_name }}-{{ az_rg_prefix }}-sec-group"
|
|
||||||
rules:
|
|
||||||
- name: External
|
|
||||||
protocol: Tcp
|
|
||||||
destination_port_range:
|
|
||||||
- 80 # HTTP
|
|
||||||
- 443 # HTTPS
|
|
||||||
- 5986 # WinRM
|
|
||||||
- 3389 # RDP
|
|
||||||
access: Allow
|
|
||||||
priority: 1001
|
|
||||||
direction: Inbound
|
|
||||||
- name: Ping
|
|
||||||
protocol: Icmp
|
|
||||||
access: Allow
|
|
||||||
priority: 1002
|
|
||||||
direction: Inbound
|
|
||||||
- name: Internal TCP
|
|
||||||
protocol: Tcp
|
|
||||||
destination_port_range:
|
|
||||||
- 80 # HTTP
|
|
||||||
- 5986 # WinRM
|
|
||||||
- 3389 # RDP
|
|
||||||
- 53 # DNS
|
|
||||||
- 88 # Kerberos Authentication
|
|
||||||
- 135 # RPC
|
|
||||||
- 139 # Netlogon
|
|
||||||
- 389 # LDAP
|
|
||||||
- 445 # SMB
|
|
||||||
- 464 # Kerberos Authentication
|
|
||||||
- 5432 # PostgreSQL
|
|
||||||
- 636 # LDAPS (LDAP over TLS)
|
|
||||||
- 873 # Rsync
|
|
||||||
- 3268-3269 # Global Catalog
|
|
||||||
- 1024-65535 # Ephemeral RPC ports
|
|
||||||
access: Allow
|
|
||||||
priority: 1003
|
|
||||||
direction: Inbound
|
|
||||||
source_address_prefix: "{{ az_vnet_cidr_block }}"
|
|
||||||
- name: Internal UDP
|
|
||||||
protocol: Udp
|
|
||||||
destination_port_range:
|
|
||||||
- 53 # DNS
|
|
||||||
- 88 # Kerberos Authentication
|
|
||||||
- 123 # NTP
|
|
||||||
- 137-138 # Netlogon
|
|
||||||
- 389 # LDAP
|
|
||||||
- 445 # SMB
|
|
||||||
- 464 # Kerberos Authentication
|
|
||||||
- 1024-65535 # Ephemeral RPC ports
|
|
||||||
access: Allow
|
|
||||||
priority: 1004
|
|
||||||
direction: Inbound
|
|
||||||
source_address_prefix: "{{ az_vnet_cidr_block }}"
|
|
||||||
@@ -4,9 +4,13 @@
|
|||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
- name: list systems to be destroyed
|
- name: list systems to be destroyed
|
||||||
|
debug:
|
||||||
|
msg: "{{ inventory_hostname }}"
|
||||||
|
|
||||||
|
- name: pause for review...
|
||||||
pause:
|
pause:
|
||||||
seconds: 30
|
seconds: 30
|
||||||
prompt: "{{ inventory_hostname }} will be DESTROYED in 30 seconds. Cancel the job to Abort."
|
prompt: "Systems listed above will be DESTROYED in 30 seconds. Cancel the job to Abort."
|
||||||
|
|
||||||
- name: destroy vm
|
- name: destroy vm
|
||||||
include_role:
|
include_role:
|
||||||
|
|||||||
@@ -98,6 +98,28 @@ controller_templates:
|
|||||||
variable: vm_blueprint
|
variable: vm_blueprint
|
||||||
required: true
|
required: true
|
||||||
choices: #"{{ lookup('fileglob', 'blueprints/*.yml') | regex_replace(',','\n') | regex_findall('.*/(.*)(?=.yml)') | list }}"
|
choices: #"{{ lookup('fileglob', 'blueprints/*.yml') | regex_replace(',','\n') | regex_findall('.*/(.*)(?=.yml)') | list }}"
|
||||||
- windows
|
- windows_core
|
||||||
|
- windows_full
|
||||||
- rhel8
|
- rhel8
|
||||||
- rhel7
|
- rhel7
|
||||||
|
- name: Cloud / Destroy VM
|
||||||
|
job_type: run
|
||||||
|
organization: Default
|
||||||
|
credentials:
|
||||||
|
- AWS
|
||||||
|
- Workshop Credential
|
||||||
|
project: Ansible official demo project
|
||||||
|
playbook: cloud/destroy_vm.yml
|
||||||
|
inventory: Workshop Inventory
|
||||||
|
execution_environment: Default execution environment
|
||||||
|
survey_enabled: true
|
||||||
|
extra_vars:
|
||||||
|
aws_region: us-east-2
|
||||||
|
survey:
|
||||||
|
name: ''
|
||||||
|
description: ''
|
||||||
|
spec:
|
||||||
|
- question_name: Name or Pattern
|
||||||
|
type: text
|
||||||
|
variable: HOSTS
|
||||||
|
required: true
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
- name: AWS| CREATE VM | save ami
|
- name: AWS| CREATE VM | save ami
|
||||||
set_fact:
|
set_fact:
|
||||||
aws_instance_ami: >
|
aws_instance_ami: >
|
||||||
{{ amis.images | selectattr('name', 'defined') | sort(attribute='creation_date') | last }}
|
{{ (amis.images | selectattr('name', 'defined') | sort(attribute='creation_date'))[-2] }}
|
||||||
|
|
||||||
- name: AWS| CREATE VM | create instance
|
- name: AWS| CREATE VM | create instance
|
||||||
amazon.aws.ec2_instance:
|
amazon.aws.ec2_instance:
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
file_path: /var/www/html
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
- name: Create HTML report
|
|
||||||
ansible.builtin.template:
|
|
||||||
src: report.j2
|
|
||||||
dest: "{{ file_path }}/windowspatch.html"
|
|
||||||
check_mode: no
|
|
||||||
|
|
||||||
- name: Copy CSS over
|
|
||||||
ansible.builtin.copy:
|
|
||||||
src: "css"
|
|
||||||
dest: "{{ file_path }}"
|
|
||||||
directory_mode: true
|
|
||||||
check_mode: no
|
|
||||||
|
|
||||||
- name: Copy logo over
|
|
||||||
ansible.builtin.copy:
|
|
||||||
src: "webpage_logo.png"
|
|
||||||
dest: "{{ file_path }}"
|
|
||||||
directory_mode: true
|
|
||||||
check_mode: no
|
|
||||||
|
|
||||||
- name: Display link to Patch report
|
|
||||||
ansible.builtin.debug:
|
|
||||||
msg: "Please go to http://{{ ansible_host }}/windowspatch.html"
|
|
||||||
|
|
||||||
- name: Send Report via E-mail
|
|
||||||
community.general.mail:
|
|
||||||
host: "{{ EMAIL_HOST }}"
|
|
||||||
username: "{{ EMAIL_USERNAME }}"
|
|
||||||
password: "{{ EMAIL_PASSWORD }}"
|
|
||||||
port: "{{ EMAIL_PORT }}"
|
|
||||||
subject: "Windows Patching Report"
|
|
||||||
body: "{{ lookup('template', 'report.j2') }}"
|
|
||||||
from: "{{ EMAIL_FROM }}"
|
|
||||||
to: "{{ EMAIL_TO }}"
|
|
||||||
subtype: html
|
|
||||||
delegate_to: localhost
|
|
||||||
become: false
|
|
||||||
check_mode: no
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
file_path: /var/www/html
|
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
win_update_categories:
|
||||||
|
- Application
|
||||||
|
- Connectors
|
||||||
|
- CriticalUpdates
|
||||||
|
- DefinitionUpdates
|
||||||
|
- DeveloperKits
|
||||||
|
- FeaturePacks Guidance
|
||||||
|
- SecurityUpdates
|
||||||
|
- ServicePacks
|
||||||
|
- Tools
|
||||||
|
- UpdateRollups
|
||||||
|
- Updates
|
||||||
|
allow_reboot: true
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
- name: Scan packages
|
||||||
|
demo.patching.win_scan_packages:
|
||||||
|
check_mode: no
|
||||||
|
|
||||||
|
- name: Scan Services
|
||||||
|
demo.patching.win_scan_services:
|
||||||
|
check_mode: no
|
||||||
|
|
||||||
|
- name: Install Windows Updates
|
||||||
|
ansible.windows.win_updates:
|
||||||
|
category_names: "{{ win_update_categories | default(omit) }}"
|
||||||
|
reboot: "{{ allow_reboot }}"
|
||||||
|
state: installed
|
||||||
|
register: patchingresult
|
||||||
@@ -24,4 +24,4 @@
|
|||||||
|
|
||||||
- name: display link to inventory report
|
- name: display link to inventory report
|
||||||
ansible.builtin.debug:
|
ansible.builtin.debug:
|
||||||
msg: "Please go to http://{{ ansible_host }}/reports/linux.html"
|
msg: "Please go to http://{{ hostvars[report_server]['ansible_host'] }}/reports/linux.html"
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
- name: Display link to Linux patch report
|
- name: Display link to Linux patch report
|
||||||
ansible.builtin.debug:
|
ansible.builtin.debug:
|
||||||
msg: "Please go to http://{{ ansible_host }}/reports/linuxpatch.html"
|
msg: "Please go to http://{{ hostvars[report_server]['ansible_host'] }}/reports/linuxpatch.html"
|
||||||
|
|
||||||
#- name: Send Report via E-mail
|
#- name: Send Report via E-mail
|
||||||
# community.general.mail:
|
# community.general.mail:
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
- yum:
|
||||||
|
name: httpd
|
||||||
|
state: latest
|
||||||
|
check_mode: no
|
||||||
|
|
||||||
|
- file:
|
||||||
|
path: /var/www/html/reports/
|
||||||
|
state: directory
|
||||||
|
check_mode: no
|
||||||
|
|
||||||
|
- copy:
|
||||||
|
dest: /var/www/html/reports/.htaccess
|
||||||
|
content: Options +Indexes
|
||||||
|
check_mode: no
|
||||||
|
|
||||||
|
- service:
|
||||||
|
name: httpd
|
||||||
|
state: started
|
||||||
|
check_mode: no
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
- name: Install IIS
|
||||||
|
ansible.windows.win_feature:
|
||||||
|
name: Web-Server
|
||||||
|
state: present
|
||||||
|
check_mode: no
|
||||||
|
|
||||||
|
- name: Start IIS service
|
||||||
|
ansible.windows.win_service:
|
||||||
|
name: W3Svc
|
||||||
|
state: started
|
||||||
|
check_mode: no
|
||||||
|
|
||||||
|
- name: Create Directory
|
||||||
|
ansible.windows.win_file:
|
||||||
|
path: C:\Inetpub\wwwroot\reports
|
||||||
|
state: directory
|
||||||
|
check_mode: no
|
||||||
|
|
||||||
|
- name: Enable Directory Browsing
|
||||||
|
ansible.windows.win_powershell:
|
||||||
|
script: |
|
||||||
|
"Set-WebConfigurationProperty -filter /system.webServer/directoryBrowse -name enabled -value true -PSPath 'IIS:\Sites\Default Web Site\reports'"
|
||||||
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 45 KiB |
@@ -1,16 +1,19 @@
|
|||||||
|
---
|
||||||
- name: create HTML report
|
- name: create HTML report
|
||||||
ansible.builtin.template:
|
ansible.windows.win_template:
|
||||||
src: report.j2
|
src: report.j2
|
||||||
dest: "{{ file_path }}/windows.html"
|
dest: "{{ file_path }}/windows.html"
|
||||||
|
check_mode: no
|
||||||
|
|
||||||
- name: copy CSS over
|
- name: copy CSS over
|
||||||
ansible.builtin.copy:
|
ansible.windows.win_copy:
|
||||||
src: "css"
|
src: "css"
|
||||||
dest: "{{ file_path }}"
|
dest: "{{ file_path }}"
|
||||||
directory_mode: true
|
directory_mode: true
|
||||||
|
check_mode: no
|
||||||
|
|
||||||
- name: copy logos over
|
- name: copy logos over
|
||||||
ansible.builtin.copy:
|
ansible.windows.win_copy:
|
||||||
src: "{{ item }}"
|
src: "{{ item }}"
|
||||||
dest: "{{ file_path }}"
|
dest: "{{ file_path }}"
|
||||||
directory_mode: true
|
directory_mode: true
|
||||||
@@ -18,7 +21,8 @@
|
|||||||
- "webpage_logo.png"
|
- "webpage_logo.png"
|
||||||
- "redhat-ansible-logo.svg"
|
- "redhat-ansible-logo.svg"
|
||||||
- "server.png"
|
- "server.png"
|
||||||
|
check_mode: no
|
||||||
|
|
||||||
- name: display link to inventory report
|
#- name: display link to inventory report
|
||||||
ansible.builtin.debug:
|
# ansible.builtin.debug:
|
||||||
msg: "Please go to http://{{ ansible_host }}/windows.html"
|
# msg: "Please go to http://{{ host_vars[report_server]['ansible_host'] }}/reports/windows.html"
|
||||||
@@ -75,7 +75,7 @@ collapsible: true
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for windows_host in groups['tag_Windows']|sort %}
|
{% for windows_host in ansible_play_hosts |sort %}
|
||||||
<tr>
|
<tr>
|
||||||
<td class="summary_info">
|
<td class="summary_info">
|
||||||
<div id="hostname">
|
<div id="hostname">
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
file_path: C:\Inetpub\wwwroot\reports
|
||||||
|
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 111 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB |
@@ -0,0 +1,23 @@
|
|||||||
|
- name: Create HTML report
|
||||||
|
ansible.windows.win_template:
|
||||||
|
src: report.j2
|
||||||
|
dest: "{{ file_path }}/windowspatch.html"
|
||||||
|
check_mode: no
|
||||||
|
|
||||||
|
- name: Copy CSS over
|
||||||
|
ansible.windows.win_copy:
|
||||||
|
src: "css"
|
||||||
|
dest: "{{ file_path }}"
|
||||||
|
directory_mode: true
|
||||||
|
check_mode: no
|
||||||
|
|
||||||
|
- name: Copy logo over
|
||||||
|
ansible.windows.win_copy:
|
||||||
|
src: "webpage_logo.png"
|
||||||
|
dest: "{{ file_path }}"
|
||||||
|
directory_mode: true
|
||||||
|
check_mode: no
|
||||||
|
|
||||||
|
- name: Display link to Patch report
|
||||||
|
ansible.builtin.debug:
|
||||||
|
msg: "Please go to http://{{ hostvars[report_server]['ansible_host'] }}/reports/windowspatch.html"
|
||||||
@@ -27,16 +27,16 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for windows_host in groups['tag_Windows']|sort %}
|
{% for windows_host in ansible_play_hosts |sort %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{hostvars[windows_host]['inventory_hostname']}}</td>
|
<td>{{hostvars[windows_host]['inventory_hostname']}}</td>
|
||||||
<td>{{hostvars[windows_host]['ansible_distribution']|default("none")}}</td>
|
<td>{{hostvars[windows_host]['ansible_distribution']|default("none")}}</td>
|
||||||
<td>
|
<td>
|
||||||
<ul>
|
<ul>
|
||||||
|
|
||||||
{% if hostvars[windows_host].patchresult.updates is defined and hostvars[windows_host].patchresult.found_update_count|int > 0 %}
|
{% if hostvars[windows_host].patchingresult.updates is defined and hostvars[windows_host].patchingresult.found_update_count|int > 0 %}
|
||||||
{% for update in hostvars[windows_host].patchresult.updates %}
|
{% for update in hostvars[windows_host].patchingresult.updates %}
|
||||||
{% set updatenum = hostvars[windows_host].patchresult.updates[update] %}
|
{% set updatenum = hostvars[windows_host].patchingresult.updates[update] %}
|
||||||
<li>{{updatenum.title}}</li>
|
<li>{{updatenum.title}}</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% else %}
|
{% else %}
|
||||||
@@ -49,9 +49,7 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
{% for host in ansible_play_hosts %}
|
<center><p>Created with Ansible on {{hostvars[inventory_hostname].ansible_date_time.iso8601}}</p></center>
|
||||||
<center><p>Created with Ansible on {{hostvars[host].ansible_date_time.iso8601}}</p></center>
|
|
||||||
{% endfor %}
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
function tableToCSV() {
|
function tableToCSV() {
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
file_path: C:\Inetpub\wwwroot\reports
|
||||||
@@ -12,6 +12,8 @@ collections:
|
|||||||
#windows
|
#windows
|
||||||
- chocolatey.chocolatey
|
- chocolatey.chocolatey
|
||||||
- community.windows
|
- community.windows
|
||||||
|
- name: ansible.windows
|
||||||
|
version: 1.9.0
|
||||||
#cloud
|
#cloud
|
||||||
- name: azure.azcollection
|
- name: azure.azcollection
|
||||||
version: 1.11.0
|
version: 1.11.0
|
||||||
|
|||||||
22
windows/patching.yml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
- name: Windows updates
|
||||||
|
hosts: "{{ HOSTS | default('os_windows') }}"
|
||||||
|
vars:
|
||||||
|
report_server: win1
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- include_role:
|
||||||
|
name: demo.patching.patch_windows
|
||||||
|
|
||||||
|
- block:
|
||||||
|
- include_role:
|
||||||
|
name: demo.patching.report_server
|
||||||
|
tasks_from: iis
|
||||||
|
|
||||||
|
- include_role:
|
||||||
|
name: demo.patching.report_windows
|
||||||
|
|
||||||
|
- include_role:
|
||||||
|
name: demo.patching.report_windows_patching
|
||||||
|
delegate_to: "{{ report_server }}"
|
||||||
|
run_once: yes
|
||||||
@@ -74,11 +74,13 @@ controller_templates:
|
|||||||
variable: iis_message
|
variable: iis_message
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- name: "WINDOWS / Windows updates"
|
- name: "WINDOWS / Patching"
|
||||||
job_type: run
|
use_fact_cache: true
|
||||||
|
job_type: check
|
||||||
|
ask_job_type_on_launch: yes
|
||||||
inventory: "Workshop Inventory"
|
inventory: "Workshop Inventory"
|
||||||
project: "Ansible official demo project"
|
project: "Ansible official demo project"
|
||||||
playbook: "windows/windows_updates.yml"
|
playbook: "windows/patching.yml"
|
||||||
execution_environment: Default execution environment
|
execution_environment: Default execution environment
|
||||||
credentials:
|
credentials:
|
||||||
- "Workshop Credential"
|
- "Workshop Credential"
|
||||||
@@ -92,8 +94,8 @@ controller_templates:
|
|||||||
variable: HOSTS
|
variable: HOSTS
|
||||||
required: false
|
required: false
|
||||||
- question_name: Update categories
|
- question_name: Update categories
|
||||||
type: multiplechoice
|
type: multiselect
|
||||||
variable: categories
|
variable: win_update_categories
|
||||||
required: false
|
required: false
|
||||||
default: SecurityUpdates
|
default: SecurityUpdates
|
||||||
choices:
|
choices:
|
||||||
@@ -110,7 +112,7 @@ controller_templates:
|
|||||||
- Updates
|
- Updates
|
||||||
- question_name: Reboot after install?
|
- question_name: Reboot after install?
|
||||||
type: multiplechoice
|
type: multiplechoice
|
||||||
variable: reboot_server
|
variable: allow_reboot
|
||||||
required: false
|
required: false
|
||||||
default: 'Yes'
|
default: 'Yes'
|
||||||
choices:
|
choices:
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Windows updates
|
|
||||||
hosts: "{{ HOSTS | default('windows') }}"
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
- name: Install Windows Updates
|
|
||||||
win_updates:
|
|
||||||
category_names: "{{ categories | default(omit) }}"
|
|
||||||
reboot: '{{ reboot_server | default(yes) }}'
|
|
||||||