Update build vm. Remove old role

This commit is contained in:
2021-02-21 21:56:38 -05:00
parent 330364d794
commit a3858223c6
218 changed files with 61 additions and 28149 deletions

View File

@@ -18,18 +18,9 @@
collections:
- netbox.netbox
- freeipa.ansible_freeipa
- redhat.rhv
tasks:
- name: Get unused IP Address from pool
netbox_ip_address:
netbox_url: "{{ netbox_api }}"
netbox_token: "{{ netbox_token }}"
data:
prefix: 192.168.16.0/20
state: new
register: new_ip
when: primary_ipv4 is undefined
delegate_to: localhost
- name: Obtain SSO token for RHV
ovirt_auth:
@@ -39,6 +30,20 @@
password: "{{ ovirt_password }}"
delegate_to: localhost
- name: Get unused IP Address from pool
netbox_ip_address:
netbox_url: "{{ netbox_api }}"
netbox_token: "{{ netbox_token }}"
data:
prefix: 192.168.90.0/24
assigned_object:
name: eth0
virtual_machine: "{{ inventory_hostname }}"
state: new
register: new_ip
when: primary_ipv4 is undefined
delegate_to: localhost
- set_fact:
primary_ipv4: "{{ new_ip.ip_address.address|ipaddr('address') }}"
vm_hostname: "{{ inventory_hostname.split('.')[0] }}"
@@ -46,6 +51,15 @@
delegate_to: localhost
when: primary_ipv4 is undefined
- name: Primary IPv4 Assigned in Netbox
netbox_virtual_machine:
netbox_url: "{{ netbox_api }}"
netbox_token: "{{ netbox_token }}"
data:
primary_ip4: "{{ primary_ipv4 }}"
name: "{{ inventory_hostname }}"
delegate_to: localhost
- name: Primary IPv4 Address
debug:
var: primary_ipv4
@@ -68,7 +82,7 @@
gather_facts: no
collections:
- netbox.netbox
- ovirt.ovirt
- redhat.rhv
vars:
# Workaround to get correct venv python interpreter
ansible_python_interpreter: "{{ ansible_playbook_python }}"
@@ -95,7 +109,7 @@
name: '{{ item.name }}'
description: '{{ item.descr }}'
interface: '{{ item.interface }}'
size: '{{ item.size }}'
size: '{{ item.size|int * 1024000 }}'
state: '{{ item.state }}'
sparse: '{{ item.sparse }}'
wait: true
@@ -104,7 +118,6 @@
poll: 15
loop: '{{ vm_disks }}'
- set_fact:
nb_query_filter: "slug={{ platform }}"
- debug: msg='{{ query("netbox.netbox.nb_lookup", "platforms", api_filter=nb_query_filter, api_endpoint=netbox_api, token=netbox_token)[0].value.name }}'
@@ -130,6 +143,8 @@
- hd
async: 300
poll: 15
notify: PXE Boot
register: vm_result
- name: Assign NIC
ovirt_nic:
@@ -137,12 +152,38 @@
interface: virtio
mac_address: '{{ item.mac_address|default(omit) }}'
name: '{{ item.name }}'
profile: ovirtmgmt
profile: '{{ item.untagged_vlan.name }}'
network: '{{ item.untagged_vlan.name }}' # This is fragile
state: '{{ (item.enabled == True) |ternary("plugged","unplugged") }}'
linked: yes
vm: '{{ inventory_hostname }}'
loop: '{{ interfaces }}'
register: interface_result
- name: Host configured in Satellite
redhat.satellite.host:
username: "{{ satellite_admin_user }}"
password: "{{ satellite_admin_pass }}"
server_url: "{{ satellite_url }}"
name: "{{ inventory_hostname }}"
hostgroup: "RHEL8/Management"
organization: Toal.ca
location: Lab
ip: "{{ primary_ipv4 }}"
mac: "{{ interface_result.results[0].nic.mac.address }}" #fragile
build: "{{ vm_result.changed |ternary(true,false) }}"
validate_certs: no
- name: Assign interface MACs to Netbox
netbox_vm_interface:
netbox_url: "{{ netbox_api }}"
netbox_token: "{{ netbox_token }}"
data:
name: "{{ item.nic.name }}"
mac_address: "{{ item.nic.mac.address }}"
virtual_machine: "{{ inventory_hostname }}"
loop: "{{ interface_result.results }}"
handlers:
- name: PXE Boot
@@ -158,6 +199,8 @@
hosts: tag_build
gather_facts: no
connection: local
collections:
- redhat.rhv
vars:
# Hack to work around virtualenv python interpreter
ansible_python_interpreter: "{{ ansible_playbook_python }}"

View File

@@ -6,9 +6,7 @@ collections:
- name: netbox.netbox
source: https://galaxy.ansible.com
# - name: freeipa.ansible_freeipa
- name: ovirt.ovirt
- name: freeipa.ansible_freeipa
source: https://galaxy.ansible.com
- name: redhat.rhv
@@ -25,3 +23,6 @@ collections:
- name: jjaswanson4.configure_satellite
source: https://galaxy.ansible.com
- name: redhat.satellite
source: https://cloud.redhat.com/api/automation-hub/

View File

@@ -1,88 +0,0 @@
[![GoKEV](http://GoKEV.com/GoKEV200.png)](http://GoKEV.com/)
<div style="position: absolute; top: 40px; left: 200px;">
# lightbulb-ansiblered-deck
This project is the "Ansible Red" deck HTML content. Optionally, a daemon will be started up if you don't exclude tag "phpdaemon"
## Example Playbooks
Here's an example of how you could launch this role and deploy the PHP daemon to start on port `php_port` and also place the php redirect in the main `{{ workshop_web_path }}`` directory:
<pre>
## both of these example tags default to "never" and will not execute
## unless you explicitly call them at launch time. Therefore, the default
## nature of this role will ONLY synch content and not start the PHP web
## service or place the HTML redirect in web root unless run with these tags:
ansible-playbook -i ec2.hosts GoKEV-lab-provision.yml --tags "phpdaemon,phpredirect"
</pre>
Here's an example of how you could launch this role and and not start the PHP daemon (only synch the content).
<pre>
ansible-playbook -i ec2.hosts GoKEV-lab-provision.yml
</pre>
## Here's an example of the playbook
<pre>
---
- name: Deploy the Ansible Red deck and run it as a daemon
hosts: myserver
vars:
workshop_web_path: /ansible-php-content/
workshop_image: images/ansible-logo.png
workshop_name: Ansible Essentials Workshop
workshop_presenter: Demo McDemoson
workshop_title: Solution Architect, Red Hat
workshop_message: my email and contact info
php_port: 8000
roles:
- lightbulb-ansiblered-deck
</pre>
## Stuff still needing to be done
* Inside `index.php` there are variables for the github star and download counts... probably should be converted to vars in defaults or `extra_vars` params
* Certain presenters have requested dynamic ways to exclude certain sections (exclude entire dir `010_topic_that_bores_my_audience`)
* The HTML ID tags can be manually (accidentally) set to the same name. This has commonly bitten me when duplicating a slide as a starting point and then forgetting to change the ID. At some point, these should be dynamically generated per slide. Two slides with the same ID cause an issue where advancing forward / backward can navigate you all the way back to the first instance of the slide and really make an awkward presentation.
* `<section id="<?=$pretty_html_dir?>">` or something similar would make a more unique and less likely duplicated tag.
## Easter Eggs
* Not implemented, but capable: Each directory in `html_slides` can have a `labs` directory. Slides in this dir will automatically be presented as LABS at the end of each section (numbered directory) and presented with a gray intro slide when the deck advances past the topic section.
* example: `html_slides/123_some_topic/labs/00_lab1.html`
* Troubleshooting: See what files are being included by running a dry run:
* `http://ansible.red/deck-ansible/?dryrun`
* Changing other dynamic aspects of the content via URL:
* `person=shadd` (if that person has a preferences file, context will switch to it. This parallels and overrides the variable determined by a FQDN of `shadd.ansible.red` )
* `labs` :: `http://ansible.red/deck-ansible/?labs` (no value is required - simply passing this empty variable forces labs-only display mode and will not show the deck
* `nolabs` :: `http://ansible.red/deck-ansible/?nolabs` (no value is required - opposite of `labs`, this variable forces deck-only display mode and will not show the labs
* without `labs` or `nolabs` the default behavior is to show labs at the end of each section.
* `force` :: `http://ansible.red/deck-ansible/?force` (no value is required). This can be used on its own or in combination with labs, nolabs, person as: `?person=shadd&nolabs&force`. This parameter shows the status on the HTML output to display the mode. Output is something like: "LAB LIMIT 2 = No Labs, only deck" on the very top white line of the deck throughout the entire presentation.
## Notes
* index.php includes a lot of stuff as dynamic files from the html_slides directory
* Any file or dir inside `html_slides` can be excluded by starting it with an underscore
* example: `html_slides/_000_skipping_this_section`
* example: `html_slides/001_not_kipping_this_section/_skipping_this_slide.html`
* Lab slides can also include some variables defined by parsing the directory names. Take a look at this file for a better understanding and see how the `<?=$varible_name?>` php tags are used:
* `html_slides/080_Tasks/_labs/00_Tasks_Labs.html`
* all labs (at this point) are committed with underscore prepending the directory name and won't publish until that dir is changed to `labs`.
## Author
- Adapted by [Kevin Holmes](http://GoKEV.com/) from the original lightbulb workshop deck, split into dynamic individual slides
## Changelog
- 2018-11-01 This project was first committed November 1, 2018 by [Kevin Holmes](http://GoKEV.com/).
- 2018-11-02 Added an `index.php` file to deploy to web root, redirecting to `/deck-ansible` directory when called via tag `phpredirect`

View File

@@ -1,11 +0,0 @@
---
# defaults file for ansiblered-deck-ansible
workshop_web_path: /ansible-php-content/
workshop_image: images/ansible-logo.png
workshop_name: Ansible Essentials Workshop
workshop_presenter: '&nbsp;'
workshop_title: '&nbsp;'
workshop_message: '&nbsp;'
php_port: 8000

View File

@@ -1 +0,0 @@
- prefs/default.prefs.php

View File

@@ -1,48 +0,0 @@
/**
* Some GoKEV-specific styling
*/
div.transbox {
background-color: #000000;
opacity: 0.7;
/*
max-height: 500px;
max-width: 450;
*/
margin: 5%;
text-align: center;
filter: alpha(opacity=60); /* For IE8 and earlier */
border: 2px solid white;
}
div.transbox p {
margin: 5%;
font-weight: bold;
color: #FFFFFF;
text-align: center;
}
div.transbox h1 {
display: block;
font-size: 2.8em;
text-align: center;
margin-top: .5em;
margin-bottom: .3em;
margin-left: 0;
margin-right: 0;
font-weight: bold;
color: #FFFFFF;
}
div.transbox h2 {
display: block;
font-size: 2.8em;
text-align: center;
margin-top: -1em;
margin-bottom: .3em;
margin-left: 0;
margin-right: 0;
font-weight: bold;
color: #FFFFFF;
}

View File

@@ -1,600 +0,0 @@
/**
* An ANSIBLE theme for reveal.js presentations, similar
* to the simple theme.
*/
@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
@import url('https://fonts.googleapis.com/css?family=Open+Sans:400,700');
/*********************************************
* GLOBAL STYLES
*********************************************/
*{
outline: none;
}
body {
background: #fff;
background-color: #fff;
}
mark{
background-color: yellow;
color: black;
}
mark span.hljs-number{
color: #286669;
}
mark span.hljs-symbol,
mark span.hljs-string{
color: #af2e2e;
}
.reveal {
font-family: "Open Sans", sans-serif;
font-size: 28px;
font-weight: normal;
color: #555;
text-align: left;
}
.reveal .slides{
text-align: left;
}
::selection {
color: #fff;
background: rgba(0, 0, 0, 0.99);
text-shadow: none;
}
.reveal .slides > section,
.reveal .slides > section > section {
line-height: 1.3;
font-weight: inherit;
}
.text-center{
text-align: center;
}
.text-small{
font-size: 70% !important;
}
/*********************************************
* HEADERS
*********************************************/
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6 {
margin: 0 0 20px 0;
color: #cc0000;
font-family: "Open Sans", Impact, sans-serif;
font-weight: bold;
letter-spacing: normal;
text-transform: none;
text-shadow: none;
margin-bottom: 0.6em;
word-wrap: break-word; }
.reveal h1 {
font-size: 2em;
}
.cover .reveal h1{
margin: 1em 0;
}
.reveal h2 {
font-size: 1.35em; }
.reveal h3 {
font-size: 1.2em;
color: #555;
}
.reveal h4 {
font-size: 1em;
color: #555;
}
.reveal h1 {
text-shadow: none; }
/*********************************************
* OTHER
*********************************************/
.reveal p {
margin: 20px 0 0.5em;
line-height: 1.3; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
.reveal iframe {
max-width: 95%;
max-height: 95%; }
.reveal strong,
.reveal b {
font-weight: bold; }
.reveal em {
font-style: italic; }
.reveal ol,
.reveal dl,
.reveal ul {
/*display: inline-block;*/
text-align: left;
margin: 0 0 0 1em; }
.reveal li{
margin: 0 0 0.3em;
}
.reveal ol {
list-style-type: decimal; }
.reveal ul {
list-style-type: disc; }
.reveal ul ul {
list-style-type: square; }
.reveal ul ul ul {
list-style-type: circle; }
.reveal ul ul,
.reveal ul ol,
.reveal ol ol,
.reveal ol ul {
display: block;
margin-left: 40px; }
.reveal dt {
font-weight: bold; }
.reveal dd {
margin-left: 40px; }
.reveal q,
.reveal blockquote {
quotes: none; }
.reveal blockquote {
display: block;
position: relative;
width: 70%;
margin: 20px auto;
padding: 5px;
font-style: italic;
background: rgba(255, 255, 255, 0.05);
/*box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2);*/
}
.reveal blockquote p:first-child,
.reveal blockquote p:last-child {
display: inline-block; }
.reveal q {
font-style: italic; }
.reveal pre,
.reveal pre[class*=language-] {
display: block;
position: relative;
margin: 10px auto;
text-align: left;
font-size: 0.55em;
font-family: monospace;
line-height: 1em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3);
padding: 0px;
}
.reveal code {
font-family: monospace; }
.reveal pre code {
display: block;
padding: 5px;
overflow: auto;
max-height: 55vh;
word-wrap: normal;
}
.reveal table {
margin: auto;
border-collapse: collapse;
border-spacing: 0; }
.reveal table th {
font-weight: bold; }
.reveal table th,
.reveal table td {
text-align: left;
padding: 0.2em 0.5em 0.2em 0.5em;
border-bottom: 1px solid; }
.reveal table th[align="center"],
.reveal table td[align="center"] {
text-align: center; }
.reveal table th[align="right"],
.reveal table td[align="right"] {
text-align: right; }
.reveal table tbody tr:last-child th,
.reveal table tbody tr:last-child td {
border-bottom: none; }
.reveal sup {
vertical-align: super; }
.reveal sub {
vertical-align: sub; }
.reveal small {
display: inline-block;
font-size: 0.6em;
line-height: 1.2em;
vertical-align: top; }
.reveal small * {
vertical-align: top; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #00008B;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
color: #0000f1;
text-shadow: none;
border: none; }
.reveal .roll span:after {
color: #fff;
background: #00003f; }
/*********************************************
* IMAGES
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
max-height: 500px;
}
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
border-color: #00008B;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls {
bottom: auto;
top: 10px;
}
.reveal .controls .navigate-left,
.reveal .controls .navigate-left.enabled {
border-right-color: #00008B; }
.reveal .controls .navigate-right,
.reveal .controls .navigate-right.enabled {
border-left-color: #00008B; }
.reveal .controls .navigate-up,
.reveal .controls .navigate-up.enabled {
border-bottom-color: #00008B; }
.reveal .controls .navigate-down,
.reveal .controls .navigate-down.enabled {
border-top-color: #00008B; }
.reveal .controls .navigate-left.enabled:hover {
border-right-color: #0000f1; }
.reveal .controls .navigate-right.enabled:hover {
border-left-color: #0000f1; }
.reveal .controls .navigate-up.enabled:hover {
border-bottom-color: #0000f1; }
.reveal .controls .navigate-down.enabled:hover {
border-top-color: #0000f1; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2);
}
.reveal .progress span {
background: #00008B;
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
}
/*********************************************
* CUSTOM STYLES
*
*
* colors:
*
* Pool - #5bbdbf;
* Mango - #ff5850;
*********************************************/
.reveal section .ans-logo img{
box-shadow: none;
border: none;
margin: 0px;
background: none;
}
.cover div.ans-logo{
display: block;
}
div.ans-mark{
position: absolute;
width: 6vw; /*vertical-width*/
bottom: 0.5em;
right: 1em;
z-index: 9999;
}
div.ans-mark .circle{
fill:#CC0000;
}
.cover div.ans-mark .circle,
.title.alt div.ans-mark .circle{
fill:#000;
}
svg .a-mark{
fill:#FFFFFF;
}
.reveal {
box-sizing: border-box;
transition: all 300ms ease-in-out;
}
.reveal p,
.reveal li{
width: 80%;
}
.reveal p.fullwidth,
.reveal .col p,
.reveal .col li,
.reveal aside p{
width: 100%;
}
.reveal ul,
.reveal ol{
margin-left: 2em;
}
.slide-background.present{
background-color: #fff;
}
.cover .slide-background.present,
.title.alt .slide-background.present{
background-color: #cc0000;
display: block !important;
}
.lab.alt .slide-background.present{
background-color: #A9A9A9 ;
display: block !important;
}
.cover .present,
.cover .present h1,
.cover .present h2,
.cover .present h3,
.cover .present h4,
.cover .present h5,
.cover .present h6,
.cover .present p,
.cover .present li{
color: #fff;
}
.title .reveal h1,
.title .reveal h2,
.title .reveal h3,
.title .reveal h4{
color: #cc0000;
}
.title.alt .reveal h1,
.title.alt .reveal h2,
.title.alt .reveal h3,
.title.alt .reveal h4,
.title.alt .reveal p{
color: #fff;
}
.columns{
display: flex;
justify-content: flex-start;
}
.reveal .columns > *{
flex-basis: 31%;
margin-right: 2.333%;
flex-grow: 1;
}
.reveal .progress span {
background: #ff5850;
}
.monospace{
font-family: courier, monospace !important;
}
/*********************************************
* CONTROLS
*********************************************/
.reveal .controls .navigate-left, .reveal .controls .navigate-left.enabled{
border-right-color: #ccc;
}
.reveal .controls .navigate-left.enabled:hover {
border-right-color: #999;
opacity: 0.5;
}
.reveal .controls .navigate-right, .reveal .controls .navigate-right.enabled{
border-left-color: #ccc;
}
.reveal .controls .navigate-right.enabled:hover {
border-left-color: #999;
opacity: 0.5;
}
.reveal .controls .navigate-down, .reveal .controls .navigate-down.enabled {
border-top-color: #ccc;
}
.reveal .controls .navigate-down.enabled:hover {
border-top-color: #999;
opacity: 0.5;
}
.reveal .controls .navigate-up, .reveal .controls .navigate-up.enabled {
border-bottom-color: #ccc;
}
.reveal .controls .navigate-up.enabled:hover {
border-bottom-color: #999;
opacity: 0.5;
}
.reveal .controls button {
opacity: 0.1;
}
/*********************************************
* PRINT
*********************************************/
@media print{
/*@page {size: landscape}*/
.ans-logo{
padding: 20px !important;
background: #c00;
display: inline-block;
}
.reveal,
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4,
.reveal h5,
.reveal h6,
.reveal p,
.reveal ul,
.reveal ol,
.reveal li,
.reveal blockquote{
font-family: "Open Sans", sans-serif !important;
color: #000 !important;
}
.reveal blockquote{
font-size: 20px !important;
border: none !important;
}
.reveal p,
.reveal li{
font-size: 20px !important;
}
.reveal img{
border: none !important;
}
.reveal .columns .col {
max-width: 50%;
}
.reveal pre code{
max-height: none !important;
}
.reveal section aside.notes {
display: block;
border-top: 1px solid black;
margin-top: 60px;
padding-top: 20px;
}
.reveal section aside.notes *{
font-size: 14px !important;
font-family: sans-serif;
}
div.ans-mark{
position: fixed;
width: 6vw; /*vertical-width*/
z-index: 9999;
}
}
/*
@media print and (orientation:landscape) {
.reveal section aside.notes {
display: none !important;
}
}
*/

View File

@@ -1,3 +0,0 @@
<?php
header("location:/");

View File

@@ -1,203 +0,0 @@
/* Default Print Stylesheet Template
by Rob Glazebrook of CSSnewbie.com
Last Updated: June 4, 2008
Feel free (nay, compelled) to edit, append, and
manipulate this file as you see fit. */
@media print {
/* SECTION 1: Set default width, margin, float, and
background. This prevents elements from extending
beyond the edge of the printed page, and prevents
unnecessary background images from printing */
html {
background: #fff;
width: auto;
height: auto;
overflow: visible;
}
body {
background: #fff;
font-size: 20pt;
width: auto;
height: auto;
border: 0;
margin: 0 5%;
padding: 0;
overflow: visible;
float: none !important;
}
/* SECTION 2: Remove any elements not needed in print.
This would include navigation, ads, sidebars, etc. */
.nestedarrow,
.controls,
.fork-reveal,
.share-reveal,
.state-background,
.reveal .progress,
.reveal .backgrounds,
.reveal .slide-number {
display: none !important;
}
/* SECTION 3: Set body font face, size, and color.
Consider using a serif font for readability. */
body, p, td, li, div {
font-size: 20pt!important;
font-family: Georgia, "Times New Roman", Times, serif !important;
color: #000;
}
/* SECTION 4: Set heading font face, sizes, and color.
Differentiate your headings from your body text.
Perhaps use a large sans-serif for distinction. */
h1,h2,h3,h4,h5,h6 {
color: #000!important;
height: auto;
line-height: normal;
font-family: Georgia, "Times New Roman", Times, serif !important;
text-shadow: 0 0 0 #000 !important;
text-align: left;
letter-spacing: normal;
}
/* Need to reduce the size of the fonts for printing */
h1 { font-size: 28pt !important; }
h2 { font-size: 24pt !important; }
h3 { font-size: 22pt !important; }
h4 { font-size: 22pt !important; font-variant: small-caps; }
h5 { font-size: 21pt !important; }
h6 { font-size: 20pt !important; font-style: italic; }
/* SECTION 5: Make hyperlinks more usable.
Ensure links are underlined, and consider appending
the URL to the end of the link for usability. */
a:link,
a:visited {
color: #000 !important;
font-weight: bold;
text-decoration: underline;
}
/*
.reveal a:link:after,
.reveal a:visited:after {
content: " (" attr(href) ") ";
color: #222 !important;
font-size: 90%;
}
*/
/* SECTION 6: more reveal.js specific additions by @skypanther */
ul, ol, div, p {
visibility: visible;
position: static;
width: auto;
height: auto;
display: block;
overflow: visible;
margin: 0;
text-align: left !important;
}
.reveal pre,
.reveal table {
margin-left: 0;
margin-right: 0;
}
.reveal pre code {
padding: 20px;
border: 1px solid #ddd;
}
.reveal blockquote {
margin: 20px 0;
}
.reveal .slides {
position: static !important;
width: auto !important;
height: auto !important;
left: 0 !important;
top: 0 !important;
margin-left: 0 !important;
margin-top: 0 !important;
padding: 0 !important;
zoom: 1 !important;
overflow: visible !important;
display: block !important;
text-align: left !important;
-webkit-perspective: none;
-moz-perspective: none;
-ms-perspective: none;
perspective: none;
-webkit-perspective-origin: 50% 50%;
-moz-perspective-origin: 50% 50%;
-ms-perspective-origin: 50% 50%;
perspective-origin: 50% 50%;
}
.reveal .slides section {
visibility: visible !important;
position: static !important;
width: auto !important;
height: auto !important;
display: block !important;
overflow: visible !important;
left: 0 !important;
top: 0 !important;
margin-left: 0 !important;
margin-top: 0 !important;
padding: 60px 20px !important;
z-index: auto !important;
opacity: 1 !important;
page-break-after: always !important;
-webkit-transform-style: flat !important;
-moz-transform-style: flat !important;
-ms-transform-style: flat !important;
transform-style: flat !important;
-webkit-transform: none !important;
-moz-transform: none !important;
-ms-transform: none !important;
transform: none !important;
-webkit-transition: none !important;
-moz-transition: none !important;
-ms-transition: none !important;
transition: none !important;
}
.reveal .slides section.stack {
padding: 0 !important;
}
.reveal section:last-of-type {
page-break-after: avoid !important;
}
.reveal section .fragment {
opacity: 1 !important;
visibility: visible !important;
-webkit-transform: none !important;
-moz-transform: none !important;
-ms-transform: none !important;
transform: none !important;
}
.reveal section img {
display: block;
margin: 15px 0px;
background: rgba(255,255,255,1);
border: 1px solid #666;
box-shadow: none;
}
.reveal section small {
font-size: 0.8em;
}
}

View File

@@ -1,171 +0,0 @@
/**
* This stylesheet is used to print reveal.js
* presentations to PDF.
*
* https://github.com/hakimel/reveal.js#pdf-export
*/
* {
-webkit-print-color-adjust: exact;
}
body {
margin: 0 auto !important;
border: 0;
padding: 0;
float: none !important;
overflow: visible;
}
html {
width: 100%;
height: 100%;
overflow: visible;
}
/* Remove any elements not needed in print. */
.nestedarrow,
.reveal .controls,
.reveal .progress,
.reveal .playback,
.reveal.overview,
.fork-reveal,
.share-reveal,
.state-background {
display: none !important;
}
h1, h2, h3, h4, h5, h6 {
text-shadow: 0 0 0 #000 !important;
}
.reveal pre code {
overflow: hidden !important;
font-family: Courier, 'Courier New', monospace !important;
}
ul, ol, div, p {
visibility: visible;
position: static;
width: auto;
height: auto;
display: block;
overflow: visible;
margin: auto;
}
.reveal {
width: auto !important;
height: auto !important;
overflow: hidden !important;
}
.reveal .slides {
position: static;
width: 100% !important;
height: auto !important;
zoom: 1 !important;
left: auto;
top: auto;
margin: 0 !important;
padding: 0 !important;
overflow: visible;
display: block;
-webkit-perspective: none;
-moz-perspective: none;
-ms-perspective: none;
perspective: none;
-webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */
-moz-perspective-origin: 50% 50%;
-ms-perspective-origin: 50% 50%;
perspective-origin: 50% 50%;
}
.reveal .slides .pdf-page {
position: relative;
overflow: hidden;
z-index: 1;
}
.reveal .slides section {
page-break-after: always !important;
visibility: visible !important;
display: block !important;
position: relative !important;
margin: 0 !important;
padding: 0 !important;
box-sizing: border-box !important;
min-height: 1px;
opacity: 1 !important;
-webkit-transform-style: flat !important;
-moz-transform-style: flat !important;
-ms-transform-style: flat !important;
transform-style: flat !important;
-webkit-transform: none !important;
-moz-transform: none !important;
-ms-transform: none !important;
transform: none !important;
}
.reveal section.stack {
margin: 0 !important;
padding: 0 !important;
page-break-after: avoid !important;
height: auto !important;
min-height: auto !important;
}
.reveal img {
box-shadow: none;
}
.reveal .roll {
overflow: visible;
line-height: 1em;
}
/* Slide backgrounds are placed inside of their slide when exporting to PDF */
.reveal .slide-background {
display: block !important;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: auto !important;
}
/* Display slide speaker notes when 'showNotes' is enabled */
.reveal .speaker-notes-pdf {
display: block;
width: 100%;
max-height: none;
top: auto;
right: auto;
bottom: auto;
left: auto;
z-index: 100;
}
/* Layout option which makes notes appear on a separate page */
.reveal .speaker-notes-pdf[data-layout="separate-page"] {
position: relative;
color: inherit;
background-color: transparent;
padding: 20px;
page-break-after: always;
}
/* Display slide numbers when 'slideNumber' is enabled */
.reveal .slide-number-pdf {
display: block;
position: absolute;
font-size: 14px;
}

View File

@@ -1 +0,0 @@
code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#a67f59;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.function{color:#DD4A68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}/*# sourceMappingURL=prism.min.css.map */

View File

@@ -1,80 +0,0 @@
/*
Zenburn style from voldmar.ru (c) Vladimir Epifanov <voldmar@voldmar.ru>
based on dark.css by Ivan Sagalaev
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
background: #3f3f3f;
color: #dcdcdc;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-tag {
color: #e3ceab;
}
.hljs-template-tag {
color: #dcdcdc;
}
.hljs-number {
color: #8cd0d3;
}
.hljs-variable,
.hljs-template-variable,
.hljs-attribute {
color: #efdcbc;
}
.hljs-literal {
color: #efefaf;
}
.hljs-subst {
color: #8f8f8f;
}
.hljs-title,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-section,
.hljs-type {
color: #efef8f;
}
.hljs-symbol,
.hljs-bullet,
.hljs-link {
color: #dca3a3;
}
.hljs-deletion,
.hljs-string,
.hljs-built_in,
.hljs-builtin-name {
color: #cc9393;
}
.hljs-addition,
.hljs-comment,
.hljs-quote,
.hljs-meta {
color: #7f9f7f;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}

View File

@@ -1,110 +0,0 @@
* { margin: 0; padding: 0; }
.terminal {
border-radius: 5px 5px 0 0;
position: relative;
}
.terminal .top {
background: #E8E6E8;
color: black;
padding: 5px;
border-radius: 3px 3px 0 0;
}
.terminal .btns {
position: absolute;
top: 7px;
left: 5px;
}
.terminal .circle {
width: 12px;
height: 12px;
display: inline-block;
border-radius: 15px;
margin-left: 2px;
border-width: 1px;
border-style: solid;
}
.red { background: #EC6A5F; border-color: #D04E42; }
.green { background: #64CC57; border-color: #4EA73B; }
.yellow{ background: #F5C04F; border-color: #D6A13D; }
.clear{clear: both;}
.title{
text-align: center;
font-size: 8px;
}
.terminal .title {
color: #000000;
padding: 0px;
font-family: verdana;
font-size: 12px;
}
.terminal .bodys {
background: black;
color: #7AFB4C;
padding: 15px;
overflow: auto;
font-family: monospace;
text-align: center;
font-size: 16px;
}
.terminal .bodysw {
background: black;
color: #FFFFFF;
padding: 15px;
overflow: auto;
font-family: monospace;
font-size: 16px;
}
.terminal .bodym {
background: black;
color: #7AFB4C;
padding: 15px;
overflow: auto;
font-family: monospace;
font-size: 24px;
}
.terminal .bodymw {
background: black;
color: #FFFFFF;
padding: 15px;
overflow: auto;
font-family: monospace;
font-size: 24px;
}
.terminal .bodyl {
background: black;
color: #7AFB4C;
padding: 15px;
overflow: auto;
font-family: monospace;
font-size: 36px;
}
.terminal .bodylw {
background: black;
color: #FFFFFF;
padding: 15px;
overflow: auto;
font-family: monospace;
font-size: 36px;
}
.space {
background: black;
margin: 5px;
}
.shadow {
box-shadow: 0px 0px 10px rgba(0,0,0,.4)
}

View File

@@ -1,3 +0,0 @@
<?php
header("location:/");

View File

@@ -1,12 +0,0 @@
https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.4.1/css/reveal.css
https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.4.1/css/print/pdf.css
https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.4.1/css/print/paper.css
https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.4.1/lib/css/zenburn.css
https://cdnjs.cloudflare.com/ajax/libs/prism/1.6.0/themes/prism.min.css
https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.4.1/lib/js/head.min.js
https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.4.1/js/reveal.js
https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.4.1/plugin/markdown/marked.js
https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.4.1/plugin/markdown/markdown.js
https://cdnjs.cloudflare.com/ajax/libs/prism/1.6.0/prism.min.js
https://cdnjs.cloudflare.com/ajax/libs/prism/1.6.0/components/prism-yaml.min.js
https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.4.1/plugin/highlight/highlight.js

View File

@@ -1,89 +0,0 @@
<?php
$this_script = $_SERVER['SCRIPT_NAME'];
$outvars .= "\t<tr>\n\t\t<td colspan=\"100%\"><h1>\$_ENV</h1></td>\n\t</tr>\n";
foreach( $_ENV as $key => $value){
$count++;
$linefront = "\t<tr>\n\t\t<td>$count</td>\n\t\t<td>";
$lineend = "</td>\n\t\t<td>$value</td>\n\t</tr>\n";
$outvars .= "$linefront\$_ENV['$key']$lineend";
}
$outvars .= "\t<tr>\n\t\t<td colspan=\"100%\"><h1>\$_SERVER</h1></td>\n\t</tr>\n";
foreach( $_SERVER as $key => $value){
if ($key == "PHP_AUTH_PW"){
$value = ereg_replace("[^.*]", "*", $value) . " <--- (this value displays in plaintext but has been obfusticated in this script)";
}
$count++;
$linefront = "\t<tr>\n\t\t<td>$count</td>\n\t\t<td>";
$lineend = "</td>\n\t\t<td>$value</td>\n\t</tr>\n";
$outvars .= "$linefront\$_SERVER['$key']$lineend";
}
$outvars .= "\t<tr>\n\t\t<td colspan=\"100%\"><h1>\$_POST</h1></td>\n\t</tr>\n";
foreach( $_POST as $key => $value){
$count++;
$linefront = "\t<tr>\n\t\t<td>$count</td>\n\t\t<td>";
$lineend = "</td>\n\t\t<td>$value</td>\n\t</tr>\n";
$outvars .= "$linefront\$_POST['$key']$lineend";
}
$outvars .= "\t<tr>\n\t\t<td colspan=\"100%\"><h1>\$_GET</h1></td>\n\t</tr>\n";
foreach( $_GET as $key => $value){
$count++;
$linefront = "\t<tr>\n\t\t<td>$count</td>\n\t\t<td>";
$lineend = "</td>\n\t\t<td>$value</td>\n\t</tr>\n";
$outvars .= "$linefront\$_GET['$key']$lineend";
}
?>
<style type="text/css">
FONT,BODY {
font-family: Verdana,sans,arial,Helvetica;
font-size: 36px;
}
table.vars {
border-width: 0px 0px 0px 0px;
border-spacing: 2px;
border-style: double double double double;
border-color: gray gray gray gray;
border-collapse: separate;
background-color: white;
}
table.vars th {
border-width: 1px 1px 1px 1px;
padding: 3px 3px 3px 3px;
border-style: groove groove groove groove;
border-color: gray gray gray gray;
background-color: white;
-moz-border-radius: 9px 9px 9px 9px;
}
table.vars td {
border-width: 1px 1px 1px 1px;
padding: 5px 5px 5px 5px;
border-style: groove groove groove groove;
border-color: gray gray gray gray;
background-color: white;
-moz-border-radius: 9px 9px 9px 9px;
}
table.vars tr {
height: 25px;
}
</style>
<form method="POST" action="<?=$this_script?>">
<table class="vars">
<a href="<?=$this_script?>"><?=$this_script?> (this script)</a><br>
<input type="submit" value="SUBMIT POST"><br>
<input type="text" name="text"><br>
<br>
<?=$outvars?>
</table>
</form>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 393 B

View File

@@ -1,17 +0,0 @@
<section id="Intro-WhatYouWillLearn">
<h2>What You Will Learn</h2>
<p>Ansible is capable of handling many powerful automation tasks with the flexibility to adapt to many environments and workflows. With Ansible, users can very quickly get up and running to do real work.<br><br></p>
<ul>
<li>What is Ansible? / "The Ansible Way"</li>
<li>How Ansible Works and its Key Components</li>
<li>Automating with Ad-Hoc Commands</li>
<li>Writing Playbooks / Playbook Basics</li>
<li>Reuse and Redistribution of Ansible Content with Roles</li>
</ul>
<aside class="notes">
<p>This deck is designed to provide students with direct introductory instruction and guidance to beginning to automate with Ansible. It is the starting point for students intent on becoming more proficient with Ansible through other Lightbulb modules and their own usage.</p>
<p>This deck supports lecture and hands-on forms of presenting this material. </p>
<p>Allow 2 hours to deliver the lecture-based form and 4 hours for stopping to do the workshop assignments. To access the additional slides for delivering the workshops, navigate down when available. </p>
<p>See the <a href="../facilitator/README.md">Ansible Lightbulb facilitator&rsquo;s guide</a> for more details on using this deck and it&rsquo;s associated material.</p>
</aside>
</section>

View File

@@ -1,13 +0,0 @@
<section id="Intro-WhatIsAnsible">
<h2>What is Ansible?</h2>
<p>It&apos;s a <b>simple automation language</b> that can perfectly describe an IT application infrastructure in Ansible Playbooks.</p>
<p>It&apos;s an <b>automation engine</b> that runs Ansible Playbooks.</p><br>
<p>Ansible is an automation platform:
<ul>
<li>Playbooks make up the automation language</li>
<li>The code base is the automation engine.</li>
<li>Ansible Tower manages existing automation</li>
</ul>
</p>
</aside>
</section>

View File

@@ -1,14 +0,0 @@
<section id="Intro-WhatIsTower">
<h2>What is Ansible Tower?</h2>
<p>Ansible Tower is an <b>enterprise framework</b> for controlling, securing and managing your Ansible automation with a <b>UI and RESTful API</b>.</p>
<img src="images/ansible-tower3-monitor-1x.png">
<aside class="notes speaker">
<p>Ansible is an automation platform:
<ul>
<li>Playbooks make up the automation language</li>
<li>The code base is the automation engine.</li>
<li>Ansible Tower manages existing automation</li>
</ul>
</p>
</aside>
</section>

View File

@@ -1,38 +0,0 @@
<section id="WhyAnsible">
<h3>Why Ansible? &nbsp;&nbsp; What Sets Ansible Apart? </h3>
<img src="images/SPA-All.png" />
<aside class="notes">
<p>Ansible has a number of qualities that make it the most rapidly growing automation platform in the world. </p>
<p>What is it about Ansible that makes it worth talking about?</p>
</aisde>
</section>
<section id="WhyAnsible-Simple">
<h3><font color="white">Why Ansible? &nbsp;&nbsp; What Sets Ansible Apart?</font></h3>
<img src="images/SPA-Simple.png" />
<aside class="notes">
<p><strong>Ansible is simple.</strong> Playbooks are human and machine readable, no special coding skills required &ndash; and even people in your IT organization that dont know Ansible can read an Ansible playbook and understand whats happening.</p>
<p>This simplicity also means that it&rsquo;s easy to install and get started to do real work with it quickly &ndash; usually in just minutes. </p>
<p>Ansible also works like you think &ndash; tasks are always executed in order. All together, the simplicity ensures that you can get started quickly.</p>
</aisde>
</section>
<section id="WhyAnsible-Powerful">
<h3><font color="white">Why Ansible? &nbsp;&nbsp; What Sets Ansible Apart?</font></h3>
<img src="images/SPA-Powerful.png" />
<aside class="notes">
<p><strong>Ansible is powerful.</strong> Simplicity is great, but to be really useful, you also need the powerful features that ensure you can model even the most complex of IT workflows.</p>
<p>Ansible is complete automation, able to deploy apps, manage orchestration, and configure the infrastructure, networks, operating systems, and services that youre already using today. </p>
<p>Together, Ansibles capabilities allow you to orchestrate the entire application and environment lifecycle, regardless of where It&apos;s deployed.</p>
</aisde>
</section>
<section id="WhyAnsible-Agentless">
<h3><font color="white">Why Ansible? &nbsp;&nbsp; What Sets Ansible Apart?</font></h3>
<img src="images/SPA-Agentless.png" />
<aside class="notes">
<p><strong>Ansible is Agentless.</strong> Ansible relies on industry-standard and trusted SSH and WinRM protocols to automate. There are no agents or other software to install, and no additional firewall ports to open. With no need to separately stand up a management infrastructure, Ansible further reduces the activation energy required from your team to start automating today.</p>
<p>In a world where IT complexity stymies even the most basic of IT tasks, Ansible provides a much needed respite &ndash; and path forward enabling teams to crush productivity-stealing complexity and overhead.</p>
</aisde>
</section>

View File

@@ -1,58 +0,0 @@
<section id="UseCases">
<div style="position:relative" style="border: 30px solid #000000">
<p class="fragment current-visible" style="position:absolute; margin-top: 80px; margin-left: 50;" data-fragment-index="0">
<img src="images/AnsibleUseCases01_ConfigMgmt.png"></p>
<p class="fragment current-visible" style="position:absolute; margin-top: 80px; margin-left: 50;" data-fragment-index="1">
<img src="images/AnsibleUseCases02_AppDeployment.png"></p>
<p class="fragment current-visible" style="position:absolute; margin-top: 80px; margin-left: 50;" data-fragment-index="2">
<img src="images/AnsibleUseCases03_Provisioning.png"></p>
<p class="fragment current-visible" style="position:absolute; margin-top: 80px; margin-left: 50;" data-fragment-index="3">
<img src="images/AnsibleUseCases04_CICD.png"></p>
<p class="fragment current-visible" style="position:absolute; margin-top: 80px; margin-left: 50;" data-fragment-index="4">
<img src="images/AnsibleUseCases05_SecurityCompliance.png"></p>
<p class="fragment current-visible" style="position:absolute; margin-top: 80px; margin-left: 50;" data-fragment-index="5">
<img src="images/AnsibleUseCases06_Orchestration.png"></p>
</div>
<table height="50%" width="100%" style="border: 0px solid #ffffff">
<tr style="border: 0px solid #ffffff">
<td colspan="100%" style="border: 0px solid #ffffff">
<h2>Ansible Provides End To End Goodness</h2>
</td>
</tr>
<tr>
<td width="500">&nbsp;</td>
<td align="right">
<img src="images/AnsibleUseCases01_ConfigMgmt.png" width="200">
</td>
<td align="center">
<img src="images/AnsibleUseCases02_AppDeployment.png" width="200">
</td>
<td align="left">
<img src="images/AnsibleUseCases03_Provisioning.png" width="200">
</td>
</tr>
<tr style="border: 0px solid #ffffff">
<td width="500">&nbsp;</td>
<td align="right" style="border: 0px solid #ffffff">
<img src="images/AnsibleUseCases04_CICD.png" width="200">
</td>
<td align="center">
<img src="images/AnsibleUseCases05_SecurityCompliance.png" width="200">
</td>
<td align="left">
<img src="images/AnsibleUseCases06_Orchestration.png" width="200">
</td>
</tr>
</table>
<aside class="notes">
<p>What can you do with Ansible? Nearly anything. Ansible is the Swiss Army knife of DevOps, capable of handling many powerful automation tasks with the flexibility to adapt to many environments and workflows.</p>
<p>Many folks like to categorize Ansible as a configuration manager, and although yes, Ansible can do that, it&quot;s just the tip of the iceberg. When you couple configuration management with orchestration, you can start to model complicated multi-tier deployments with ease.</p>
<p>With Ansible, once someone on your team automates something, everyone on the team now knows how to do it.</p>
</aside>
</section>

View File

@@ -1,146 +0,0 @@
<section id="TheAnsibleWay">
<h2>The Ansible Way</h2>
<div style="font-size: 0.75em;"><br>
<p><strong>CROSS PLATFORM</strong> Linux, Windows, UNIX</br>
Agentless support for all major OS variants, physical, virtual, cloud and network</p>
<p><strong>HUMAN READABLE</strong> YAML</br>
Perfectly describe and document every aspect of your application environment</p>
<p><strong>PERFECT DESCRIPTION OF APPLICATION</strong></br>
Every change can be made by playbooks, ensuring everyone is on the same page</p>
<p><strong>VERSION CONTROLLED</strong></br>
Playbooks are plain-text. Treat them like code in your existing version control.</p>
<p><strong>DYNAMIC INVENTORIES</strong></br>
Capture all the servers 100% of the time, regardless of infrastructure, location, etc.</p>
<p><strong>ORCHESTRATION THAT PLAYS WELL WITH OTHERS</strong> HP SA, Puppet, Jenkins, RHNSS, etc. Homogenize existing environments by leveraging current toolsets and update mechanisms.</p>
</div>
<aside class="notes">
</aside>
</section>
<section id="TheAnsibleWay-CrossPlatform">
<h2>The Ansible Way - Venture Across The Platform</h2>
<div style="font-size: 0.75em;"><br>
<p style="padding:10px; background-color:gray; color:white"><strong>CROSS PLATFORM</strong> Linux, Windows, UNIX</br>
Agentless support for all major OS variants, physical, virtual, cloud and network</p>
<p><strong>HUMAN READABLE</strong> YAML</br>
Perfectly describe and document every aspect of your application environment</p>
<p><strong>PERFECT DESCRIPTION OF APPLICATION</strong></br>
Every change can be made by playbooks, ensuring everyone is on the same page</p>
<p><strong>VERSION CONTROLLED</strong></br>
Playbooks are plain-text. Treat them like code in your existing version control.</p>
<p><strong>DYNAMIC INVENTORIES</strong></br>
Capture all the servers 100% of the time, regardless of infrastructure, location, etc.</p>
<p><strong>ORCHESTRATION THAT PLAYS WELL WITH OTHERS</strong> HP SA, Puppet, Jenkins, RHNSS, etc. Homogenize existing environments by leveraging current toolsets and update mechanisms.</p>
</div>
<aside class="notes">
</aside>
</section>
<section id="TheAnsibleWay-CommunicateClearly">
<h2>The Ansible Way - Communicate Clearly</h2>
<div style="font-size: 0.75em;"><br>
<p><strong>CROSS PLATFORM</strong> Linux, Windows, UNIX</br>
Agentless support for all major OS variants, physical, virtual, cloud and network</p>
<p style="padding:10px; background-color:gray; color:white"><strong>HUMAN READABLE</strong> YAML</br>
Perfectly describe and document every aspect of your application environment</p>
<p><strong>PERFECT DESCRIPTION OF APPLICATION</strong></br>
Every change can be made by playbooks, ensuring everyone is on the same page</p>
<p><strong>VERSION CONTROLLED</strong></br>
Playbooks are plain-text. Treat them like code in your existing version control.</p>
<p><strong>DYNAMIC INVENTORIES</strong></br>
Capture all the servers 100% of the time, regardless of infrastructure, location, etc.</p>
<p><strong>ORCHESTRATION THAT PLAYS WELL WITH OTHERS</strong> HP SA, Puppet, Jenkins, RHNSS, etc. Homogenize existing environments by leveraging current toolsets and update mechanisms.</p>
</div>
<aside class="notes">
</aside>
</section>
<section id="TheAnsibleWay-PreciousRing">
<h2>The Ansible Way - One Source To Rule Them All</h2>
<div style="font-size: 0.75em;"><br>
<p><strong>CROSS PLATFORM</strong> Linux, Windows, UNIX</br>
Agentless support for all major OS variants, physical, virtual, cloud and network</p>
<p><strong>HUMAN READABLE</strong> YAML</br>
Perfectly describe and document every aspect of your application environment</p>
<p style="padding:10px; background-color:gray; color:white"><strong>PERFECT DESCRIPTION OF APPLICATION</strong></br>
Every change can be made by playbooks, ensuring everyone is on the same page</p>
<p><strong>VERSION CONTROLLED</strong></br>
Playbooks are plain-text. Treat them like code in your existing version control.</p>
<p><strong>DYNAMIC INVENTORIES</strong></br>
Capture all the servers 100% of the time, regardless of infrastructure, location, etc.</p>
<p><strong>ORCHESTRATION THAT PLAYS WELL WITH OTHERS</strong> HP SA, Puppet, Jenkins, RHNSS, etc. Homogenize existing environments by leveraging current toolsets and update mechanisms.</p>
</div>
<aside class="notes">
</aside>
</section>
<section id="TheAnsibleWay-VersionControlled">
<h2>The Ansible Way - Version Controlled Goodness</h2>
<div style="font-size: 0.75em;"><br>
<p><strong>CROSS PLATFORM</strong> Linux, Windows, UNIX</br>
Agentless support for all major OS variants, physical, virtual, cloud and network</p>
<p><strong>HUMAN READABLE</strong> YAML</br>
Perfectly describe and document every aspect of your application environment</p>
<p><strong>PERFECT DESCRIPTION OF APPLICATION</strong></br>
Every change can be made by playbooks, ensuring everyone is on the same page</p>
<p style="padding:10px; background-color:gray; color:white"><strong>VERSION CONTROLLED</strong></br>
Playbooks are plain-text. Treat them like code in your existing version control.</p>
<p><strong>DYNAMIC INVENTORIES</strong></br>
Capture all the servers 100% of the time, regardless of infrastructure, location, etc.</p>
<p><strong>ORCHESTRATION THAT PLAYS WELL WITH OTHERS</strong> HP SA, Puppet, Jenkins, RHNSS, etc. Homogenize existing environments by leveraging current toolsets and update mechanisms.</p>
</div>
<aside class="notes">
</aside>
</section>
<section id="TheAnsibleWay-DynInv">
<h2>The Ansible Way - Dynamically Utilize Inventories</h2>
<div style="font-size: 0.75em;"><br>
<p><strong>CROSS PLATFORM</strong> Linux, Windows, UNIX</br>
Agentless support for all major OS variants, physical, virtual, cloud and network</p>
<p><strong>HUMAN READABLE</strong> YAML</br>
Perfectly describe and document every aspect of your application environment</p>
<p><strong>PERFECT DESCRIPTION OF APPLICATION</strong></br>
Every change can be made by playbooks, ensuring everyone is on the same page</p>
<p><strong>VERSION CONTROLLED</strong></br>
Playbooks are plain-text. Treat them like code in your existing version control.</p>
<p style="padding:10px; background-color:gray; color:white"><strong>DYNAMIC INVENTORIES</strong></br>
Capture all the servers 100% of the time, regardless of infrastructure, location, etc.</p>
<p><strong>ORCHESTRATION THAT PLAYS WELL WITH OTHERS</strong> HP SA, Puppet, Jenkins, RHNSS, etc. Homogenize existing environments by leveraging current toolsets and update mechanisms.</p>
</div>
<aside class="notes">
</aside>
</section>
<section id="TheAnsibleWay-PlayNicely">
<h2>The Ansible Way - Play Nicely With Others</h2>
<div style="font-size: 0.75em;"><br>
<p><strong>CROSS PLATFORM</strong> Linux, Windows, UNIX</br>
Agentless support for all major OS variants, physical, virtual, cloud and network</p>
<p><strong>HUMAN READABLE</strong> YAML</br>
Perfectly describe and document every aspect of your application environment</p>
<p><strong>PERFECT DESCRIPTION OF APPLICATION</strong></br>
Every change can be made by playbooks, ensuring everyone is on the same page</p>
<p><strong>VERSION CONTROLLED</strong></br>
Playbooks are plain-text. Treat them like code in your existing version control.</p>
<p><strong>DYNAMIC INVENTORIES</strong></br>
Capture all the servers 100% of the time, regardless of infrastructure, location, etc.</p>
<p style="padding:10px; background-color:gray; color:white"><strong>ORCHESTRATION THAT PLAYS WELL WITH OTHERS</strong> HP SA, Puppet, Jenkins, RHNSS, etc. Homogenize existing environments by leveraging current toolsets and update mechanisms.</p>
</div>
<aside class="notes">
</aside>
</section>

View File

@@ -1,63 +0,0 @@
<section id="BatteriesIncluded">
<h2>Batteries Included</h2>
<p>Ansible comes bundled with hundreds of modules for a wide variety of automation tasks</p>
<div style="position:absolute; right: -125px; top: 100px;">
<p class="fragment current-visible" data-fragment-index="0">
<img src="images/fiero.jpg" width="600">
</p>
</div>
<!-- Kev keeps removing this second fiero,
but it's required for the second click or the
little car disappears when the "batteries not
included" message pops up-->
<div style="position:absolute; right: -125px; top: 100px;">
<p class="fragment current-visible" data-fragment-index="1">
<img src="images/fiero.jpg" width="600">
</p>
</div>
<div style="position:absolute; right: 25px; top: 25px;">
<p class="fragment current-visible" data-fragment-index="1">
<img src="images/BatteriesNotIncluded.png" width="200">
</p>
</div>
<div class="columns">
<div class="col">
<ul>
<li>cloud</li>
<li>containers</li>
<li>database</li>
<li>files</li>
<li>messaging</li>
<li>monitoring</li>
<li>network</li>
</ul>
</div>
<div class="col">
<ul>
<li>notifications</li>
<li>packaging</li>
<li>source control</li>
<li>system</li>
<li>testing</li>
<li>utilities</li>
<li>web infrastructure</li>
</ul>
</div>
<div class="col">
</div>
</div>
<aside notes="notes">
<p>Ansible Modules control the things that youre automating. They can do everything from acting on system files, installing packages, or making API calls to a service framework. Ansible ships with around <?=$module_count?> today -- and this number is always expanding with every release.</p>
</aside>
</section>

View File

@@ -1,14 +0,0 @@
<section id="LanguageOfDevops">
<h2>Ansible: The Language of DevOps</h2>
<div style="font-size: 0.75em; text-align:center;">
<img src="images/devops-language-diagram.svg" width="60%" height="60%" style="padding-top: 20px;"/>
<p class="fullwidth"><strong>COMMUNICATION IS THE KEY TO DEVOPS.</strong></p>
<p class="fullwidth">Ansible is the first <strong>automation language</strong><br/>that can be read and written across IT.</p>
<p class="fullwidth">Ansible is the only <strong>automation engine</strong><br/>that can automate the entire <strong>application lifecycle</strong><br/>and <strong>continuous delivery pipeline</strong>.</p>
</div>
<aside class="notes">
<p>DevOps is a verb. Rather than think of "DevOps" as an object, think of it as the effort that holds pieces together from the first moment a server is racked to the end user's session.</p>
<p>With DevOps being the effort in the middle of it all, consider how Ansible can act as the catalyst to empower every department... every step of the way.</p>
<p>Ansible can be a powerful <strong>COLLABORATION TOOL</strong></p>
</aside>
</section>

View File

@@ -1,19 +0,0 @@
<section id="EndlessUseCases">
<h1>Ansible: Endless Use Cases</h1>
<p>Ansible fills virtually countless use cases with its versatility.</p>
<li type="circle" class="fragment fade-left">&#x273e;&nbsp;&nbsp;<b>Ansible is NOT just a Config Management Tool.</b></li>
<li type="circle" class="fragment fade-left">&#x2607;&nbsp;&nbsp;<b>Ansible is NOT just an Application Deployment Tool.</b></li>
<li type="circle" class="fragment fade-left">&#x2601;&nbsp;&nbsp;<b>Ansible is NOT just a Provisioning Tool.</b></li>
<li type="circle" class="fragment fade-left">&#x2621;&nbsp;&nbsp;<b>Ansible is NOT just a CI/CD Tool.</b></li>
<li type="circle" class="fragment fade-left">&#x270e;&nbsp;&nbsp;<b>Ansible is NOT just an Audit and Compliance Tool.</b></li>
<li type="circle" class="fragment fade-left">&#x27b0;&nbsp;&nbsp; <b>Ansible is NOT just an Orchestration Tool.</b></li>
<h2 class="fragment fade-up">Ansible is a powerful automation engine...</b></h2>
<h2 class="fragment fade-up">with strong use cases for all of the above tasks.</b></h2>
</p>
<aside class="notes">
<p>Stuff Goes Here</p>
</aside>
</section>

View File

@@ -1,17 +0,0 @@
<section id="TowerAndDevOps" data-background-image="images/AnsibleTowerFlow.png">
<div style="width: 800px; left: 50%; transform: translate(-50%,0); position: absolute; z-index: 1;" data-fragment-index="1" class="fragment fade-left" >
<div class="transbox">
<h1>Practical Workflows</h1>
<p>Deployment and CICD Pipelines </p>
</div>
</div>
<aside class="notes">
<p>Ansiblefest!!!!</p>
</aside>
</section>

View File

@@ -1,11 +0,0 @@
<section>
<section data-state="title alt" id="RedIntro-PeopleLoveAnsible">
<h1>PEOPLE LOVE ANSIBLE.</h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Ansible is taking the world by storm with unbelievable popularity.</p>
<aside class="notes">
</aside>
</section>
</section>

View File

@@ -1,5 +0,0 @@
<section id="MeetupsRock" data-background-image="images/most_meetups.svg">
<aside class="notes">
<p>Ansible is open source. Created with contributions from an active open source community and built for the people who use it every day. At its heart, Ansible was made to help more people experience the power of automation so they could work better and faster together.</p>
</aside>
</section>

View File

@@ -1,34 +0,0 @@
<section id="AnsibleFest" data-background-image="images/Ansible-Fest-Row-Background_GoKEV.png">
<div style="width: 420px; height: 450px; position:absolute; left: -25px; top: 175px;" data-fragment-index="0" class="fragment fade-left" >
<div class="transbox">
<h1><?=$gihub_stars?></h1>
<p>Stars on GitHub</p>
</div>
</div>
<div style="width: 420px; max-height: 450px; position:absolute; right: 30px; top: 175px;" data-fragment-index="1" class="fragment fade-left" >
<div class="transbox">
<h1><?=$module_count?></h1>
<p>Ansible Modules</p>
</div>
</div>
<div style="width: 420px; max-height: 450px; left: 50%; transform: translate(-50%,0); position: absolute; top: 240px;" data-fragment-index="2" class="fragment fade-left" >
<div class="transbox">
<h1><?=$download_permonth?></h1>
<p>Downloads Per Month</p>
</div>
</div>
<aside class="notes">
<p>Ansiblefest!!!!</p>
</aside>
</section>

View File

@@ -1,5 +0,0 @@
<section id="GitHubActivity" data-background-image="images/most_contrib.svg">
<aside class="notes">
<p>Ansible is open source. Created with contributions from an active open source community and built for the people who use it every day. At its heart, Ansible was made to help more people experience the power of automation so they could work better and faster together.</p>
</aside>
</section>

View File

@@ -1,5 +0,0 @@
<section id="MostSearched" data-background-image="images/most_searched.svg">
<aside class="notes">
<p>Ansible is open source. Created with contributions from an active open source community and built for the people who use it every day. At its heart, Ansible was made to help more people experience the power of automation so they could work better and faster together.</p>
</aside>
</section>

View File

@@ -1,19 +0,0 @@
<section id="Ansible-Is-Not-Just">
<h1>Ansible: Endless Use Cases</h1>
<p>Ansible fills virtually countless use cases with its versatility.</p>
<li type="circle" class="fragment fade-left" data-fragment-index="1">&#x273e;&nbsp;&nbsp;<b>Ansible is NOT just a Config Management Tool.</b></li>
<li type="circle" class="fragment fade-left" data-fragment-index="2">&#x2607;&nbsp;&nbsp;<b>Ansible is NOT just an Application Deployment Tool.</b></li>
<li type="circle" class="fragment fade-left" data-fragment-index="3">&#x2601;&nbsp;&nbsp;<b>Ansible is NOT just a Provisioning Tool.</b></li>
<li type="circle" class="fragment fade-left" data-fragment-index="4">&#x2621;&nbsp;&nbsp;<b>Ansible is NOT just a CI/CD Tool.</b></li>
<li type="circle" class="fragment fade-left" data-fragment-index="5">&#x270e;&nbsp;&nbsp;<b>Ansible is NOT just an Audit and Compliance Tool.</b></li>
<li type="circle" class="fragment fade-left" data-fragment-index="6">&#x27b0;&nbsp;&nbsp; <b>Ansible is NOT just an Orchestration Tool.</b></li>
<h2 class="fragment fade-up" data-fragment-index="7">Ansible is a powerful automation engine...</b></h2>
<h2 class="fragment fade-up" data-fragment-index="8">with strong use cases for all of the above tasks.</b></h2>
</p>
<aside class="notes">
<p>Stuff Goes Here</p>
</aside>
</section>

View File

@@ -1,12 +0,0 @@
<section data-state="title alt" id="RedIntro-InstallingAnsible">
<h1>INSTALLING ANSIBLE</h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>It Could Not Be Simpler.</p>
<aside class="notes">
<p>Ansible</p>
</aside>
</section>

View File

@@ -1,26 +0,0 @@
<section id="InstallingAnsibleTerminal">
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodyl">
<font color="silver"># RHEL "extras" repo or CentOS EPEL:</font>
$ sudo yum install ansible
<font color="silver"># you will need the PPA repo configured on
# Debian or Ubuntu</font>
$ sudo apt-get install ansible
<font color="silver"># from your MacBook:</font>
$ brew install ansible
<font color="silver"># For bleeding edge python versions,</font>
$ sudo pip install ansible
</pre>
</div>
</section>

View File

@@ -1,22 +0,0 @@
<section id="InstallingAnsibleVideo">
<h3>Simple: Installing Ansible</a></h3>
<script>
document.getElementById('YumInstallAnsible').play();
</script>
<video autoplay muted id="YumInstallAnsible" controls>
<source src="video/yuminstallansible.mp4" type="video/mp4">
Your browser does not support HTML5 video.
</video>
<aside class="notes">
<p>The diagram on this slide shows the relationship between all the key components of Ansible starting with the user who writes an Ansible playbook.</p>
</aside>
</section>

View File

@@ -1,12 +0,0 @@
<section data-state="title alt" id="RedIntro-HowAnsibleWorks">
<h1>HOW ANSIBLE WORKS</h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Let's Take A Look At The Technology</p>
<aside class="notes">
<p>Ansible</p>
</aside>
</section>

View File

@@ -1,10 +0,0 @@
<section id="HowAnsibleWorks">
<h2>How Ansible Works</h2>
<img src="images/how-ansible-works-diagram-01.svg" />
<aside class="notes">
<p>The diagram on this slide shows the relationship between all the key components of Ansible starting with the user who writes an Ansible playbook.</p>
</aside>
</section>

View File

@@ -1,11 +0,0 @@
<section id="HowAnsibleWorks-YAML">
<h2>Plays &amp; Playbooks</h2>
<img src="images/how-ansible-works-diagram-02.svg" />
<aside class="notes">
<p>Playbooks are written in YAML and are used to invoke Ansible modules to perform tasks that are executed sequentially i.e top to bottom. They can describe a policy you want your remote systems to enforce, or a set of steps in a general IT workflow. Playbooks are like an instruction manual and describe the state of environment.</p>
<p>For more details see <a href="http://docs.ansible.com/ansible/playbooks.html">the Playbook page</a> in the Ansible documentation.</p>
</aside>
</section>

View File

@@ -1,12 +0,0 @@
<section id="HowAnsibleWorks-Modules">
<h2>Modules &amp; Tasks</h2>
<img src="images/how-ansible-works-diagram-03.svg" />
<aside class="notes">
<p>If playbooks are the instruction manual for setting up and managing your infrastructure, Ansible modules are the tools in your toolkit.</p>
<p>Modules are executable bits of code that operate on hosts; however, we dont need to understand the underlying implementation to get them to work. Modules do the heavy-lifting in Ansible and abstract users from the complexity of the underlying details.</p>
<p>For more details see the <a href="http://docs.ansible.com/ansible/modules_intro.html">Introduction to Modules</a> and <a href="http://docs.ansible.com/ansible/modules_by_category.html">Module Index</a> page in the Ansible documentation.</p>
</aside>
</section>

View File

@@ -1,19 +0,0 @@
<section id="HowAnsibleWorks-Plugins">
<h2>Plugins</h2>
<img src="images/how-ansible-works-diagram-04.svg" />
<aside class="notes">
<p>Continuing our metaphor, plugins are the gears in the engine.</p>
<p>Plugins are pieces of code that extend Ansibles core functionality. Ansible ships with a number of handy plugins, and you can easily write your own.</p>
<p>These are some of the more common plugin types:</p>
<ul>
<li>Action plugins manage the execution on the controller and deployment of modules to hosts.</li>
<li>Callback plugins enable you to hook into Ansible events for display or logging purposes.</li>
<li>Connection plugins define how to communicate with inventory hosts.</li>
<li>Filters plugins allow you to manipulate data inside Ansible plays and/or templates. This is a Jinja2 feature; Ansible ships extra filter plugins.</li>
</ul>
<p>For more details see the <a href="http://docs.ansible.com/ansible/dev_guide/developing_plugins.html">Developing Plugins</a> page in the Ansible documentation.</p>
</aside>
</section>

View File

@@ -1,14 +0,0 @@
<section id="HowAnsibleWorks-Inventory">
<h2>Inventory</h2>
<img src="images/how-ansible-works-diagram-05.svg" />
<aside class="notes">
<p>Your inventory of hosts are your raw material. They are a list of nodes and associated meta data that Ansible can automate.</p>
<p>Inventory lists can be built and stored several different ways, including static files, or can be dynamically-generated from an external source.</p>
<p>You can also specify variables as part of an inventory list. For instance, set a particular host key thats needed to log into that system remotely. Inventories are ultimately lists of things you want to automate across.</p>
<p>Here in this slide was see an example of a simple static inventory list of three hosts (webserver1, webserver2 and dbserver1) in two groups (web and db).</p>
<p>For more details see the <a href="http://docs.ansible.com/ansible/intro_inventory.html">Inventory</a> page in the Ansible documentation.</p>
</aside>
</section>

View File

@@ -1,11 +0,0 @@
<section id="HowAnsibleWorks-DynamicInventory">
<h2>Inventory</h2>
<img src="images/how-ansible-works-diagram-06.svg" />
<aside class="notes">
<p>In large-scale environment subject to constant change, synchronizing and maintaining inventory statically is tedious and error prone endeavor. That is why Ansible includes support of external sources such as public and private cloud providers and configuration management database (CMDB) systems.</p>
<p>For more details see the <a href="http://docs.ansible.com/ansible/intro_dynamic_inventory.html">Dynamic Inventory</a> page in the Ansible documentation.</p>
</aside>
</section>

View File

@@ -1,12 +0,0 @@
<section data-state="title alt" id="RedIntro-Modules">
<h1>MODULES</h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>We leverage modules within our playbooks to do the heavy lifting.</p>
<aside class="notes">
<p>Ansible</p>
</aside>
</section>

View File

@@ -1,39 +0,0 @@
<section id="ModuleList">
<h2>Modules</h2>
<p>Modules are bits of code transferred to the target system and executed to satisfy the task declaration.</p>
<div class="columns">
<div class="col">
<ul>
<li>apt/yum</li>
<li>copy</li>
<li>file</li>
<li>get_url</li>
<li>git</li>
<li>ping</li>
<li>debug</li>
</ul>
</div>
<div class="col">
<ul>
<li>service</li>
<li>synchronize</li>
<li>template</li>
<li>uri</li>
<li>user</li>
<li>wait_for</li>
<li>assert</li>
</ul>
</div>
<div class="col">
</div>
</div>
<aside class="notes">
<p>If playbooks are the instruction manual for setting up and managing your infrastructure, Ansible modules are the tools in your toolkit.</p>
<p>We've already discussed, Ansible modules. They are the &ldquo;batteries&rdquo; and the &ldquo;tools in a users toolkit.&rdquo;</p>
<p>While there are hundreds of modules at your disposal out-of-the-box these are the most common ones.</p>
<p>Playbook tasks and how they relate to modules will be covered ahead. Tasks are the application of a module to perform a specific unit of work.</p>
</aside>
</section>

View File

@@ -1,208 +0,0 @@
<section id="ModuleDoc-CLI-InfoScroll">
<h2>Modules Documentation</h2>
<p>Returns a thorough description of the parameters in the module.</p>
<div class="terminal space shadow" onclick="scrollDiv_init('AnsibleDocsInfo','1'); this.onclick = null;" style="cursor: pointer;">
<div class="top">
<div class="title">
<a href="javascript:pauseDiv()" style="none; cursor: pointer;">Ansible Terminal</a>
</div>
</div>
<pre class="bodymw">
<font color="gray"><?=$terminal_prompt?></font> ansible-doc copy
<div id="AnsibleDocsInfo" style="overflow:auto;width:auto;height:700px">
> COPY (/usr/lib/python2.7/site-packages/ansible/modules/files/copy.py)
The `copy' module copies a file from the local or remote machine to a
location on the remote machine. Use the [fetch] module to copy files
from remote locations to the local box. If you need variable
interpolation in copied files, use the [template] module. For Windows
targets, use the [win_copy] module instead.
* note: This module has a corresponding action plugin.
OPTIONS (= is mandatory):
- attributes
Attributes the file or directory should have. To get supported flags
look at the man page for `chattr' on the target system. This string
should contain the attributes in the same order as the one displayed by
`lsattr'.
(Aliases: attr)[Default: (null)]
version_added: 2.3
- backup
Create a backup file including the timestamp information so you can get
the original file back if you somehow clobbered it incorrectly.
[Default: no]
type: bool
version_added: 0.7
- checksum
SHA1 checksum of the file being transferred. Used to validate that the
copy of the file was successful.
If this is not provided, ansible will use the local calculated checksum
of the src file.
[Default: (null)]
version_added: 2.5
- content
When used instead of `src', sets the contents of a file directly to the
specified value. For anything advanced or with formatting also look at
the template module.
[Default: (null)]
version_added: 1.1
- decrypt
This option controls the autodecryption of source files using vault.
[Default: Yes]
type: bool
version_added: 2.4
= dest
Remote absolute path where the file should be copied to. If `src' is a
directory, this must be a directory too. If `dest' is a nonexistent path
and if either `dest' ends with "/" or `src' is a directory, `dest' is
created. If `src' and `dest' are files, the parent directory of `dest'
isn't created: the task fails if it doesn't already exist.
- directory_mode
When doing a recursive copy set the mode for the directories. If this is
not set we will use the system defaults. The mode is only set on
directories which are newly created, and will not affect those that
already existed.
[Default: (null)]
version_added: 1.5
- follow
This flag indicates that filesystem links in the destination, if they
exist, should be followed.
[Default: no]
type: bool
version_added: 1.8
- force
the default is `yes', which will replace the remote file when contents
are different than the source. If `no', the file will only be
transferred if the destination does not exist.
(Aliases: thirsty)[Default: yes]
type: bool
version_added: 1.1
- group
Name of the group that should own the file/directory, as would be fed to
`chown'.
[Default: (null)]
- local_follow
This flag indicates that filesystem links in the source tree, if they
exist, should be followed.
[Default: yes]
type: bool
version_added: 2.4
- mode
Mode the file or directory should be. For those used to `/usr/bin/chmod'
remember that modes are actually octal numbers. You must either specify
the leading zero so that Ansible's YAML parser knows it is an octal
number (like `0644' or `01777') or quote it (like `'644'' or `'0644'' so
Ansible receives a string and can do its own conversion from string into
number. Giving Ansible a number without following one of these rules
will end up with a decimal number which will have unexpected results.
As of version 1.8, the mode may be specified as a symbolic mode (for
example, `u+rwx' or `u=rw,g=r,o=r'). As of version 2.3, the mode may
also be the special string `preserve'. `preserve' means that the file
will be given the same permissions as the source file.
[Default: (null)]
- owner
Name of the user that should own the file/directory, as would be fed to
`chown'.
[Default: (null)]
- remote_src
If `no', it will search for `src' at originating/master machine.
If `yes' it will go to the remote/target machine for the `src'. Default
is `no'.
Currently `remote_src' does not support recursive copying.
`remote_src' only works with `mode=preserve' as of version 2.6.
[Default: no]
type: bool
version_added: 2.0
- selevel
Level part of the SELinux file context. This is the MLS/MCS attribute,
sometimes known as the `range'. `_default' feature works as for
`seuser'.
[Default: s0]
- serole
Role part of SELinux file context, `_default' feature works as for
`seuser'.
[Default: (null)]
- setype
Type part of SELinux file context, `_default' feature works as for
`seuser'.
[Default: (null)]
- seuser
User part of SELinux file context. Will default to system policy, if
applicable. If set to `_default', it will use the `user' portion of the
policy if available.
[Default: (null)]
- src
Local path to a file to copy to the remote server; can be absolute or
relative. If path is a directory, it is copied recursively. In this
case, if path ends with "/", only inside contents of that directory are
copied to destination. Otherwise, if it does not end with "/", the
directory itself with all contents is copied. This behavior is similar
to Rsync.
[Default: (null)]
- unsafe_writes
Normally this module uses atomic operations to prevent data corruption
or inconsistent reads from the target files, sometimes systems are
configured or just broken in ways that prevent this. One example are
docker mounted files, they cannot be updated atomically and can only be
done in an unsafe manner.
This boolean option allows ansible to fall back to unsafe methods of
updating files for those cases in which you do not have any other
choice. Be aware that this is subject to race conditions and can lead to
data corruption.
[Default: no]
type: bool
version_added: 2.2
- validate
The validation command to run before copying into place. The path to the
file to validate is passed in via '%s' which must be present as in the
example below. The command is passed securely so shell features like
expansion and pipes won't work.
[Default: (null)]
NOTES:
* The [copy] module recursively copy facility does not scale to lots
(>hundreds) of files. For alternative, see [synchronize] module,
which is a wrapper around `rsync'.
* For Windows targets, use the [win_copy] module instead.
AUTHOR: Ansible Core Team, Michael DeHaan
METADATA:
status:
- stableinterface
supported_by: core
</div>
</pre>
</div>
<aside class="notes">
<p><b>TO Make This List SCROLL</b>, click anywhere on the terminal window</p>
<p><b>TO Make This List STOP</b>, click the "Ansible Terminal" text on top of the console</p>
</aside>
</section>

View File

@@ -1,140 +0,0 @@
<section id="ModuleDoc-CLI-ExampleScroll">
<h2>Modules Documentation</h2>
<p>Also displays usable copy / paste examples of working functional tasks with this module.</p>
<div class="terminal space shadow" onclick="scrollDiv_init('AnsibleDocsExamples','40'); this.onclick = null;" style="cursor: pointer;">
<div class="top">
<div class="title">
<a href="javascript:pauseDiv()" style="none; cursor: pointer;">Ansible Terminal</a>
</div>
</div>
<pre class="bodymw">
<font color="gray"><?=$terminal_prompt?></font> ansible-doc copy
<div id="AnsibleDocsExamples" style="overflow:auto;width:auto;height:700px">
<font color="#FF00FF">EXAMPLES:</font>
<mark>- name: example copying file with owner and permissions </mark>
copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
owner: foo
group: foo
mode: 0644
<mark>- name: The same example as above, but using a symbolic mode equivalent to 0644 </mark>
copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
owner: foo
group: foo
mode: u=rw,g=r,o=r
<mark>- name: Another symbolic mode example, adding some permissions and removing others </mark>
copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
owner: foo
group: foo
mode: u+rw,g-wx,o-rwx
<mark>- name: Copy a new "ntp.conf file into place, backing up the original if it differs from the... </mark>
copy:
src: /mine/ntp.conf
dest: /etc/ntp.conf
owner: root
group: root
mode: 0644
backup: yes
<mark>- name: Copy a new "sudoers" file into place, after passing validation with visudo </mark>
copy:
src: /mine/sudoers
dest: /etc/sudoers
validate: /usr/sbin/visudo -cf %s
<mark>- name: Copy a "sudoers" file on the remote machine for editing </mark>
copy:
src: /etc/sudoers
dest: /etc/sudoers.edit
remote_src: yes
validate: /usr/sbin/visudo -cf %s
<mark>- name: Copy using the 'content' for inline data </mark>
copy:
content: '# This file was moved to /etc/other.conf'
dest: /etc/mine.conf'
<font color="#FF00FF">RETURN VALUES:</font>
dest:
description: destination file/path
returned: success
type: string
sample: /path/to/file.txt
src:
description: source file used for the copy on the target machine
returned: changed
type: string
sample: /home/httpd/.ansible/tmp/ansible-tmp-1423796390.97-147729857856000/source
md5sum:
description: md5 checksum of the file after running copy
returned: when supported
type: string
sample: 2a5aeecc61dc98c4d780b14b330e3282
checksum:
description: sha1 checksum of the file after running copy
returned: success
type: string
sample: 6e642bb8dd5c2e027bf21dd923337cbb4214f827
backup_file:
description: name of backup file created
returned: changed and if backup=yes
type: string
sample: /path/to/file.txt.2015-02-12@22:09~
gid:
description: group id of the file, after execution
returned: success
type: int
sample: 100
group:
description: group of the file, after execution
returned: success
type: string
sample: httpd
owner:
description: owner of the file, after execution
returned: success
type: string
sample: httpd
uid:
description: owner id of the file, after execution
returned: success
type: int
sample: 100
mode:
description: permissions of the target, after execution
returned: success
type: string
sample: 0644
size:
description: size of the target, after execution
returned: success
type: int
sample: 1220
state:
description: state of the target, after execution
returned: success
type: string
sample: file
</div>
</pre>
</div>
<aside class="notes">
<p><b>TO Make This List SCROLL</b>, click anywhere on the terminal window</p>
<p><b>TO Make This List STOP</b>, click the "Ansible Terminal" text on top of the console</p>
</aside>
</section>

View File

@@ -1,76 +0,0 @@
<section id="ModuleDoc-CLI-DashSScroll">
<h2>Modules Documentation</h2>
<p>Starting with the snippet view, you can create your task from pre-formatted scratch.</p>
<div class="terminal space shadow" onclick="scrollDiv_init('AnsibleDocsDashS','20'); this.onclick = null;" style="cursor: pointer;">
<div class="top">
<div class="title">
<a href="javascript:pauseDiv()" style="none; cursor: pointer;">Ansible Terminal</a>
</div>
</div>
<pre class="bodysw">
<font color="gray"><?=$terminal_prompt?></font> ansible-doc copy -s
<div id="AnsibleDocsDashS" style="overflow:auto;width:auto;height:700px">
- name: Copies files to remote locations
copy:
attributes: # Attributes the file or directory should have. To get supported flags look at the man page for `chattr' on the target system. This string
should contain the attributes in the same order as the one displayed by `lsattr'.
backup: # Create a backup file including the timestamp information so you can get the original file back if you somehow clobbered it incorrectly.
checksum: # SHA1 checksum of the file being transferred. Used to validate that the copy of the file was successful. If this is not provided, ansible
will use the local calculated checksum of the src file.
content: # When used instead of `src', sets the contents of a file directly to the specified value. For anything advanced or with formatting also
look at the template module.
decrypt: # This option controls the autodecryption of source files using vault.
dest: # (required) Remote absolute path where the file should be copied to. If `src' is a directory, this must be a directory too. If `dest' is a
nonexistent path and if either `dest' ends with "/" or `src' is a directory, `dest' is created. If `src'
and `dest' are files, the parent directory of `dest' isn't created: the task fails if it doesn't already
exist.
directory_mode: # When doing a recursive copy set the mode for the directories. If this is not set we will use the system defaults. The mode is only set on
directories which are newly created, and will not affect those that already existed.
follow: # This flag indicates that filesystem links in the destination, if they exist, should be followed.
force: # the default is `yes', which will replace the remote file when contents are different than the source. If `no', the file will only be
transferred if the destination does not exist.
group: # Name of the group that should own the file/directory, as would be fed to `chown'.
local_follow: # This flag indicates that filesystem links in the source tree, if they exist, should be followed.
mode: # Mode the file or directory should be. For those used to `/usr/bin/chmod' remember that modes are actually octal numbers. You must either
specify the leading zero so that Ansible's YAML parser knows it is an octal number (like `0644' or
`01777') or quote it (like `'644'' or `'0644'' so Ansible receives a string and can do its own conversion
from string into number. Giving Ansible a number without following one of these rules will end up with a
decimal number which will have unexpected results. As of version 1.8, the mode may be specified as a
symbolic mode (for example, `u+rwx' or `u=rw,g=r,o=r'). As of version 2.3, the mode may also be the
special string `preserve'. `preserve' means that the file will be given the same permissions as the
source file.
owner: # Name of the user that should own the file/directory, as would be fed to `chown'.
remote_src: # If `no', it will search for `src' at originating/master machine. If `yes' it will go to the remote/target machine for the `src'. Default
is `no'. Currently `remote_src' does not support recursive copying. `remote_src' only works with
`mode=preserve' as of version 2.6.
selevel: # Level part of the SELinux file context. This is the MLS/MCS attribute, sometimes known as the `range'. `_default' feature works as for
`seuser'.
serole: # Role part of SELinux file context, `_default' feature works as for `seuser'.
setype: # Type part of SELinux file context, `_default' feature works as for `seuser'.
seuser: # User part of SELinux file context. Will default to system policy, if applicable. If set to `_default', it will use the `user' portion of
the policy if available.
src: # Local path to a file to copy to the remote server; can be absolute or relative. If path is a directory, it is copied recursively. In this
case, if path ends with "/", only inside contents of that directory are copied to destination. Otherwise,
if it does not end with "/", the directory itself with all contents is copied. This behavior is similar to
Rsync.
unsafe_writes: # Normally this module uses atomic operations to prevent data corruption or inconsistent reads from the target files, sometimes systems are
configured or just broken in ways that prevent this. One example are docker mounted files, they cannot be
updated atomically and can only be done in an unsafe manner. This boolean option allows ansible to fall
back to unsafe methods of updating files for those cases in which you do not have any other choice. Be
aware that this is subject to race conditions and can lead to data corruption.
validate: # The validation command to run before copying into place. The path to the file to validate is passed in via '%s' which must be present as
in the example below. The command is passed securely so shell features like expansion and pipes won't
work.
</div>
</pre>
</div>
<aside class="notes">
<p><b>TO Make This List SCROLL</b>, click anywhere on the terminal window</p>
<p><b>TO Make This List STOP</b>, click the "Ansible Terminal" text on top of the console</p>
</aside>
</section>

View File

@@ -1,9 +0,0 @@
<section id="ModuleDocWebsite" data-background-image="images/modules-doc-screenshots.png">
<div style="position:absolute; right: 50px; top: -330px;">
<h1>Modules Documentation</h1>
</div>
</section>

View File

@@ -1,18 +0,0 @@
<section id="CommandOptions">
<h2>Modules: Run Commands</h2>
<p>If Ansible doesn't have a module that suits your needs there are the “run command” modules:</p><br>
<ul>
<li><b>command</b>: Takes the command and executes it on the host. The most secure and predictable.</li>
<li><b>shell</b>: Executes through a shell like <code>/bin/sh</code> so you can use pipes etc. Be careful.</li>
<li><b>raw</b>: Executes a command without going through the Ansible module subsystem.</li><br>
</ul>
<p><br><b>NOTE:</b> Unlike standard modules, run commands have no concept of desired state and should only be used as a last resort.</p>
<aside class="notes">
<p>&quot;Run commands&quot; are what we collectively call these modules that enable users to do command-line operations in different ways. Theyre a great catch all mechanism for getting things done, but they should be used sparingly and as a last resort. The reasons are many and varied.</p>
<p>The overuse of run commands is common amongst those just becoming familiar with Ansible for automating their work. They use <code>shell</code> to fire off a bash command they already know without stopping to look at the Ansible docs. That works well enough initially, but it undermines the value of automating with Ansible and sets things up for problems down the road. <b>As a best practice, always check the hundreds of Ansible shipping modules for what you need and use those first and run commands as a last resort.</b></p>
<p><b>NOTE:</b> <code>shell</code> allows for IO redirection such as pipes. This is why It&apos;s best practice to use <code>command</code> unless they need to pipe something. It also best practice to <strong>never</strong> pass user input or variables thru a run command.</p>
</aside>
</section>

View File

@@ -1,25 +0,0 @@
<section id="ModuleDoc-CLI-List">
<h2>Modules Documentation</h2>
<p>Returns a list of literally every module available on the system</p>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodymw">
<font color="silver"># List out all modules installed -- returns MANY lines</font>
<font color="gray"><?=$terminal_prompt?></font> ansible-doc -l
copy Copies files to remote...
stat Retrieve file or file ...
synchronize A wrapper around rsync...
template Templates a file out t...
vmware_guest Manages virtual machin...
yum Manages packages with ...
<font color="#FF00FF">Many, many lines have been truncated. This is a very small sample
of the incredibly long list of modules.</font>
</pre>
</div>
</section>

View File

@@ -1,12 +0,0 @@
<section data-state="title alt" id="RedIntro-Inventory">
<h1>INVENTORY</h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Define hosts on which the playbook will run.</p>
<aside class="notes">
<p>Ansible</p>
</aside>
</section>

View File

@@ -1,19 +0,0 @@
<section id="WhatIsInventory">
<h2>Inventory</h2>
<p>Inventory is a collection of hosts (nodes) with associated data and groupings that Ansible can connect and manage.</p>
<ul>
<li>Hosts (nodes)</li>
<li>Groups</li>
<li>Inventory-specific data (variables)</li>
<li>Static or dynamic sources</li>
</ul>
<aside class="notes">
<p>We've already discussed inventory in our review of Ansible's key components.</p>
<p>Inventory consists of hosts, groups, inventory specific data. Inventory can either be static or dynamic.</p>
<p>Inventory is a collection of the hosts (nodes) with associated metadata and groupings that Ansible can connect and manage. An inventory source can be static files or dynamically retrieved from an external system.</p>
<p>You can specify a different inventory file using the <code>-i &lt;path&gt;</code> option on the command-line or your Ansible configuration file.</p>
</aside>
</section>

View File

@@ -1,28 +0,0 @@
<section id="StaticInventoryExampleBasic">
<h2>Static Inventory Example</h2>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodylw">
<font color="silver"># Static inventory example:</font>
[myservers]
10.42.0.2
10.42.0.6
10.42.0.7
10.42.0.8
10.42.0.100
host.example.com
</pre>
</div>
<aside class="notes">
<p>Static inventory is the easiest source to get started with. This example shows a static inventory source in It&rsquo;s simplest form &ndash; a single file with a list of IP addresses or hostnames.</p>
<p><strong>NOTE:</strong> Ansible infers a localhost is present even if it is not explicitly listed. This is why you can actually run Ansible without a inventory source. Ansible will only be able to operate on the localhost where it is being run.</p>
</aside>
</section>

View File

@@ -1,179 +0,0 @@
<section id="StaticInventoryExampleAdvanced">
<center><h2>A MORE ADVANCED STATIC INVENTORY EXAMPLE</h2></center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodylw">
<font color="silver"># A more advanced static inventory example:</font>
<font color="#FF00FF">[control]</font>
mainserver ansible_host=10.42.0.2
<font color="#FF00FF">[web]</font>
node-[1:30] ansible_host=10.42.0.[31:60]
<font color="#FF00FF">[haproxy]</font>
haproxy ansible_host=10.42.0.100
<font color="yellow">[all:vars]</font>
ansible_user=kev
ansible_ssh_private_key_file=/home/kev/.ssh/id_rsa
</pre>
</div>
<aside class="notes">
<p>The example shown here is a more practical and common example of a static inventory file.</p>
<p>Static inventory files are expressed in INI format. The headings in brackets are group names, which are used in classifying systems and deciding what systems you are controlling at what times and for what purpose. Hosts can belong to multiple groups and groups can be members of other groups. (The latter is not shown here.)</p>
<p>NOTE: This example contains variables, a topic we haven't touched on just yet. We'll go into them on the next slide.</p>
<p>Other noteworthy attributes in our example:</p>
<ul>
<li><code>ansible_host</code> is an example of a host variable.</li>
<li>Hosts can be assigned arbitrary human-meaningful names or aliases such as "control" and "haproxy". Ansible will instead use the value of <code>ansible_host</code> (one of several <a href="http://docs.ansible.com/ansible/playbooks_variables.html#magic-variables-and-how-to-access-information-about-other-hosts">&quot;magic&quot; inventory variables</a>) as the network address to connect.</li>
<li>Static inventory files can support character ranges such as &quot;node-[1:3]&quot;</li>
<li>Like localhost, Ansible infers an &quot;all&quot; group is present. As its name implies, all inventory hosts are members of this group.</li>
<li>The heading &quot;all:vars&quot; is an example of group variable assignment using two more &quot;magic&quot; variables, <code>ansible_ssh_private_key_file</code> and <code>ansible_user</code>.</li>
</ul>
<p>This example just covers the basics. There's a lot more to inventory that is not covered here. See the <a href="http://docs.ansible.com/ansible/intro_inventory.html">Ansible inventory documentation</a> for more details.</p>
</aside>
</section>
<section id="StaticInventory-Mark-AH-Static">
<center><h2>A MORE ADVANCED STATIC INVENTORY EXAMPLE</h2></center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodylw">
<font color="silver"># A more advanced static inventory example:</font>
<font color="#FF00FF">[control]</font>
mainserver <mark>ansible_host=10.42.0.2</mark>
<font color="#FF00FF">[web]</font>
node-[1:30] ansible_host=10.42.0.[31:60]
<font color="#FF00FF">[haproxy]</font>
haproxy <mark>ansible_host=10.42.0.100</mark>
<font color="yellow">[all:vars]</font>
ansible_user=kev
ansible_ssh_private_key_file=/home/kev/.ssh/id_rsa
</pre>
</div>
<aside class="notes">
<p>The example shown here is a more practical and common example of a static inventory file.</p>
<p>Static inventory files are expressed in INI format. The headings in brackets are group names, which are used in classifying systems and deciding what systems you are controlling at what times and for what purpose. Hosts can belong to multiple groups and groups can be members of other groups. (The latter is not shown here.)</p>
<p>NOTE: This example contains variables, a topic we haven't touched on just yet. We'll go into them on the next slide.</p>
<p>Other noteworthy attributes in our example:</p>
<ul>
<li><code>ansible_host</code> is an example of a host variable.</li>
<li>Hosts can be assigned arbitrary human-meaningful names or aliases such as "control" and "haproxy". Ansible will instead use the value of <code>ansible_host</code> (one of several <a href="http://docs.ansible.com/ansible/playbooks_variables.html#magic-variables-and-how-to-access-information-about-other-hosts">&quot;magic&quot; inventory variables</a>) as the network address to connect.</li>
<li>Static inventory files can support character ranges such as &quot;node-[1:3]&quot;</li>
<li>Like localhost, Ansible infers an &quot;all&quot; group is present. As its name implies, all inventory hosts are members of this group.</li>
<li>The heading &quot;all:vars&quot; is an example of group variable assignment using two more &quot;magic&quot; variables, <code>ansible_ssh_private_key_file</code> and <code>ansible_user</code>.</li>
</ul>
<p>This example just covers the basics. There's a lot more to inventory that is not covered here. See the <a href="http://docs.ansible.com/ansible/intro_inventory.html">Ansible inventory documentation</a> for more details.</p>
</aside>
</section>
<section id="StaticInventory-Mark-AH-Range">
<center><h2>A MORE ADVANCED STATIC INVENTORY EXAMPLE</h2></center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodylw">
<font color="silver"># A more advanced static inventory example:</font>
<font color="#FF00FF">[control]</font>
mainserver ansible_host=10.42.0.2
<font color="#FF00FF">[web]</font>
node-<mark>[1:30]</mark> ansible_host=10.42.0.<mark>[31:60]</mark>
<font color="#FF00FF">[haproxy]</font>
haproxy ansible_host=10.42.0.100
<font color="yellow">[all:vars]</font>
ansible_user=kev
ansible_ssh_private_key_file=/home/kev/.ssh/id_rsa
</pre>
</div>
<aside class="notes">
<p>The example shown here is a more practical and common example of a static inventory file.</p>
<p>Static inventory files are expressed in INI format. The headings in brackets are group names, which are used in classifying systems and deciding what systems you are controlling at what times and for what purpose. Hosts can belong to multiple groups and groups can be members of other groups. (The latter is not shown here.)</p>
<p>NOTE: This example contains variables, a topic we haven't touched on just yet. We'll go into them on the next slide.</p>
<p>Other noteworthy attributes in our example:</p>
<ul>
<li><code>ansible_host</code> is an example of a host variable.</li>
<li>Hosts can be assigned arbitrary human-meaningful names or aliases such as "control" and "haproxy". Ansible will instead use the value of <code>ansible_host</code> (one of several <a href="http://docs.ansible.com/ansible/playbooks_variables.html#magic-variables-and-how-to-access-information-about-other-hosts">&quot;magic&quot; inventory variables</a>) as the network address to connect.</li>
<li>Static inventory files can support character ranges such as &quot;node-[1:3]&quot;</li>
<li>Like localhost, Ansible infers an &quot;all&quot; group is present. As its name implies, all inventory hosts are members of this group.</li>
<li>The heading &quot;all:vars&quot; is an example of group variable assignment using two more &quot;magic&quot; variables, <code>ansible_ssh_private_key_file</code> and <code>ansible_user</code>.</li>
</ul>
<p>This example just covers the basics. There's a lot more to inventory that is not covered here. See the <a href="http://docs.ansible.com/ansible/intro_inventory.html">Ansible inventory documentation</a> for more details.</p>
</aside>
</section>
<section id="StaticInventory-Mark-AH-Vars">
<center><h2>A MORE ADVANCED STATIC INVENTORY EXAMPLE</h2></center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodylw">
<font color="silver"># A more advanced static inventory example:</font>
<font color="#FF00FF">[control]</font>
mainserver ansible_host=10.42.0.2
<font color="#FF00FF">[web]</font>
node-[1:30] ansible_host=10.42.0.[31:60]
<font color="#FF00FF">[haproxy]</font>
haproxy ansible_host=10.42.0.100
<font color="#FF00FF">[all:vars]</font>
<mark>ansible_user=kev
ansible_ssh_private_key_file=/home/kev/.ssh/id_rsa</mark>
</pre>
</div>
<aside class="notes">
<p>The example shown here is a more practical and common example of a static inventory file.</p>
<p>Static inventory files are expressed in INI format. The headings in brackets are group names, which are used in classifying systems and deciding what systems you are controlling at what times and for what purpose. Hosts can belong to multiple groups and groups can be members of other groups. (The latter is not shown here.)</p>
<p>NOTE: This example contains variables, a topic we haven't touched on just yet. We'll go into them on the next slide.</p>
<p>Other noteworthy attributes in our example:</p>
<ul>
<li><code>ansible_host</code> is an example of a host variable.</li>
<li>Hosts can be assigned arbitrary human-meaningful names or aliases such as "control" and "haproxy". Ansible will instead use the value of <code>ansible_host</code> (one of several <a href="http://docs.ansible.com/ansible/playbooks_variables.html#magic-variables-and-how-to-access-information-about-other-hosts">&quot;magic&quot; inventory variables</a>) as the network address to connect.</li>
<li>Static inventory files can support character ranges such as &quot;node-[1:3]&quot;</li>
<li>Like localhost, Ansible infers an &quot;all&quot; group is present. As its name implies, all inventory hosts are members of this group.</li>
<li>The heading &quot;all:vars&quot; is an example of group variable assignment using two more &quot;magic&quot; variables, <code>ansible_ssh_private_key_file</code> and <code>ansible_user</code>.</li>
</ul>
<p>This example just covers the basics. There's a lot more to inventory that is not covered here. See the <a href="http://docs.ansible.com/ansible/intro_inventory.html">Ansible inventory documentation</a> for more details.</p>
</aside>
</section>

View File

@@ -1,60 +0,0 @@
<section id="StaticInventoryExampleWin">
<center><h2>A WINDOWS STATIC INVENTORY EXAMPLE</h2></center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodylw">
<font color="silver"># Windows vars inventory example:</font>
<font color="#FF00FF">[winservers]</font>
blueiris ansible_host=10.10.2.20
winfileprd[1:3] ansible_host=10.13.128.[7:9]
winwebsrv01 ansible_host=10.14.27.16
<font color="#FF00FF">[winservers:vars]</font>
ansible_connection: winrm
ansible_winrm_transport: credssp
ansible_port: 5986
ansible_winrm_server_cert_validation: ignore
</pre>
</div>
<aside class="notes">
<p>Notes go here.
</p>
</aside>
</section>
<section id="StaticInventoryExampleWinMarked">
<center><h2>A WINDOWS STATIC INVENTORY EXAMPLE</h2></center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodylw">
<font color="silver"># Windows vars inventory example:</font>
<font color="#FF00FF">[winservers]</font>
blueiris ansible_host=10.10.2.20
winfileprd[1:3] ansible_host=10.13.128.[7:9]
winwebsrv01 ansible_host=10.14.27.16
<font color="#FF00FF">[winservers:vars]</font>
<mark>ansible_connection: winrm
ansible_winrm_transport: credssp
ansible_port: 5986
ansible_winrm_server_cert_validation: ignore</mark>
</pre>
</div>
<aside class="notes">
<p>Notes go here.
</p>
</aside>
</section>

View File

@@ -1,10 +0,0 @@
<section data-state="lab alt" id="<?=$labid?>-01">
<h1><?=$pretty_htmldir?></h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Take a moment to get familiar with your lab inventory. Look at the file:<br>/some/path/to/something</p>
</section>
<section data-state="lab alt" id="<?=$labid?>-02">
<h1><?=$pretty_htmldir?></h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Notice the items in the inventory. This vague statement will be updated soon to be more clear about what this lab involes.</p>
</section>

View File

@@ -1,14 +0,0 @@
<section data-state="title alt" id="RedIntro-AdHocExplained">
<h1>AD-HOC COMMANDS</h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>An ad-hoc command is a single Ansible task to perform quickly, but dont want to save for later.</p>
<aside class="notes">
<p>Ansible ad-hoc commands is a good place to start to understand the basics of what Ansible can do before learning how to use playbooks &ndash; ad-hoc commands can also be used to do quick things that you might not necessarily want to write a full playbook for.</p>
<p>Generally speaking, the true power of Ansible lies in playbooks. So why would you use ad-hoc tasks versus playbooks?</p>
<p>For instance, if you wanted to restart a service on all of your lab nodes, you could execute a quick one-liner in Ansible without writing a playbook.</p>
</aside>
</section>

View File

@@ -1,17 +0,0 @@
<section id="AdHocOptions">
<h2>Ad-Hoc Commands: Common Options</h2>
<ul style="font-size: 0.75em;">
<li><b>-m MODULE_NAME, --module-name=MODULE_NAME</b><br/>Module name to execute the ad-hoc command</li>
<li><b>-a MODULE_ARGS, --args=MODULE_ARGS</b><br/>Module arguments for the ad-hoc command</li>
<li><b>-b, --become</b><br/>Run ad-hoc command with elevated rights such as sudo, the default method</li>
<li><b>-e EXTRA_VARS, --extra-vars=EXTRA_VARS</b><br/>Set additional variables as key=value or YAML/JSON</li>
<li><b>--version</b><br/>Display the version of Ansible</li>
<li><b>--help</b><br/>Display the MAN page for the Ansible tool</li>
</ul>
<aside class="notes">
<p>This slide shows essential command-line options for running ad-hoc commands that will be useful in our upcoming workshop assignment.</p>
</aside>
</section>
</section>

View File

@@ -1,29 +0,0 @@
<section id="AdHocCommands-Terminal">
<center><h2>AD HOC COMMANDS</h2></center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodyl">
<font color="silver"># Check connections (submarine ping, not ICMP)</font>
<font color="gray"><?=$terminal_prompt?></font> ansible all -m ping
<font color="silver"># Run a command on all the hosts in the web group</font>
<font color="gray"><?=$terminal_prompt?></font> ansible web -m command -a &quot;uptime&quot;
<font color="silver"># Collect and display known facts</font>
<font color="gray"><?=$terminal_prompt?></font> ansible localhost -m setup
</pre>
</div>
<aside class="notes">
<p>Ad-hoc commands are quick checks on your servers that you dont want to preserve in an Ansible playbook.</p>
<p>An ad-hoc command can be used to do some tasks that you might not necessarily want to write a full playbook and save for later.</p>
<p>This is a good place to start to understand the basics of what Ansible can do prior to learning about playbooks where the true power of Ansible automation lies.</p>
<p>For more information see <a href="http://docs.ansible.com/ansible/intro_adhoc.html">Introduction To Ad-Hoc Commands</a>.</p>
</aside>
</section>

View File

@@ -1,584 +0,0 @@
<section id="SetupM-FULL-Scrolling">
<h2>Full Fact List</h2>
<p>Returns a list of literally every fact available on the system</p>
<div class="terminal space shadow" onclick="scrollDiv_init('AnsibleSetupM','1'); this.onclick = null;" style="cursor: pointer;">
<div class="top">
<div class="title">
<a href="javascript:pauseDiv()" style="none; cursor: pointer;">Ansible Terminal</a>
</div>
</div>
<pre class="bodymw">
<font color="gray"><?=$terminal_prompt?></font> ansible myserver.mine -m setup
<mark>Provides a long list of all facts known of this system</mark>
<div id="AnsibleSetupM" style="overflow:auto;width:auto;height:700px;">
localhost | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"10.0.20.5"
],
"ansible_all_ipv6_addresses": [
"fe80::4e98:35fe:3b14:33dc"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "04/05/2016",
"ansible_bios_version": "6.00",
"ansible_cmdline": {
"BOOT_IMAGE": "/vmlinuz-3.10.0-693.21.1.el7.x86_64",
"LANG": "en_US.UTF-8",
"crashkernel": "auto",
"quiet": true,
"rhgb": true,
"ro": true,
"root": "UUID=d49a9903-d546-4981-bffb-4e5147e1199b"
},
"ansible_date_time": {
"date": "2018-08-14",
"day": "14",
"epoch": "1534279494",
"hour": "16",
"iso8601": "2018-08-14T20:44:54Z",
"iso8601_basic": "20180814T164454915629",
"iso8601_basic_short": "20180814T164454",
"iso8601_micro": "2018-08-14T20:44:54.915745Z",
"minute": "44",
"month": "08",
"second": "54",
"time": "16:44:54",
"tz": "EDT",
"tz_offset": "-0400",
"weekday": "Tuesday",
"weekday_number": "2",
"weeknumber": "33",
"year": "2018"
},
"ansible_default_ipv4": {
"address": "10.0.20.5",
"alias": "ens192",
"broadcast": "10.0.20.255",
"gateway": "10.0.20.1",
"interface": "ens192",
"macaddress": "00:50:56:bb:30:e8",
"mtu": 1500,
"netmask": "255.255.255.0",
"network": "10.0.20.0",
"type": "ether"
},
"ansible_default_ipv6": {},
"ansible_device_links": {
"ids": {
"sr0": [
"ata-VMware_Virtual_SATA_CDRW_Drive_00000000000000000001"
]
},
"labels": {},
"masters": {},
"uuids": {
"sda1": [
"619dcc55-451d-44be-b364-8c94278c567c"
],
"sda2": [
"d49a9903-d546-4981-bffb-4e5147e1199b"
]
}
},
"ansible_devices": {
"sda": {
"holders": [],
"host": "Serial Attached SCSI controller: VMware PVSCSI SCSI Controller (rev 02)",
"links": {
"ids": [],
"labels": [],
"masters": [],
"uuids": []
},
"model": "Virtual disk",
"partitions": {
"sda1": {
"holders": [],
"links": {
"ids": [],
"labels": [],
"masters": [],
"uuids": [
"619dcc55-451d-44be-b364-8c94278c567c"
]
},
"sectors": "2097152",
"sectorsize": 512,
"size": "1.00 GB",
"start": "2048",
"uuid": "619dcc55-451d-44be-b364-8c94278c567c"
},
"sda2": {
"holders": [],
"links": {
"ids": [],
"labels": [],
"masters": [],
"uuids": [
"d49a9903-d546-4981-bffb-4e5147e1199b"
]
},
"sectors": "31455232",
"sectorsize": 512,
"size": "15.00 GB",
"start": "2099200",
"uuid": "d49a9903-d546-4981-bffb-4e5147e1199b"
}
},
"removable": "0",
"rotational": "1",
"sas_address": null,
"sas_device_handle": null,
"scheduler_mode": "deadline",
"sectors": "41943040",
"sectorsize": "512",
"size": "20.00 GB",
"support_discard": "0",
"vendor": "VMware",
"virtual": 1
},
"sr0": {
"holders": [],
"host": "SATA controller: VMware SATA AHCI controller",
"links": {
"ids": [
"ata-VMware_Virtual_SATA_CDRW_Drive_00000000000000000001"
],
"labels": [],
"masters": [],
"uuids": []
},
"model": "VMware SATA CD00",
"partitions": {},
"removable": "1",
"rotational": "1",
"sas_address": null,
"sas_device_handle": null,
"scheduler_mode": "cfq",
"sectors": "2097151",
"sectorsize": "512",
"size": "1024.00 MB",
"support_discard": "0",
"vendor": "NECVMWar",
"virtual": 1
}
},
"ansible_distribution": "CentOS",
"ansible_distribution_file_parsed": true,
"ansible_distribution_file_path": "/etc/redhat-release",
"ansible_distribution_file_variety": "RedHat",
"ansible_distribution_major_version": "7",
"ansible_distribution_release": "Core",
"ansible_distribution_version": "7.4.1708",
"ansible_dns": {
"nameservers": [
"10.0.20.1"
],
"search": [
"kev"
]
},
"ansible_domain": "kev",
"ansible_effective_group_id": 0,
"ansible_effective_user_id": 0,
"ansible_ens192": {
"active": true,
"device": "ens192",
"features": {
"busy_poll": "off [fixed]",
"fcoe_mtu": "off [fixed]",
"generic_receive_offload": "on",
"generic_segmentation_offload": "on",
"highdma": "on",
"hw_tc_offload": "off [fixed]",
"l2_fwd_offload": "off [fixed]",
"large_receive_offload": "on",
"loopback": "off [fixed]",
"netns_local": "off [fixed]",
"ntuple_filters": "off [fixed]",
"receive_hashing": "off [fixed]",
"rx_all": "off [fixed]",
"rx_checksumming": "on",
"rx_fcs": "off [fixed]",
"rx_vlan_filter": "on [fixed]",
"rx_vlan_offload": "on",
"rx_vlan_stag_filter": "off [fixed]",
"rx_vlan_stag_hw_parse": "off [fixed]",
"scatter_gather": "on",
"tcp_segmentation_offload": "on",
"tx_checksum_fcoe_crc": "off [fixed]",
"tx_checksum_ip_generic": "on",
"tx_checksum_ipv4": "off [fixed]",
"tx_checksum_ipv6": "off [fixed]",
"tx_checksum_sctp": "off [fixed]",
"tx_checksumming": "on",
"tx_fcoe_segmentation": "off [fixed]",
"tx_gre_csum_segmentation": "off [fixed]",
"tx_gre_segmentation": "off [fixed]",
"tx_gso_partial": "off [fixed]",
"tx_gso_robust": "off [fixed]",
"tx_ipip_segmentation": "off [fixed]",
"tx_lockless": "off [fixed]",
"tx_mpls_segmentation": "off [fixed]",
"tx_nocache_copy": "off",
"tx_scatter_gather": "on",
"tx_scatter_gather_fraglist": "off [fixed]",
"tx_sctp_segmentation": "off [fixed]",
"tx_sit_segmentation": "off [fixed]",
"tx_tcp6_segmentation": "on",
"tx_tcp_ecn_segmentation": "off [fixed]",
"tx_tcp_mangleid_segmentation": "off",
"tx_tcp_segmentation": "on",
"tx_udp_tnl_csum_segmentation": "off [fixed]",
"tx_udp_tnl_segmentation": "off [fixed]",
"tx_vlan_offload": "on",
"tx_vlan_stag_hw_insert": "off [fixed]",
"udp_fragmentation_offload": "off [fixed]",
"vlan_challenged": "off [fixed]"
},
"hw_timestamp_filters": [],
"ipv4": {
"address": "10.0.20.5",
"broadcast": "10.0.20.255",
"netmask": "255.255.255.0",
"network": "10.0.20.0"
},
"ipv6": [
{
"address": "fe80::4e98:35fe:3b14:33dc",
"prefix": "64",
"scope": "link"
}
],
"macaddress": "00:50:56:bb:30:e8",
"module": "vmxnet3",
"mtu": 1500,
"pciid": "0000:0b:00.0",
"promisc": false,
"speed": 10000,
"timestamping": [
"rx_software",
"software"
],
"type": "ether"
},
"ansible_env": {
"HISTCONTROL": "ignoredups",
"HISTSIZE": "1000",
"HOME": "/root",
"HOSTNAME": "myserver",
"LANG": "en_US.UTF-8",
"LESSOPEN": "||/usr/bin/lesspipe.sh %s",
"LOGNAME": "root",
"LS_COLORS": "rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:",
"MAIL": "/var/spool/mail/root",
"PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin",
"PWD": "/root",
"SHELL": "/bin/bash",
"SHLVL": "3",
"SSH_CLIENT": "10.0.0.74 53446 22",
"SSH_CONNECTION": "10.0.0.74 53446 10.0.20.5 22",
"SSH_TTY": "/dev/pts/0",
"TERM": "xterm-256color",
"USER": "root",
"XDG_RUNTIME_DIR": "/run/user/0",
"XDG_SESSION_ID": "270",
"_": "/usr/bin/python2"
},
"ansible_fips": false,
"ansible_form_factor": "Other",
"ansible_fqdn": "myserver.mine",
"ansible_hostname": "myserver",
"ansible_interfaces": [
"lo",
"ens192"
],
"ansible_is_chroot": false,
"ansible_iscsi_iqn": "",
"ansible_kernel": "3.10.0-693.21.1.el7.x86_64",
"ansible_lo": {
"active": true,
"device": "lo",
"features": {
"busy_poll": "off [fixed]",
"fcoe_mtu": "off [fixed]",
"generic_receive_offload": "on",
"generic_segmentation_offload": "on",
"highdma": "on [fixed]",
"hw_tc_offload": "off [fixed]",
"l2_fwd_offload": "off [fixed]",
"large_receive_offload": "off [fixed]",
"loopback": "on [fixed]",
"netns_local": "on [fixed]",
"ntuple_filters": "off [fixed]",
"receive_hashing": "off [fixed]",
"rx_all": "off [fixed]",
"rx_checksumming": "on [fixed]",
"rx_fcs": "off [fixed]",
"rx_vlan_filter": "off [fixed]",
"rx_vlan_offload": "off [fixed]",
"rx_vlan_stag_filter": "off [fixed]",
"rx_vlan_stag_hw_parse": "off [fixed]",
"scatter_gather": "on",
"tcp_segmentation_offload": "on",
"tx_checksum_fcoe_crc": "off [fixed]",
"tx_checksum_ip_generic": "on [fixed]",
"tx_checksum_ipv4": "off [fixed]",
"tx_checksum_ipv6": "off [fixed]",
"tx_checksum_sctp": "on [fixed]",
"tx_checksumming": "on",
"tx_fcoe_segmentation": "off [fixed]",
"tx_gre_csum_segmentation": "off [fixed]",
"tx_gre_segmentation": "off [fixed]",
"tx_gso_partial": "off [fixed]",
"tx_gso_robust": "off [fixed]",
"tx_ipip_segmentation": "off [fixed]",
"tx_lockless": "on [fixed]",
"tx_mpls_segmentation": "off [fixed]",
"tx_nocache_copy": "off [fixed]",
"tx_scatter_gather": "on [fixed]",
"tx_scatter_gather_fraglist": "on [fixed]",
"tx_sctp_segmentation": "on",
"tx_sit_segmentation": "off [fixed]",
"tx_tcp6_segmentation": "on",
"tx_tcp_ecn_segmentation": "on",
"tx_tcp_mangleid_segmentation": "on",
"tx_tcp_segmentation": "on",
"tx_udp_tnl_csum_segmentation": "off [fixed]",
"tx_udp_tnl_segmentation": "off [fixed]",
"tx_vlan_offload": "off [fixed]",
"tx_vlan_stag_hw_insert": "off [fixed]",
"udp_fragmentation_offload": "on",
"vlan_challenged": "on [fixed]"
},
"hw_timestamp_filters": [],
"ipv4": {
"address": "127.0.0.1",
"broadcast": "host",
"netmask": "255.0.0.0",
"network": "127.0.0.0"
},
"ipv6": [
{
"address": "::1",
"prefix": "128",
"scope": "host"
}
],
"mtu": 65536,
"promisc": false,
"timestamping": [
"rx_software",
"software"
],
"type": "loopback"
},
"ansible_local": {
"is_installed": {
"is_vim_installed": {
"vim": "true"
}
},
"package_list": {
"all_kev_packages": {
"package1": "acl-2.2.51-12.el7.x86_64",
"package10": "authconfig-6.2.8-30.el7.x86_64",
"package11": "basesystem-10.0-7.el7.centos.noarch",
"package2": "aic94xx-firmware-30-6.el7.noarch",
"package3": "alsa-firmware-1.0.28-2.el7.noarch",
"package4": "alsa-lib-1.1.3-3.el7.x86_64",
"package5": "alsa-tools-firmware-1.1.0-1.el7.x86_64",
"package6": "ansible-2.6.1-1.el7.noarch",
"package7": "ansible-lint-3.4.21-1.el7.noarch",
"package8": "audit-2.7.6-3.el7.x86_64",
"package9": "audit-libs-2.7.6-3.el7.x86_64"
}
},
"system_owner": {
"system_owner": {
"owner": "kev"
}
}
},
"ansible_lsb": {},
"ansible_machine": "x86_64",
"ansible_machine_id": "072bb764550746bd9695d73f43c9cf3b",
"ansible_memfree_mb": 1307,
"ansible_memory_mb": {
"nocache": {
"free": 1579,
"used": 260
},
"real": {
"free": 1307,
"total": 1839,
"used": 532
},
"swap": {
"cached": 0,
"free": 0,
"total": 0,
"used": 0
}
},
"ansible_memtotal_mb": 1839,
"ansible_mounts": [
{
"block_available": 3300883,
"block_size": 4096,
"block_total": 3929344,
"block_used": 628461,
"device": "/dev/sda2",
"fstype": "xfs",
"inode_available": 7804215,
"inode_total": 7863808,
"inode_used": 59593,
"mount": "/",
"options": "rw,relatime,attr2,inode64,noquota",
"size_available": 13520416768,
"size_total": 16094593024,
"uuid": "d49a9903-d546-4981-bffb-4e5147e1199b"
},
{
"block_available": 207739,
"block_size": 4096,
"block_total": 259584,
"block_used": 51845,
"device": "/dev/sda1",
"fstype": "xfs",
"inode_available": 523947,
"inode_total": 524288,
"inode_used": 341,
"mount": "/boot",
"options": "rw,relatime,attr2,inode64,noquota",
"size_available": 850898944,
"size_total": 1063256064,
"uuid": "619dcc55-451d-44be-b364-8c94278c567c"
}
],
"ansible_nodename": "myserver",
"ansible_os_family": "RedHat",
"ansible_pkg_mgr": "yum",
"ansible_processor": [
"0",
"GenuineIntel",
"Intel(R) Xeon(R) CPU X5660 @ 2.80GHz"
],
"ansible_processor_cores": 1,
"ansible_processor_count": 1,
"ansible_processor_threads_per_core": 1,
"ansible_processor_vcpus": 1,
"ansible_product_name": "VMware Virtual Platform",
"ansible_product_serial": "VMware-42 3b 24 ce 91 e0 3a be-b1 02 3c 83 0f 86 02 e8",
"ansible_product_uuid": "CE243B42-E091-BE3A-B102-3C830F8602E8",
"ansible_product_version": "None",
"ansible_python": {
"executable": "/usr/bin/python2",
"has_sslcontext": true,
"type": "CPython",
"version": {
"major": 2,
"micro": 5,
"minor": 7,
"releaselevel": "final",
"serial": 0
},
"version_info": [
2,
7,
5,
"final",
0
]
},
"ansible_python_version": "2.7.5",
"ansible_real_group_id": 0,
"ansible_real_user_id": 0,
"ansible_selinux": {
"status": "disabled"
},
"ansible_selinux_python_present": true,
"ansible_service_mgr": "systemd",
"ansible_ssh_host_key_ecdsa_public": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHa2kNk4tpZ4/rXxM6969XkR29JQa91M7sSRHheXeQxmZjnRp/5o2ADQjFmXz+PouYA8PMiBU9u5Mx44oEXxDmU=",
"ansible_ssh_host_key_ed25519_public": "AAAAC3NzaC1lZDI1NTE5AAAAIE5MKxH1C+uyIHjAz48pwHj+6HdXw/9vCnc2PHRQZVND",
"ansible_ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDMNVNNOgPb+L9rnrm0D2dQWRVEjtnWAgbgVDtdixE79+jDR5TGfxuUmf74yRXM0flrdvirQtBvZjSwsj3/fUReUas0gt3LVs1b7jsxK6QeGgQCx6CCeopMgUb0JYXsMexbekZxxnpBcWAXh/Bjhko/8FpZaZhIvk0VTzQMCP7+/netcTi1m+CCCF1YhQmy8bGhN+aJuaaP2VMSDSauOFGUQUUaJkw+pjata+qWMwYemDabszkePFp0rBQEDSo6fIMlXvInm75Jf24tyb+X9+kOycGk4Rits/jXseB6j+L3rZRCX6b/F3JMNtqoBc7nybGvD/8Njn9Sl67DQUZenkcX",
"ansible_swapfree_mb": 0,
"ansible_swaptotal_mb": 0,
"ansible_system": "Linux",
"ansible_system_capabilities": [
"cap_chown",
"cap_dac_override",
"cap_dac_read_search",
"cap_fowner",
"cap_fsetid",
"cap_kill",
"cap_setgid",
"cap_setuid",
"cap_setpcap",
"cap_linux_immutable",
"cap_net_bind_service",
"cap_net_broadcast",
"cap_net_admin",
"cap_net_raw",
"cap_ipc_lock",
"cap_ipc_owner",
"cap_sys_module",
"cap_sys_rawio",
"cap_sys_chroot",
"cap_sys_ptrace",
"cap_sys_pacct",
"cap_sys_admin",
"cap_sys_boot",
"cap_sys_nice",
"cap_sys_resource",
"cap_sys_time",
"cap_sys_tty_config",
"cap_mknod",
"cap_lease",
"cap_audit_write",
"cap_audit_control",
"cap_setfcap",
"cap_mac_override",
"cap_mac_admin",
"cap_syslog",
"35",
"36+ep"
],
"ansible_system_capabilities_enforced": "True",
"ansible_system_vendor": "VMware, Inc.",
"ansible_uptime_seconds": 137627,
"ansible_user_dir": "/root",
"ansible_user_gecos": "root",
"ansible_user_gid": 0,
"ansible_user_id": "root",
"ansible_user_shell": "/bin/bash",
"ansible_user_uid": 0,
"ansible_userspace_architecture": "x86_64",
"ansible_userspace_bits": "64",
"ansible_virtualization_role": "guest",
"ansible_virtualization_type": "VMware",
"gather_subset": [
"all"
],
"module_setup": true
},
"changed": false
}
</div>
</pre>
</div>
<aside class="notes">
<p><b>TO Make This List SCROLL</b>, click anywhere on the terminal window</p>
<p><b>TO Make This List STOP</b>, click the "Ansible Terminal" text on top of the console</p>
</aside>
</section>

View File

@@ -1,37 +0,0 @@
<section id="DiscoveredFacts">
<center><h2>DISCOVERED FACTS</h2>
</center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodym">
<font color="silver"># Small filtered subset of discovered facts</font>
<font color="gray"><?=$terminal_prompt?></font> ansible myserver.mine -m setup -a "filter=ansible_default_ipv4"
<font color="yellow">myserver.mine | success >> </font>{
<font color="cyan">"ansible_facts"</font>: {
<font color="cyan">"ansible_default_ipv4"</font>: {
<font color="cyan">"address"</font>:<font color="yellow"> "10.41.17.37"</font>,
<font color="cyan">"alias"</font>:<font color="yellow"> "eth0"</font>,
<font color="cyan">"gateway"</font>:<font color="yellow"> "10.41.17.1"</font>,
<font color="cyan">"interface"</font>:<font color="yellow"> "eth0"</font>,
<font color="cyan">"macaddress"</font>:<font color="yellow"> "00:69:08:3b:a9:16"</font>,
<font color="cyan">"mtu"</font>:<font color="yellow"> 1500</font>,
<font color="cyan">"netmask"</font>:<font color="yellow"> "255.255.255.0"</font>,
<font color="cyan">"network"</font>:<font color="yellow"> "10.41.17.0"</font>,
<font color="cyan">"type"</font>:<font color="yellow"> "ether"</font>
},
</pre>
</div>
<aside class="notes">
<p>The second ad-hoc command example from the prior slide provides the following JSON output of a localhost facts run.</p>
<p>Facts are bits of information derived from examining a host systems that are stored as variables for later use. An example of this might be the IP address of the host, or what operating system it is running. The facts Ansible will discover about a host is extensive. What's shown here is just a small sample. Run <code>ansible localhost -m setup</code> for a more complete representation.</p>
<p>Ansible collects facts using the <code>setup</code> module. By default, Ansible will run the <code>setup</code> module before any other tasks are executed in a playbook. These facts can be referenced by subsequent automation tasks on a per host-basis during the playbook run.</p>
</aside>
</section>

View File

@@ -1,11 +0,0 @@
<section id="AdHocExplained">
<h2>Ad-Hoc Commands</h2>
<p>An ad-hoc command is a single Ansible task to perform quickly, but dont want to save for later.</p>
<aside class="notes">
<p>Ansible ad-hoc commands is a good place to start to understand the basics of what Ansible can do before learning how to use playbooks &ndash; ad-hoc commands can also be used to do quick things that you might not necessarily want to write a full playbook for.</p>
<p>Generally speaking, the true power of Ansible lies in playbooks. So why would you use ad-hoc tasks versus playbooks?</p>
<p>For instance, if you wanted to restart a service on all of your lab nodes, you could execute a quick one-liner in Ansible without writing a playbook.</p>
</aside>
</section>

View File

@@ -1,17 +0,0 @@
<section data-state="lab alt" id="<?=$labid?>-01">
<h1><?=$pretty_htmldir?> </h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Ad-hoc command exercise number one</p>
</section>
<section data-state="lab alt" id="<?=$labid?>-02">
<h1><?=$pretty_htmldir?> </h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Ad-hoc command exercise number two</p>
</section>
<section data-state="lab alt" id="<?=$labid?>-03">
<h1><?=$pretty_htmldir?> </h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Ad-hoc command exercise number three</p>
</section>

View File

@@ -1,29 +0,0 @@
<section data-state="lab alt" id="<?=$labid?>-AdHocCommands-Terminal">
<center><h2>AD HOC COMMANDS</h2></center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodyl">
<font color="silver"># Check connections (submarine ping, not ICMP)</font>
<font color="gray"><?=$terminal_prompt?></font> ansible all -m ping
<font color="silver"># Run a command on all the hosts in the web group</font>
<font color="gray"><?=$terminal_prompt?></font> ansible web -m command -a &quot;uptime&quot;
<font color="silver"># Collect and display known facts</font>
<font color="gray"><?=$terminal_prompt?></font> ansible localhost -m setup
</pre>
</div>
<aside class="notes">
<p>Ad-hoc commands are quick checks on your servers that you dont want to preserve in an Ansible playbook.</p>
<p>An ad-hoc command can be used to do some tasks that you might not necessarily want to write a full playbook and save for later.</p>
<p>This is a good place to start to understand the basics of what Ansible can do prior to learning about playbooks where the true power of Ansible automation lies.</p>
<p>For more information see <a href="http://docs.ansible.com/ansible/intro_adhoc.html">Introduction To Ad-Hoc Commands</a>.</p>
</aside>
</section>

View File

@@ -1,17 +0,0 @@
<section data-state="lab alt" id="<?=$labid?>-04">
<h1><?=$pretty_htmldir?> </h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Ad-hoc command exercise number four</p>
</section>
<section data-state="lab alt" id="<?=$labid?>-05">
<h1><?=$pretty_htmldir?> </h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Ad-hoc command exercise number five</p>
</section>
<section data-state="lab alt" id="<?=$labid?>-06">
<h1><?=$pretty_htmldir?> </h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Ad-hoc command exercise number six</p>
</section>

View File

@@ -1,557 +0,0 @@
localhost | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"10.0.20.5"
],
"ansible_all_ipv6_addresses": [
"fe80::4e98:35fe:3b14:33dc"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "04/05/2016",
"ansible_bios_version": "6.00",
"ansible_cmdline": {
"BOOT_IMAGE": "/vmlinuz-3.10.0-693.21.1.el7.x86_64",
"LANG": "en_US.UTF-8",
"crashkernel": "auto",
"quiet": true,
"rhgb": true,
"ro": true,
"root": "UUID=d49a9903-d546-4981-bffb-4e5147e1199b"
},
"ansible_date_time": {
"date": "2018-08-14",
"day": "14",
"epoch": "1534279494",
"hour": "16",
"iso8601": "2018-08-14T20:44:54Z",
"iso8601_basic": "20180814T164454915629",
"iso8601_basic_short": "20180814T164454",
"iso8601_micro": "2018-08-14T20:44:54.915745Z",
"minute": "44",
"month": "08",
"second": "54",
"time": "16:44:54",
"tz": "EDT",
"tz_offset": "-0400",
"weekday": "Tuesday",
"weekday_number": "2",
"weeknumber": "33",
"year": "2018"
},
"ansible_default_ipv4": {
"address": "10.0.20.5",
"alias": "ens192",
"broadcast": "10.0.20.255",
"gateway": "10.0.20.1",
"interface": "ens192",
"macaddress": "00:50:56:bb:30:e8",
"mtu": 1500,
"netmask": "255.255.255.0",
"network": "10.0.20.0",
"type": "ether"
},
"ansible_default_ipv6": {},
"ansible_device_links": {
"ids": {
"sr0": [
"ata-VMware_Virtual_SATA_CDRW_Drive_00000000000000000001"
]
},
"labels": {},
"masters": {},
"uuids": {
"sda1": [
"619dcc55-451d-44be-b364-8c94278c567c"
],
"sda2": [
"d49a9903-d546-4981-bffb-4e5147e1199b"
]
}
},
"ansible_devices": {
"sda": {
"holders": [],
"host": "Serial Attached SCSI controller: VMware PVSCSI SCSI Controller (rev 02)",
"links": {
"ids": [],
"labels": [],
"masters": [],
"uuids": []
},
"model": "Virtual disk",
"partitions": {
"sda1": {
"holders": [],
"links": {
"ids": [],
"labels": [],
"masters": [],
"uuids": [
"619dcc55-451d-44be-b364-8c94278c567c"
]
},
"sectors": "2097152",
"sectorsize": 512,
"size": "1.00 GB",
"start": "2048",
"uuid": "619dcc55-451d-44be-b364-8c94278c567c"
},
"sda2": {
"holders": [],
"links": {
"ids": [],
"labels": [],
"masters": [],
"uuids": [
"d49a9903-d546-4981-bffb-4e5147e1199b"
]
},
"sectors": "31455232",
"sectorsize": 512,
"size": "15.00 GB",
"start": "2099200",
"uuid": "d49a9903-d546-4981-bffb-4e5147e1199b"
}
},
"removable": "0",
"rotational": "1",
"sas_address": null,
"sas_device_handle": null,
"scheduler_mode": "deadline",
"sectors": "41943040",
"sectorsize": "512",
"size": "20.00 GB",
"support_discard": "0",
"vendor": "VMware",
"virtual": 1
},
"sr0": {
"holders": [],
"host": "SATA controller: VMware SATA AHCI controller",
"links": {
"ids": [
"ata-VMware_Virtual_SATA_CDRW_Drive_00000000000000000001"
],
"labels": [],
"masters": [],
"uuids": []
},
"model": "VMware SATA CD00",
"partitions": {},
"removable": "1",
"rotational": "1",
"sas_address": null,
"sas_device_handle": null,
"scheduler_mode": "cfq",
"sectors": "2097151",
"sectorsize": "512",
"size": "1024.00 MB",
"support_discard": "0",
"vendor": "NECVMWar",
"virtual": 1
}
},
"ansible_distribution": "CentOS",
"ansible_distribution_file_parsed": true,
"ansible_distribution_file_path": "/etc/redhat-release",
"ansible_distribution_file_variety": "RedHat",
"ansible_distribution_major_version": "7",
"ansible_distribution_release": "Core",
"ansible_distribution_version": "7.4.1708",
"ansible_dns": {
"nameservers": [
"10.0.20.1"
],
"search": [
"kev"
]
},
"ansible_domain": "kev",
"ansible_effective_group_id": 0,
"ansible_effective_user_id": 0,
"ansible_ens192": {
"active": true,
"device": "ens192",
"features": {
"busy_poll": "off [fixed]",
"fcoe_mtu": "off [fixed]",
"generic_receive_offload": "on",
"generic_segmentation_offload": "on",
"highdma": "on",
"hw_tc_offload": "off [fixed]",
"l2_fwd_offload": "off [fixed]",
"large_receive_offload": "on",
"loopback": "off [fixed]",
"netns_local": "off [fixed]",
"ntuple_filters": "off [fixed]",
"receive_hashing": "off [fixed]",
"rx_all": "off [fixed]",
"rx_checksumming": "on",
"rx_fcs": "off [fixed]",
"rx_vlan_filter": "on [fixed]",
"rx_vlan_offload": "on",
"rx_vlan_stag_filter": "off [fixed]",
"rx_vlan_stag_hw_parse": "off [fixed]",
"scatter_gather": "on",
"tcp_segmentation_offload": "on",
"tx_checksum_fcoe_crc": "off [fixed]",
"tx_checksum_ip_generic": "on",
"tx_checksum_ipv4": "off [fixed]",
"tx_checksum_ipv6": "off [fixed]",
"tx_checksum_sctp": "off [fixed]",
"tx_checksumming": "on",
"tx_fcoe_segmentation": "off [fixed]",
"tx_gre_csum_segmentation": "off [fixed]",
"tx_gre_segmentation": "off [fixed]",
"tx_gso_partial": "off [fixed]",
"tx_gso_robust": "off [fixed]",
"tx_ipip_segmentation": "off [fixed]",
"tx_lockless": "off [fixed]",
"tx_mpls_segmentation": "off [fixed]",
"tx_nocache_copy": "off",
"tx_scatter_gather": "on",
"tx_scatter_gather_fraglist": "off [fixed]",
"tx_sctp_segmentation": "off [fixed]",
"tx_sit_segmentation": "off [fixed]",
"tx_tcp6_segmentation": "on",
"tx_tcp_ecn_segmentation": "off [fixed]",
"tx_tcp_mangleid_segmentation": "off",
"tx_tcp_segmentation": "on",
"tx_udp_tnl_csum_segmentation": "off [fixed]",
"tx_udp_tnl_segmentation": "off [fixed]",
"tx_vlan_offload": "on",
"tx_vlan_stag_hw_insert": "off [fixed]",
"udp_fragmentation_offload": "off [fixed]",
"vlan_challenged": "off [fixed]"
},
"hw_timestamp_filters": [],
"ipv4": {
"address": "10.0.20.5",
"broadcast": "10.0.20.255",
"netmask": "255.255.255.0",
"network": "10.0.20.0"
},
"ipv6": [
{
"address": "fe80::4e98:35fe:3b14:33dc",
"prefix": "64",
"scope": "link"
}
],
"macaddress": "00:50:56:bb:30:e8",
"module": "vmxnet3",
"mtu": 1500,
"pciid": "0000:0b:00.0",
"promisc": false,
"speed": 10000,
"timestamping": [
"rx_software",
"software"
],
"type": "ether"
},
"ansible_env": {
"HISTCONTROL": "ignoredups",
"HISTSIZE": "1000",
"HOME": "/root",
"HOSTNAME": "kev-ansible",
"LANG": "en_US.UTF-8",
"LESSOPEN": "||/usr/bin/lesspipe.sh %s",
"LOGNAME": "root",
"LS_COLORS": "rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:",
"MAIL": "/var/spool/mail/root",
"PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin",
"PWD": "/root",
"SHELL": "/bin/bash",
"SHLVL": "3",
"SSH_CLIENT": "10.0.0.74 53446 22",
"SSH_CONNECTION": "10.0.0.74 53446 10.0.20.5 22",
"SSH_TTY": "/dev/pts/0",
"TERM": "xterm-256color",
"USER": "root",
"XDG_RUNTIME_DIR": "/run/user/0",
"XDG_SESSION_ID": "270",
"_": "/usr/bin/python2"
},
"ansible_fips": false,
"ansible_form_factor": "Other",
"ansible_fqdn": "kev-ansible.kev",
"ansible_hostname": "kev-ansible",
"ansible_interfaces": [
"lo",
"ens192"
],
"ansible_is_chroot": false,
"ansible_iscsi_iqn": "",
"ansible_kernel": "3.10.0-693.21.1.el7.x86_64",
"ansible_lo": {
"active": true,
"device": "lo",
"features": {
"busy_poll": "off [fixed]",
"fcoe_mtu": "off [fixed]",
"generic_receive_offload": "on",
"generic_segmentation_offload": "on",
"highdma": "on [fixed]",
"hw_tc_offload": "off [fixed]",
"l2_fwd_offload": "off [fixed]",
"large_receive_offload": "off [fixed]",
"loopback": "on [fixed]",
"netns_local": "on [fixed]",
"ntuple_filters": "off [fixed]",
"receive_hashing": "off [fixed]",
"rx_all": "off [fixed]",
"rx_checksumming": "on [fixed]",
"rx_fcs": "off [fixed]",
"rx_vlan_filter": "off [fixed]",
"rx_vlan_offload": "off [fixed]",
"rx_vlan_stag_filter": "off [fixed]",
"rx_vlan_stag_hw_parse": "off [fixed]",
"scatter_gather": "on",
"tcp_segmentation_offload": "on",
"tx_checksum_fcoe_crc": "off [fixed]",
"tx_checksum_ip_generic": "on [fixed]",
"tx_checksum_ipv4": "off [fixed]",
"tx_checksum_ipv6": "off [fixed]",
"tx_checksum_sctp": "on [fixed]",
"tx_checksumming": "on",
"tx_fcoe_segmentation": "off [fixed]",
"tx_gre_csum_segmentation": "off [fixed]",
"tx_gre_segmentation": "off [fixed]",
"tx_gso_partial": "off [fixed]",
"tx_gso_robust": "off [fixed]",
"tx_ipip_segmentation": "off [fixed]",
"tx_lockless": "on [fixed]",
"tx_mpls_segmentation": "off [fixed]",
"tx_nocache_copy": "off [fixed]",
"tx_scatter_gather": "on [fixed]",
"tx_scatter_gather_fraglist": "on [fixed]",
"tx_sctp_segmentation": "on",
"tx_sit_segmentation": "off [fixed]",
"tx_tcp6_segmentation": "on",
"tx_tcp_ecn_segmentation": "on",
"tx_tcp_mangleid_segmentation": "on",
"tx_tcp_segmentation": "on",
"tx_udp_tnl_csum_segmentation": "off [fixed]",
"tx_udp_tnl_segmentation": "off [fixed]",
"tx_vlan_offload": "off [fixed]",
"tx_vlan_stag_hw_insert": "off [fixed]",
"udp_fragmentation_offload": "on",
"vlan_challenged": "on [fixed]"
},
"hw_timestamp_filters": [],
"ipv4": {
"address": "127.0.0.1",
"broadcast": "host",
"netmask": "255.0.0.0",
"network": "127.0.0.0"
},
"ipv6": [
{
"address": "::1",
"prefix": "128",
"scope": "host"
}
],
"mtu": 65536,
"promisc": false,
"timestamping": [
"rx_software",
"software"
],
"type": "loopback"
},
"ansible_local": {
"is_installed": {
"is_vim_installed": {
"vim": "true"
}
},
"package_list": {
"all_kev_packages": {
"package1": "acl-2.2.51-12.el7.x86_64",
"package10": "authconfig-6.2.8-30.el7.x86_64",
"package11": "basesystem-10.0-7.el7.centos.noarch",
"package2": "aic94xx-firmware-30-6.el7.noarch",
"package3": "alsa-firmware-1.0.28-2.el7.noarch",
"package4": "alsa-lib-1.1.3-3.el7.x86_64",
"package5": "alsa-tools-firmware-1.1.0-1.el7.x86_64",
"package6": "ansible-2.6.1-1.el7.noarch",
"package7": "ansible-lint-3.4.21-1.el7.noarch",
"package8": "audit-2.7.6-3.el7.x86_64",
"package9": "audit-libs-2.7.6-3.el7.x86_64"
}
},
"system_owner": {
"system_owner": {
"owner": "kev"
}
}
},
"ansible_lsb": {},
"ansible_machine": "x86_64",
"ansible_machine_id": "072bb764550746bd9695d73f43c9cf3b",
"ansible_memfree_mb": 1307,
"ansible_memory_mb": {
"nocache": {
"free": 1579,
"used": 260
},
"real": {
"free": 1307,
"total": 1839,
"used": 532
},
"swap": {
"cached": 0,
"free": 0,
"total": 0,
"used": 0
}
},
"ansible_memtotal_mb": 1839,
"ansible_mounts": [
{
"block_available": 3300883,
"block_size": 4096,
"block_total": 3929344,
"block_used": 628461,
"device": "/dev/sda2",
"fstype": "xfs",
"inode_available": 7804215,
"inode_total": 7863808,
"inode_used": 59593,
"mount": "/",
"options": "rw,relatime,attr2,inode64,noquota",
"size_available": 13520416768,
"size_total": 16094593024,
"uuid": "d49a9903-d546-4981-bffb-4e5147e1199b"
},
{
"block_available": 207739,
"block_size": 4096,
"block_total": 259584,
"block_used": 51845,
"device": "/dev/sda1",
"fstype": "xfs",
"inode_available": 523947,
"inode_total": 524288,
"inode_used": 341,
"mount": "/boot",
"options": "rw,relatime,attr2,inode64,noquota",
"size_available": 850898944,
"size_total": 1063256064,
"uuid": "619dcc55-451d-44be-b364-8c94278c567c"
}
],
"ansible_nodename": "kev-ansible",
"ansible_os_family": "RedHat",
"ansible_pkg_mgr": "yum",
"ansible_processor": [
"0",
"GenuineIntel",
"Intel(R) Xeon(R) CPU X5660 @ 2.80GHz"
],
"ansible_processor_cores": 1,
"ansible_processor_count": 1,
"ansible_processor_threads_per_core": 1,
"ansible_processor_vcpus": 1,
"ansible_product_name": "VMware Virtual Platform",
"ansible_product_serial": "VMware-42 3b 24 ce 91 e0 3a be-b1 02 3c 83 0f 86 02 e8",
"ansible_product_uuid": "CE243B42-E091-BE3A-B102-3C830F8602E8",
"ansible_product_version": "None",
"ansible_python": {
"executable": "/usr/bin/python2",
"has_sslcontext": true,
"type": "CPython",
"version": {
"major": 2,
"micro": 5,
"minor": 7,
"releaselevel": "final",
"serial": 0
},
"version_info": [
2,
7,
5,
"final",
0
]
},
"ansible_python_version": "2.7.5",
"ansible_real_group_id": 0,
"ansible_real_user_id": 0,
"ansible_selinux": {
"status": "disabled"
},
"ansible_selinux_python_present": true,
"ansible_service_mgr": "systemd",
"ansible_ssh_host_key_ecdsa_public": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHa2kNk4tpZ4/rXxM6969XkR29JQa91M7sSRHheXeQxmZjnRp/5o2ADQjFmXz+PouYA8PMiBU9u5Mx44oEXxDmU=",
"ansible_ssh_host_key_ed25519_public": "AAAAC3NzaC1lZDI1NTE5AAAAIE5MKxH1C+uyIHjAz48pwHj+6HdXw/9vCnc2PHRQZVND",
"ansible_ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDMNVNNOgPb+L9rnrm0D2dQWRVEjtnWAgbgVDtdixE79+jDR5TGfxuUmf74yRXM0flrdvirQtBvZjSwsj3/fUReUas0gt3LVs1b7jsxK6QeGgQCx6CCeopMgUb0JYXsMexbekZxxnpBcWAXh/Bjhko/8FpZaZhIvk0VTzQMCP7+/netcTi1m+CCCF1YhQmy8bGhN+aJuaaP2VMSDSauOFGUQUUaJkw+pjata+qWMwYemDabszkePFp0rBQEDSo6fIMlXvInm75Jf24tyb+X9+kOycGk4Rits/jXseB6j+L3rZRCX6b/F3JMNtqoBc7nybGvD/8Njn9Sl67DQUZenkcX",
"ansible_swapfree_mb": 0,
"ansible_swaptotal_mb": 0,
"ansible_system": "Linux",
"ansible_system_capabilities": [
"cap_chown",
"cap_dac_override",
"cap_dac_read_search",
"cap_fowner",
"cap_fsetid",
"cap_kill",
"cap_setgid",
"cap_setuid",
"cap_setpcap",
"cap_linux_immutable",
"cap_net_bind_service",
"cap_net_broadcast",
"cap_net_admin",
"cap_net_raw",
"cap_ipc_lock",
"cap_ipc_owner",
"cap_sys_module",
"cap_sys_rawio",
"cap_sys_chroot",
"cap_sys_ptrace",
"cap_sys_pacct",
"cap_sys_admin",
"cap_sys_boot",
"cap_sys_nice",
"cap_sys_resource",
"cap_sys_time",
"cap_sys_tty_config",
"cap_mknod",
"cap_lease",
"cap_audit_write",
"cap_audit_control",
"cap_setfcap",
"cap_mac_override",
"cap_mac_admin",
"cap_syslog",
"35",
"36+ep"
],
"ansible_system_capabilities_enforced": "True",
"ansible_system_vendor": "VMware, Inc.",
"ansible_uptime_seconds": 137627,
"ansible_user_dir": "/root",
"ansible_user_gecos": "root",
"ansible_user_gid": 0,
"ansible_user_id": "root",
"ansible_user_shell": "/bin/bash",
"ansible_user_uid": 0,
"ansible_userspace_architecture": "x86_64",
"ansible_userspace_bits": "64",
"ansible_virtualization_role": "guest",
"ansible_virtualization_type": "VMware",
"gather_subset": [
"all"
],
"module_setup": true
},
"changed": false
}

View File

@@ -1,12 +0,0 @@
<section data-state="title alt" id="Red-Lets-Talk-Variables">
<h1>VARIABLES:</h1>
<font color="white"> <li>What are they?</li>
<li>How do they work for me?</li>
<li>What can I do with them?</li>
<li>How do I override or redefine them in flight?</li>
</font>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<aside class="notes">
<p>Let's talk about what they are, how they work, and some of the ways we can use them.</p>
</aside>
</section>

View File

@@ -1,19 +0,0 @@
<section id="Variables-WhenAndWhere">
<h2>Variables</h2>
<p>Ansible can work with metadata from various sources and manage their context in the form of variables.</p>
<ul>
<li>Command line parameters</li>
<li>Plays and tasks</li>
<li>Files</li>
<li>Inventory</li>
<li>Discovered facts</li>
<li>Roles</li>
</ul>
</section>
<aside class="notes">
<p>While automation exists to make it easier to make things repeatable, all of your systems are not exactly alike.</p>
<p>Variables are used to store metadata for each host drawing from numerous sources. For example variable may be for things like facts or file paths or package versions.</p>
</aside>

View File

@@ -1,39 +0,0 @@
<section id="Variable-Precedence">
<h2>Variable Precedence</h2>
<p>The order in which the same variable from different sources will override each other.</p>
<div class="columns">
<div class="col">
<ol>
<li>extra vars</li>
<li>task vars (only for the task)</li>
<li>block vars (only for tasks in block)</li>
<li>role and include vars</li>
<li>play vars_files</li>
<li>play vars_prompt</li>
<li>play vars</li>
<li>set_facts</li>
</ol>
</div>
<div class="col">
<ol start="9" class="col">
<li>registered vars</li>
<li>host facts</li>
<li>playbook host_vars</li>
<li>playbook group_vars</li>
<li><strong>inventory host_vars</strong></li>
<li><strong>inventory group_vars</strong></li>
<li>inventory vars</li>
<li>role defaults</li>
</ol>
</div>
</div>
<aside class="notes">
<p>If variables of the same name are defined in multiple sources, they get overwritten in a certain and specific order. This is why this variable precedence is important to understand.</p>
<p>There are 16 levels of variable precedence as of Ansible 2.x. The <code>extra_vars</code> (passed thru the command-line) always take precedence vs. role defaults which will always get overridden by any other source. The previous inventory example defines vars at 13 and 14 (highlighted in the list) in the variable precedence chain.</p>
<p>It&apos;s a good idea to limit the different sources where a specific variable is being set. While Ansible's variable precedence handling is comprehensive and well-defined, it can laborious to keep the resolution of multiple sources straight.</p>
<p>NOTE: The inventory variables sources showed in the static inventory example a couple of slides back are in bold type.</p>
</aside>
</section>

View File

@@ -1,11 +0,0 @@
<section>
<section data-state="title alt" id="RedIntro-TasksInAPlay">
<h1>Tasks in a Play</h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Tasks are the powerful pieces within a playbook that state paremeters and instruct the Ansible engine </p>
<aside class="notes">
</aside>
</section>
</section>

View File

@@ -1,19 +0,0 @@
<section id="TaskModules">
<h2>Tasks</h2>
<p>Tasks are the application of a module to perform a specific unit of work.</p>
<ul>
<li><b>file</b>: A directory should exist</li>
<li><b>yum</b>: A package should be installed</li>
<li><b>service</b>: A service should be running</li>
<li><b>template</b>: Render a configuration file from a template</li>
<li><b>get_url</b>: Fetch an archive file from a URL</li>
<li><b>git</b>: Clone a source code repository</li>
</ul>
<aside class="notes">
<p>We've already reviewed modules, the batteries and tools Ansible provides. Tasks are the specific application of a module to perform a unit of automation.</p>
<p>Here we see a list of examples of common modules being applied to do something.</p>
<aside>
</section>

View File

@@ -1,43 +0,0 @@
<section id="TasksInAPlay">
<center><h2>EXAMPLE TASKS IN A PLAY</h2></center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodylw">
<font color="pink">---</font>
tasks<font color="red">:</font>
<font color="red">-</font> name<font color="red">:</font> Ensure httpd package is present
yum<font color="red">:</font>
name<font color="red">:</font> httpd
state<font color="red">:</font> latest
<font color="red">-</font> name<font color="red">:</font> Ensure latest index.html file is present
copy<font color="red">:</font>
src<font color="red">:</font> files/index.html
dest<font color="red">:</font> /var/www/html/
<font color="red">-</font> name<font color="red">:</font> Restart httpd
service<font color="red">:</font>
name<font color="red">:</font> httpd
state<font color="red">:</font> restarted
</pre>
</div>
<aside class="notes">
<p>This example shows the task list of an Ansible playbook.</p>
<p>
<ol>
<li>The first task assures the latest nginx package is installed using yum.</li>
<li>The next uses the copy module to assure the latest version of a static home page file has been published.</li>
<li>The last task restarts the nginx service with the service module</li>
</ol>
</p>
</aside>
</section>

View File

@@ -1,11 +0,0 @@
<section id="HandlerTasks">
<h2>Handler Tasks</h2>
<p>Handlers are special tasks that run at the end of a play if notified by another task when a change occurs.</p>
<blockquote>If a package gets installed or updated, notify a service restart task that it needs to run.</blockquote>
<aside class="notes">
<p>Normal tasks run sequentially; handler tasks run on notification of a change and will only run once at the end of a play.</p>
<p>For more information see <a href="http://docs.ansible.com/ansible/playbooks_intro.html#handlers-running-operations-on-change">Handler Tasks</a>.</p>
</aside>
</section>

View File

@@ -1,176 +0,0 @@
<section data-transition="slide" id="Handler-Terminal">
<h2>Example Handler Task in a Play</h2>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodymw">
tasks:
- name: Ensure httpd package is present
yum:
name: httpd
state: latest
notify: httpd_running
- name: Verify correct config file is present
copy:
src: files/index.html
dest: /var/www/html/index.html
handlers:
- name: httpd_running
service:
name: httpd
state: restarted
</pre>
</div>
<aside class="notes">
<p>STUFF</p>
</aside>
</section>
<section data-transition="none" id="Handler-Mark-Notify">
<h2>Example Handler Task in a Play</h2>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodymw">
tasks:
- name: Ensure httpd package is present
yum:
name: httpd
state: latest
<mark> notify: httpd_running </mark>
- name: Verify correct config file is present
copy:
src: files/index.html
dest: /var/www/html/index.html
handlers:
- name: httpd_running
service:
name: httpd
state: restarted
</pre>
</div>
<aside class="notes">
<p>STUFF</p>
</aside>
</section>
<section data-transition="none" id="Handler-Mark-Handler">
<h2>Example Handler Task in a Play</h2>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodymw">
tasks:
- name: Ensure httpd package is present
yum:
name: httpd
state: latest
notify: httpd_running
- name: Verify correct config file is present
copy:
src: files/index.html
dest: /var/www/html/index.html
<mark> handlers: </mark>
- name: httpd_running
service:
name: httpd
state: restarted
</pre>
</div>
<aside class="notes">
<p>STUFF</p>
</aside>
</section>
<section data-transition="none" id="Handler-Mark-HandlerName">
<h2>Example Handler Task in a Play</h2>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodymw">
tasks:
- name: Ensure httpd package is present
yum:
name: httpd
state: latest
notify: httpd_running
- name: Verify correct config file is present
copy:
src: files/index.html
dest: /var/www/html/index.html
handlers:
<mark> - name: httpd_running </mark>
service:
name: httpd
state: restarted
</pre>
</div>
<aside class="notes">
<p>STUFF</p>
</aside>
</section>
<section data-transition="none" id="Handler-Mark-HandlerAndNotify">
<h2>Example Handler Task in a Play</h2>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodymw">
tasks:
- name: Ensure httpd package is present
yum:
name: httpd
state: latest
<mark> notify: httpd_running </mark>
- name: Verify correct config file is present
copy:
src: files/index.html
dest: /var/www/html/index.html
<mark> handlers:
- name: httpd_running </mark>
service:
name: httpd
state: restarted
</pre>
</div>
<aside class="notes">
<p>STUFF</p>
</aside>
</section>

View File

@@ -1,145 +0,0 @@
<section data-transition="slide" id="Handlers-Terminal">
<h2>Multiple Tasks Calling a Handler in a Play</h2>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodymw">
tasks:
- name: Ensure httpd package is present
yum:
name: httpd
state: latest
notify: httpd_running
- name: Verify correct config file is present
template:
src: files/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
notify: httpd_running
handlers:
- name: httpd_running
service:
name: httpd
state: restarted
</pre>
</div>
<aside class="notes">
<p>STUFF</p>
</aside>
</section>
<section data-transition="none" id="Handlers-Mark-Notify">
<h2>Multiple Tasks Calling a Handler in a Play</h2>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodymw">
tasks:
- name: Ensure httpd package is present
yum:
name: httpd
state: latest
<mark> notify: httpd_running </mark>
- name: Verify correct config file is present
template:
src: files/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
<mark> notify: httpd_running </mark>
handlers:
- name: httpd_running
service:
name: httpd
state: restarted
</pre>
</div>
<aside class="notes">
<p>STUFF</p>
</aside>
</section>
<section data-transition="none" id="Handlers-Mark-Handler">
<h2>Multiple Tasks Calling a Handler in a Play</h2>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodymw">
tasks:
- name: Ensure httpd package is present
yum:
name: httpd
state: latest
notify: httpd_running
- name: Verify correct config file is present
template:
src: files/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
notify: httpd_running
<mark> handlers:
- name: httpd_running </mark>
service:
name: httpd
state: restarted
</pre>
</div>
<aside class="notes">
<p>STUFF</p>
</aside>
</section>
<section data-transition="none" id="Handlers-Mark-HandlerAndNotify">
<h2>Multiple Tasks Calling a Handler in a Play</h2>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodymw">
tasks:
- name: Ensure httpd package is present
yum:
name: httpd
state: latest
<mark> notify: httpd_running </mark>
- name: Verify correct config file is present
template:
src: files/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
<mark> notify: httpd_running </mark>
<mark> handlers:
- name: httpd_running </mark>
service:
name: httpd
state: restarted
</pre>
</div>
<aside class="notes">
<p>STUFF</p>
</aside>
</section>

View File

@@ -1,10 +0,0 @@
<section data-state="lab alt" id="<?=$labid?>-01">
<h1><?=$pretty_htmldir?> LAB STUFF 01</h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Let's do some stuff with tasks.</p>
</section>
<section data-state="lab alt" id="<?=$labid?>-02">
<h1><?=$pretty_htmldir?> LAB STUFF 02</h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Let's do some more stuff with tasks.</p>
</section>

View File

@@ -1,11 +0,0 @@
<section>
<section data-state="title alt" id="RedIntro-MoreAdvancedPlaybookPieces">
<h1>ANATOMY OF A PLAYBOOK</h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Let's dissect the basics of a playbook and make sure we understand the core components.</p>
<aside class="notes">
</aside>
</section>
</section>

View File

@@ -1,11 +0,0 @@
<section id="Plays-And-Playbooks">
<h2>Plays &amp; Playbooks</h2>
<p>Plays are ordered sets of tasks to execute against host selections from your inventory. A playbook is a file containing one or more plays.</p>
<aside class="notes">
<p>Playbooks are text files that contain one or more plays that are expressed in YAML. A play defines target hosts and a task list that are executed sequentially (i.e top to bottom) to achieve a certain state on those hosts.</p>
<p>For more details see <a href="http://docs.ansible.com/ansible/playbooks.html">the Playbook page</a> in the Ansible documentation.</p>
</aside>
</section>

View File

@@ -1,40 +0,0 @@
<section id="PlaybookExample">
<center><h2>PLAYBOOK EXAMPLE</h2></center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodymw">
- name: Ensure apache is installed and started
hosts: web
become: yes
tasks:
- name: Ensure httpd package is present
yum:
name: httpd
state: latest
- name: Ensure latest index.html file is present
copy:
src: files/index.html
dest: /var/www/html/index.html
- name: Ensure httpd is started
service:
name: httpd
state: started
</pre>
</div>
<aside class="notes">
<p>Here we can see an example of a simple but complete Ansible play. The slides that follow will explore each of these parts and what they do.</p>
</aside>
</section>

View File

@@ -1,39 +0,0 @@
<section id="HumanMeaningfulNaming">
<center><h2>HUMAN MEANINGFUL NAMING</h2></center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodymw">
- <mark>name: Ensure apache is installed and started</mark>
hosts: web
become: yes
tasks:
- <mark>name: Ensure httpd package is present</mark>
yum:
name: httpd
state: latest
- <mark>name: Ensure latest index.html file is present</mark>
copy:
src: files/index.html
dest: /var/www/html/
- <mark>name: Ensure httpd is started</mark>
service:
name: httpd
state: started
</pre>
</div>
<aside class="notes">
<p>Every play and each task in it can be assigned a name that describes its objective in the automation workflow and is output during execution.</p>
<p>It&apos;s best practice to always name your plays and tasks. Adding name with a human-meaningful description better communicates the intent to users when running a play.</p>
</aside>
</section>

View File

@@ -1,38 +0,0 @@
<section id="HostSelector">
<center><h2>HOST SELECTOR</h2></center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodymw">
- name: Ensure apache is installed and started
<mark>hosts: web</mark>
become: yes
tasks:
- name: Ensure httpd package is present
yum:
name: httpd
state: latest
- name: Ensure latest index.html file is present
copy:
src: files/index.html
dest: /var/www/html/
- name: Ensure httpd is started
service:
name: httpd
state: started
</pre>
</div>
<aside class="notes">
<p>The Ansible play host selector defines which nodes in the inventory the automation is targeting.</p>
<p>In this example, a single group of &quot;web&quot; is being targeted. Ansible supports targeting intersections, unions and filters of multiple groups or hosts though.</p>
<p>For more details see <a href="http://docs.ansible.com/ansible/intro_patterns.html">the host selector Patterns page</a> in the Ansible documentation.</p>
</aside>
</section>

View File

@@ -1,37 +0,0 @@
<section id="PrivilegeEscalation">
<center><h2>PRIVILEGE ESCALATION</h2></center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodymw">
- name: Ensure apache is installed and started
hosts: web
<mark>become: yes</mark>
tasks:
- name: Ensure httpd package is present
yum:
name: httpd
state: latest
- name: Ensure latest index.html file is present
copy:
src: files/index.html
dest: /var/www/html/
- name: Ensure httpd is started
service:
name: httpd
state: started
</pre>
</div>
<aside class="notes">
<p>Ansible allows you to &quot;become&quot; another user or with elevated rights to execute a task or an entire play (shown above). This is done using existing privilege escalation tools, which you probably already use or have configured, like sudo (the default), su, pfexec, doas, pbrun, dzdo, ksu and others.</p>
<p>For more details see <a href="http://docs.ansible.com/ansible/become.html">the Privilege Escalation page</a> in the Ansible documentation.</p>
</aside>
</section>

View File

@@ -1,46 +0,0 @@
<section id="PlayVariables">
<center><h2>PLAY VARIABLES</h2></center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodymw">
- name: Ensure apache is installed and started
hosts: web
become: yes
<mark> vars: </mark>
<mark> http_port: 80 </mark>
<mark> http_docroot: /var/www/gokev.com </mark>
tasks:
- name: Ensure httpd package is present
yum:
name: httpd
state: latest
- name: Verify correct config file is present
template:
src: <mark>templates/httpd.conf.j2</mark>
dest: /etc/httpd/conf/httpd.conf
- name: Ensure httpd is started
service:
name: httpd
state: started
</pre>
</div>
<div style="position:absolute; right: -350px; top: 275px;">
<p class="fragment current-visible" data-fragment-index="1">
<img src="images/httpd_conf_template.png" width="1200">
</p>
</div>
<aside class="notes">
<p>Variables are used to store metadata for each host drawing from numerous sources. Here we see another one of those sources, a variable &quot;http_port&quot; that has been embedded in a play.</p>
<p>Recalling the previous variable precedence slide, play variables are number 7 in Ansible&apos;s the precedence chain.</p>
</aside>
</section>

View File

@@ -1,40 +0,0 @@
<section id="PlaybookTasks">
<center><h2>PLAYBOOK TASKS</h2></center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodymw">
- name: Ensure apache is installed and started
hosts: web
become: yes
vars:
http_port: 80
http_docroot: /var/www/gokev.com
tasks:
- name: Ensure latest httpd package is present
<mark>yum:</mark>
<mark>name: httpd</mark>
<mark>state: latest</mark>
- name: Verify correct config file is present
<mark>template:</mark>
<mark>src: templates/httpd.conf.j2</mark>
<mark>dest: /etc/httpd/conf/httpd.conf</mark>
- name: Ensure httpd is started
<mark>service:</mark>
<mark>name: httpd</mark>
<mark>state: started</mark>
</pre>
</div>
<aside class="notes">
<p>Here we see modules, such as yum, being applied to a to perform a unit of automation such as to assure the latest httpd package is present on a host.</p>
</aside>
</section>

View File

@@ -1,10 +0,0 @@
<section data-state="lab alt" id="<?=$labid?>-01">
<h1><?=$pretty_htmldir?> LAB STUFF 01</h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Let's do some stuff with advanced pieces.</p>
</section>
<section data-state="lab alt" id="<?=$labid?>-02">
<h1><?=$pretty_htmldir?> LAB STUFF 02</h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Let's do some more stuff with advanced pieces!</p>
</section>

View File

@@ -1,11 +0,0 @@
<section>
<section data-state="title alt" id="RedIntro-DoingMoreWithPlaybooks">
<h1>DO MORE.</h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Let's get a bit more advanced with some rich functionality that Ansible provides.</p>
<aside class="notes">
</aside>
</section>
</section>

View File

@@ -1,17 +0,0 @@
<section id="Doing-More-With-Playbooks">
<h2>Doing More with Playbooks</h2>
<p>Here are some more essential playbook features that you can apply:</p>
<ul>
<li>Templates</li>
<li>Loops</li>
<li>Conditionals</li>
<li>Tags</li>
<li>Blocks</li>
</ul>
<aside class="notes">
<p>We only have covered the most essential capabilities of what can be done with a playbook so far.</p>
<p>Here we list a few more though this is still far from all there is. There&apos;s many other powerful playbook features for handling less common though vital automation workflows. No need to learn everything at once. You can start small and pick up more features over time as you need them.</p>
</aside>
</section>

View File

@@ -1,21 +0,0 @@
<section id="Templates-Explained">
<h2>Templates</h2>
<p>Ansible embeds the <a href="http://jinja.pocoo.org/docs/">Jinja2 templating engine</a> that can be used to dynamically:</p>
<ul>
<li>Set and modify play variables</li>
<li>Conditional logic</li>
<li>Generate files such as configurations from variables</li>
</ul>
<aside class="notes">
<p>Templates are a vital feature provided by the Jinja2 template engine, a powerful piece of software independent of Ansible. Ansible makes this usage as seamless and transparent as possible. Most will not realize they are doing templating when they develop plays with Ansible.</p>
<p>We don't show any specific template examples at the moment because we'll have plenty of opportunity to see templates in action as we cover other topics.</p>
<p>In all actuality, what is covered here only touches upon a few of its most basic features. To go deeper see these docs:</p>
<ul>
<li><a href="http://jinja.pocoo.org/docs/dev/templates/">Jinja2 Template Designer Documentation</a></li>
<li><a href="http://docs.ansible.com/ansible/playbooks_filters.html">Ansible Jinja2 Filters</a></li>
<li><a href="http://docs.ansible.com/ansible/playbooks_tests.html">Ansible Jinja2 Tests</a></li>
</ul>
</aside>
</section>

View File

@@ -1,33 +0,0 @@
<section id="PlaybookLoops">
<center><h2>WORKING WITH LOOPS</h2>
<p>Loops can do one task on multiple things: create a lot of users, install a lot of packages, or repeat a polling step until a certain result is reached.</p>
</center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodylw">
- yum:
name: <mark>&quot;{{ item }}&quot;</mark>
state: latest
<mark>with_items:</mark>
<mark>- httpd</mark>
<mark>- mysql-server</mark>
<mark>- php56-mysqlnd</mark>
<mark>- php56-common</mark>
<mark>- php56-gd</mark>
<mark>- php56-soap</mark>
<mark>- php56-xml</mark>
</pre>
</div>
<aside class="notes">
<p>This example demonstrates a basic loop with <code>with_items</code>. The loop sets a variable called &quot;item&quot;, a template variable courtesy of the embedded Jinja2 template engine, with the list value that is in context.</p>
<p>There are many different and specialized types of task loops to work with. See the <a href="http://docs.ansible.com/ansible/playbooks_loops.html">Loops documentation</a> to go deeper.</p>
</aside>
</section>

View File

@@ -1,26 +0,0 @@
<section id="PlaybookConditionals">
<center><h2>WORKING WITH CONDITIONALS</h2>
<p>Ansible supports the conditional execution of a task based on the run-time evaluation of variable, fact, or previous task result.</p>
</center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodylw">
- yum:
name: httpd
state: latest
<mark>when: ansible_os_family == &quot;RedHat&quot;</mark>
</pre>
</div>
<aside class="notes">
<p>Conditionals are another instance of Jinja2 in action within Ansible plays themselves. In the provided example &quot;ansible_os_family&quot; is a fact variable Ansible will set.</p>
<p>There are other forms of conditional clauses, but <code>when</code> is usually all that is needed.</p>
<p>NOTE: Conditional clauses are considered to be raw Jinja2 expression without double curly braces.</p>
</aside>
</section>

View File

@@ -1,40 +0,0 @@
<section id="PlaybookTags">
<center><h2>WORKING WITH TAGS</h2>
<p>Tags are useful to be able to run a subset of a playbook on-demand.</p>
</center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodylw">
- yum:
name: &quot;{{ item }}&quot;
state: latest
with_items:
- httpd
- php56
<mark>tags:</mark>
<mark>- packages</mark>
- template:
src: templates/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
<mark>tags:</mark>
<mark>- configuration</mark>
</pre>
</div>
<div style="position:absolute; right: -350px; top: 275px;">
<p class="fragment current-visible" data-fragment-index="1">
<img src="images/ansible_tagging.png" width="1200">
</p>
</div>
<aside class="notes">
<p>In the provided example, if the playbook were run with <code>--tags &quot;packages&quot;</code> the yum task would execute and the template task would be skipped. If the playbook were run with <code>--tags &quot;configuration&quot;</code> the opposite would happen. Without a <code>--tags</code> both tasks would execute like normal.</p>
<p>Tags can be seen as a simple though specialized form of conditional statement designed to enable the execution of a subset tasks. Tags are a bit more than simple boolean flags though. To dig deeper see the <a href="http://docs.ansible.com/ansible/playbooks_tags.html">playbook Tags documentation</a>.</p>
</aside>
</section>

View File

@@ -1,34 +0,0 @@
<section id="PlaybookBlocks">
<center><h2>WORKING WITH BLOCKS</h2>
<p>Blocks cut down on repetitive task directives, allow for logical grouping of tasks and even in play error handling.</p>
</center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal</div>
</div>
<pre class="bodylw">
<mark>block:</mark>
- yum:
name: &quot;{{ item }}&quot;
state: latest
with_items:
- httpd
- php56
- template:
src: templates/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
<mark>when: ansible_os_family == &quot;RedHat&quot;</mark>
</pre>
</div>
<aside class="notes">
<p>In the provided example we use a block to group two tasks that are to be conditional executed if a host is running a Red Hat family linux using one conditional clause. In practice, we could have copied the <code>when</code> clause onto each task and gotten same result. Using a block, there is less clutter thereby less to maintain and nothing to keep in sync. The utility of using a block increases the more tasks and clauses are in use.</p>
<p>Blocks have a play in error handling and automating roll backs that we won't get into here given the scope of that topic.</p>
<p>See the <a href="http://docs.ansible.com/ansible/playbooks_blocks.html">documentation on blocks</a> to dig deeper.</p>
</section>
</section>

View File

@@ -1,10 +0,0 @@
<section data-state="lab alt" id="<?=$labid?>-01">
<h1><?=$pretty_htmldir?> LAB STUFF 01</h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Let's do some stuff with advanced pieces.</p>
</section>
<section data-state="lab alt" id="<?=$labid?>-02">
<h1><?=$pretty_htmldir?> LAB STUFF 02</h1>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Let's do some more stuff with advanced pieces!</p>
</section>

View File

@@ -1,16 +0,0 @@
<section>
<section data-state="title alt" id="RedIntro-AnsibleVault">
<h1>ANSIBLE VAULT: <br/>ENCRYPTION</h1>
<p>Using ansible-vault to keep your secrets a secret.</p><br>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<aside class="notes">
<p>Ansible includes a very powerful encryption method for times when you need to include sensitive information in a playbook in an encrypted format.</p>
</aside>
</section>
</section>

View File

@@ -1,52 +0,0 @@
<section id="VaultTwoTypes">
<center>
<h1>ANSIBLE VAULT</h1>
<p>Encrypt an entire file or just a string inside a non-encrypted file.</p>
</center>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal : Encrypted File</div>
</div>
<pre class="bodymw">
<font color="gray"><?=$terminal_prompt?></font> cat ronin_secret.yml
$ANSIBLE_VAULT;1.1;AES256
61336361663664353737663637366334383030393736353532345
66532383233393438653965633333326632363935663132326163
306637626335643365630a653066396533313738316266653
</pre>
</div>
<div class="terminal space shadow">
<div class="top">
<div class="title">Ansible Terminal : Encrypted Variable</div>
</div>
<pre class="bodymw">
<font color="gray"><?=$terminal_prompt?></font> cat fonzie_secret.yml
fonzie_show: Happy Days
fonzie_secret: !vault |
$ANSIBLE_VAULT;1.1;AES256
6632363237353065633237633937353164646564633
6376461326235386539663733343539666234332664
6664616266316339383838373734653364346163633
6663864366534633063303062363238393139
</pre>
</div>
</p>
<aside class="notes">
<p>We can encrypt an entire file or just a string inside an encrypted file.</p>
<p>We'll call the FULL FILE ENCRYPTION in this example, "Ronin".</p>
<p>We'll call the ENCRYPTED STRING in a plain-text file, "Fonzie"</p>
</aside>
</section>

View File

@@ -1,17 +0,0 @@
<section>
<section data-state="title alt" id="RedIntro-AnsibleVault-Ronin">
<h1>ANSIBLE VAULT: <br/>ENCRYPTED FILE EXAMPLE</h1>
<p>(Variables In An Encrypted File)</p><br>
<img src="<?=$workshop_image?>" style="background-color: transparent; border: none;" height="250">
<p>Encrypting Sensitive Variables Inside Your Playbooks With An Entire Encrypted YAML File</p>
<aside class="notes">
<p>Ansible includes a very powerful encryption method for times when you need to include sensitive information in a playbook in an encrypted format.</p>
</aside>
</section>
</section>

Some files were not shown because too many files have changed in this diff Show More