<html>
<head>
<title>Ansible Core - Introduction to Playbooks Tutorial - Robert James Metcalfe - RJM Programming</title>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" />
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js"></script>
<link href='//www.rjmprogramming.com.au/PHP/emboss_h1.css' rel='stylesheet' type='text/css'>
<script type='text/javascript'>
var wlh=""; //window.location.hash;
var thatone=0, lastisin=-1;
var toastIn=["Welcome to ... Ansible Core - Introduction to Playbooks Tutorial",
"Environment Today ... ",
"Good to haves ... ",
"References Today ... ",
"Server Configuration Management and Deployment Orchestration Tool",
"DevOps -> Development -> Operations ... so people like ...",
"Install as root ... via Python package manager ... pip ...",
"Simplifies deployment tasks",
"Contains default information for Ansible variables etcetera",
"Contains host information",
"Configuration Management Script",
"Here is our tutorial about this simple Ansible ( on Mac OS X install could be ... sudo pip install ansible ... or via a git ( https://github.com/ ) clone ) deployment project ... but before that ... take a look at a book VirtualBox sandwich ... to help understand our test virtual machine test server",
"Here is our tutorial about this nonTLS Ansible nginx web server example ... which we will also show in Mac OS X Terminal as well later ... cd /Library/pgAgent/mybox/playbooks ... first thesetup.jpg then Vagrantfile and ansible.cfg and hosts files ...",
"And now we examine a complex application deployment Playbook from page 115 of Ansible Up and Running ...",
"PHPStorm IDE integrates well with Ansible and Git for commercial PHP Development Stack work ...",
"Git tutorial ...",
"PHPStorm Xdebug Unit Testing integration ...",
"PHPStorm PHPUnit Unit Testing integration ...",
"Commercial solutions in this field ...",
"Time for questions and answers ..."];
var toastOut=["For all those automation enthusiasts! Read on ...",
"We're on a Mac Book Pro using Mac OS X ...",
"Git is source control and PHPStorm is an IDE ...",
"Ansible Up and Running by Lorin Hochstein (chapters 1 and 2) ... ISBN: 978-1-491-91532-5 ...",
"With Ansible, remember what you did to make things work deployment wise ...",
"Ansible is not just for Operations and not just for Developers ...",
"Ansible install methods depend on your environment ...",
"Learn ssh and learn playbooks to learn Ansible ...",
"Ansible's configuration layer above ...",
"Ansible's inventory file can be static or dynamic. Read on ...",
"Ansible playbooks are deployment action scripts ...",
"Our first Ansible playbook ... remember that Ansible is hugely scalable, as you consider this ...",
"Ansible deployments can dynamically install. And they can have status decision making and 'do once' commands ...",
"Ansible playbooks can be much mode complex ...",
"PHPStorm IDE integrates with Ansible regarding code unit testing, for instance ...",
"Let's see a Git example ...",
"Xdebug unit testing ...",
"PHPUnit unit testing ...",
"There is help and commercial expertise out there ...",
"So what do you want to ask?"];
var bodclick=true;
var chapters=["Ansible Core - Introduction to Playbooks Tutorial", "What is Ansible?", "Who Uses Ansible?", "How Do You Install Ansible?", "Why has Ansible become Popular?", "What is ansible.cfg File?", "What is an Ansible Inventory File?", "What is an Ansible Playbook?", "How about a Single Test Server Ansible Scenario?", "How about a nonTLS Web Server with nginx Ansible Scenario?", "How about a TLS Web Server with nginx Ansible Scenario?", "How about a Complex Application Deployment Ansible Scenario?", "PHPStorm Development Stack Unit Testing Integration With Ansible", "Questions and Answers Regarding this Tutorial about Ansible"];
var bcol=["yellow", "yellow", "pink", "lightblue", "lightgreen", "silver", "lightgray", "orange", "gray", "white"];
var AnsibleCoreIntroductiontoPlaybooksTutorial=["Welcome to ... Ansible Core - Introduction to Playbooks Tutorial",
"Presenter - Robert James Metcalfe",
"Role - Analyst/Programmer",
" ",
" ",
"Environment Today ... ",
" ",
"Mac OS X - Terminal application to a Bash environment",
"Python installed",
"SSH installed",
"VirtualBox",
"Vagrant",
"Ansible",
" ",
" ",
"Good to haves ... ",
" ",
"Git",
"PHPStorm IDE",
" ",
" ",
"References Today ... ",
" ",
"Ansible Up and Running by Lorin Hochstein (chapters 1 and 2) ... ISBN: 978-1-491-91532-5 ... thanks",
"https://www.safaribooksonline.com/library/view/ansible-up-and/9781491915318/assets/anur_0101.png",
" ",
"http://www.rjmprogramming.com.au/ITblog/tag/ansible#content"];
var WhatisAnsible=["Server Configuration Management and Deployment Orchestration Tool",
"Simple scripted language requiring SSH and Python",
"https://www.safaribooksonline.com/library/view/ansible-up-and/9781491915318/assets/anur_0101.png",
"Configurations use YAML (similar in intent to JSON)",
"Chef and Puppet and Salt are three alternatives to Ansible (a fictional communication device that can transfer information faster than the speed of light)"];
var WhoUsesAnsible=["DevOps -> Development -> Operations ... so people like ...",
"Database Managers",
"System Managers",
"Software Team Leaders",
"Programmers (with Development Stack) ... like me"];
var HowDoYouInstallAnsible=["Install as root ... via Python package manager ... pip ...",
"<div style=background-color:white><b>$ sudo pip install ansible</div>",
" ",
"Install into Python virtualenv ... via wget/python/pipsi ...",
"<div style=background-color:white><b>$ wget https://raw.githubusercontent.com/mitsuhiko/pipsi/master/get-pipsi.py <br>$ python get-pipsi.py <br>$ pipsi install ansible</b></div>",
" ",
"Install most recent ... via git ...",
"<div style=background-color:white><b>$ git clone https://github.com/ansible/ansible.git --recursive</div>",
" .. and then each time Ansible is run from a development branch ...",
"<div style=background-color:white><b>$ cd ./ansible <br>$ source ./hacking/env-setup</div>",
" "];
var WhyhasAnsiblebecomePopular=["Simplifies deployment tasks",
"Allows for the history of deployment to be saved and reworked rather than being a struggle for each host deployment",
"Is easy to read and very self explanatory",
"Works on a single host just as readily as for many (hosts)"];
var WhatisansiblecfgFile=["Contains default information for Ansible variables etcetera",
"Here is a fairly simple one for one test server ...",
'file:///Library/pgAgent/mybox/playbooks/ansible.cfg',
"Here is a more advanced one for Ansible deployment involving several hosts ...",
'file:///Library/pgAgent/myboxes/playbooks/ansible.cfg',
"So this last one is for later."];
var WhatisanAnsibleInventoryFile=["Contains host information",
"Here is a fairly simple one for one test server ...",
'file:///Library/pgAgent/mybox/playbooks/hosts',
"Here is a more advanced one involving several hosts and using some simple variables ...",
'file:///Library/pgAgent/myboxes/playbooks/inventory/hosts',
"So this last one is for later."];
var WhatisanAnsiblePlaybook=["Configuration Management Script",
"Playbooks are made up of ...",
"http://www.rjmprogramming.com.au/ITblog/ansible-playbook-tls-tutorial#what_is_a_Playbook_file_made_up_of",
"Playbooks are written in YAML ...",
"http://en.wikipedia.org/wiki/YAML",
"http://www.rjmprogramming.com.au/ITblog/ansible-playbook-tls-tutorial#more_about_YAML_vs_JSON_format",
"Works on a single host just as readily as for many (hosts)",
"What follows is web_notls.yml Playbook ... as a taste of what is to come ...",
'file:///Library/pgAgent/mybox/playbooks/web-notls.yml',
"And a complex application deployment Playbook from page 115 of Ansible Up and Running ...",
"https://github.com/lorin/ansible-mezzanine/blob/master/mezzanine.yml"];
var HowaboutaSingleTestServerAnsibleScenario=["Here is our tutorial about this simple Ansible ( on Mac OS X install could be ... sudo pip install ansible ... or via a git ( https://github.com/ ) clone ) deployment project ... but before that ... take a look at a book VirtualBox sandwich ... to help understand our test virtual machine test server",
"http://localhost:8888/ansible_up_and_running.jpg",
"http://localhost:8888/virtualbox.jpg",
"http://localhost:8888/vagrant_up_and_running.jpg",
"Here is our first time command line dialog ... we show you the revisit comparison command line dialog way below in Mac OS X Terminal session ...",
"http://www.rjmprogramming.com.au/ITblog/ansible-hello-world-primer-tutorial/#vibit",
"Vagrant ( visit https://coolestguidesontheplanet.com/getting-started-vagrant-os-osx-10-9-mavericks/ for information and install ) manages virtual machines and its use creates a Vagrantfile used to provision a virtual machine via the ( one time ... vagrant init ubuntu/trusty32 ... teamed up with VirtualBox you can install via https://www.virtualbox.org ) ... vagrant up ... command and we will show it below ...",
'file:///Library/pgAgent/mybox/playbooks/Vagrantfile',
"And so let us look at the tutorial ... and we will follow it by an image synopsis ...",
"http://www.rjmprogramming.com.au/ITblog/ansible-hello-world-primer-tutorial",
"http://www.rjmprogramming.com.au/Mac/Ansible/ansible-99of.jpg"];
var HowaboutanonTLSWebServerwithnginxAnsibleScenario=["Here is our tutorial about this nonTLS Ansible nginx web server example ... which we will also show in Mac OS X Terminal as well later ... cd /Library/pgAgent/mybox/playbooks ... first thesetup.jpg then Vagrantfile and ansible.cfg and hosts files ...",
"http://localhost:8888/thesetup.jpg",
'file:///Library/pgAgent/mybox/playbooks/Vagrantfile',
'file:///Library/pgAgent/mybox/playbooks/ansible.cfg',
'file:///Library/pgAgent/mybox/playbooks/hosts',
"What follows is web_notls.yml Playbook ... ",
'file:///Library/pgAgent/mybox/playbooks/web-notls.yml',
"After ... ansible-playbook web-notls.yml ... we can now see a decent localhost:8080 below ...",
"http://localhost:8080",
"And so let us look at the tutorial ... ",
"http://www.rjmprogramming.com.au/ITblog/ansible-playbook-primer-tutorial"];
var HowaboutaTLSWebServerwithnginxAnsibleScenario=["Here is our tutorial about this TLS Ansible nginx web server example ... which we will also show in Mac OS X Terminal as well later ... cd /Library/pgAgent/mybox/playbooks ... first thesetup.jpg then Vagrantfile and ansible.cfg and hosts files ...",
"http://localhost:8888/thesetup.jpg",
'file:///Library/pgAgent/mybox/playbooks/Vagrantfile',
'file:///Library/pgAgent/mybox/playbooks/ansible.cfg',
'file:///Library/pgAgent/mybox/playbooks/hosts',
"What follows is web_tls.yml Playbook ... ",
'file:///Library/pgAgent/mybox/playbooks/web-tls.yml',
"After ... ansible-playbook web-tls.yml ... we can now see a decent localhost:8443 below ...",
"https://localhost:8443",
"And so let us look at the tutorial ... ",
"http://www.rjmprogramming.com.au/ITblog/ansible-playbook-tls-tutorial"];
var HowaboutaComplexApplicationDeploymentAnsibleScenario=["And now we examine a complex application deployment Playbook from page 115 of Ansible Up and Running ...",
"https://github.com/lorin/ansible-mezzanine/blob/master/mezzanine.yml"];
var PHPStormDevelopmentStackUnitTestingIntegrationWithAnsible=["PHPStorm IDE integrates well with Ansible and Git for commercial PHP Development Stack work ...",
"https://www.jetbrains.com/phpstorm/",
"http://www.rjmprogramming.com.au/ITblog/tag/phpstorm",
"https://www.youtube.com/watch?v=ZcJ3Kb31Q98",
" ",
"Git tutorial ...",
"https://www.youtube.com/watch?v=Y9XZQO1n_7c",
" ",
"PHPStorm Xdebug Unit Testing integration ...",
"https://www.youtube.com/watch?v=EsL6mAFEsvY",
"http://www.rjmprogramming.com.au/ITblog/tag/xdebug",
" ",
"PHPStorm PHPUnit Unit Testing integration ...",
"https://www.youtube.com/watch?v=wPVXgTl6f7w",
" ",
"Commercial solutions in this field ...",
"Mic Fishpool ... at FishVision ...",
"http://fishvision.com"];
var QuestionsandAnswersRegardingthisTutorialaboutAnsible=["Time for questions and answers ...",
" "];
var inb='';
var thisone=0;
var arrname='';
var inchapter=0;
var onetoinvis='';
var hideTimeout = 5000; //how many ms to wait before hiding after displaying
function customAlert() { // thanks to http://stackoverflow.com/questions/30746977/how-to-realize-an-alert-that-disappears-after-some-seconds
//display the box
var customAlert = document.getElementById("custom-alert-1");
customAlert.style.visibility = 'visible';
var isin=toastIn.indexOf(eval(arrname + "[" + eval(-1 + thisone) + "]"));
if (isin != -1 && isin != lastisin && document.URL.indexOf('notoast=') == -1) {
document.getElementById("custom-alert-1").innerHTML = toastOut[isin];
lastisin = isin;
//alert(eval(arrname + "[" + thatone + "]"));
//set up a timer to hide it, a.k.a a setTimeout()
setTimeout(function() {
customAlert.style.visibility = 'hidden';
}, hideTimeout);
}
}
function hashlook() {
if (wlh != window.location.hash) {
wlh = window.location.hash;
//alert(wlh);
customAlert();
//document.getElementById("mydbut").click();
}
setTimeout(hashlook, 1000);
}
function amin(inm) {
for (var i=0; i<chapters.length; i++) {
if (inm == chapters[i]) inchapter=i;
document.getElementById('sel').innerHTML+="<option value='" + encodeURIComponent(chapters[i].replace('?','')) + "'>" + chapters[i] + "</option>";
}
document.body.style.backgroundColor=bcol[eval(inchapter % bcol.length)];
return inchapter;
}
function wino(ib) {
window.open(ib,"_blank","left=50,top=50,width=500,height=500");
}
function fwino(ib) {
top.window.open(ib,"_blank");
}
function append() {
if (bodclick == true) {
var ourinb='';
if (onetoinvis != '') document.getElementById(onetoinvis).style.display='none';
onetoinvis='';
if (inb == '') {
inb=eval(arrname + "[" + thisone + "]");
ourinb=inb.replace('/Library/pgAgent/', 'localhost:8888/').replace('file://localhost:8888','http://localhost:8888');
if (document.URL.indexOf('rjmprogramming.com.au') != -1) ourinb=ourinb.replace('http://localhost:8888/ansible_up_and_running.jpg','http://www.rjmprogramming.com.au/Mac/Ansible/ansible_up_and_running.jpg');
if (document.URL.indexOf('rjmprogramming.com.au') != -1) ourinb=ourinb.replace('http://localhost:8888/thesetup.jpg','http://www.rjmprogramming.com.au/Mac/Ansible/thesetup.jpg');
if (document.URL.indexOf('rjmprogramming.com.au') != -1) ourinb=ourinb.replace('http://localhost:8888/virtualbox.jpg','http://www.rjmprogramming.com.au/Mac/Ansible/virtualbox.jpg');
if (document.URL.indexOf('rjmprogramming.com.au') != -1) ourinb=ourinb.replace('http://localhost:8888','http://www.rjmprogramming.com.au/Mac/Ansible');
ourinb=ourinb.replace('/Library/pgAgent/mybox/playbooks/Vagrantfile', 'www.rjmprogramming.com.au/Mac/Ansible/Vagrantfile.').replace('/Library/pgAgent/mybox/playbooks/', 'www.rjmprogramming.com.au/Mac/Ansible/').replace('file://www.','http://www.');
//if (inb.indexOf('file:') == 0) alert('inb=' + inb + ' ourinb=' + ourinb);
} else if (thisone < eval(arrname + ".length")) {
inb=eval(arrname + "[" + thisone + "]");
ourinb=inb.replace('/Library/pgAgent/', 'localhost:8888/').replace('file://localhost:8888','http://localhost:8888');
if (document.URL.indexOf('rjmprogramming.com.au') != -1) ourinb=ourinb.replace('http://localhost:8888/ansible_up_and_running.jpg','http://www.rjmprogramming.com.au/Mac/Ansible/ansible_up_and_running.jpg');
if (document.URL.indexOf('rjmprogramming.com.au') != -1) ourinb=ourinb.replace('http://localhost:8888/thesetup.jpg','http://www.rjmprogramming.com.au/Mac/Ansible/thesetup.jpg');
if (document.URL.indexOf('rjmprogramming.com.au') != -1) ourinb=ourinb.replace('http://localhost:8888/virtualbox.jpg','http://www.rjmprogramming.com.au/Mac/Ansible/virtualbox.jpg');
if (document.URL.indexOf('rjmprogramming.com.au') != -1) ourinb=ourinb.replace('http://localhost:8888','http://www.rjmprogramming.com.au/Mac/Ansible');
ourinb=ourinb.replace('/Library/pgAgent/mybox/playbooks/Vagrantfile', 'www.rjmprogramming.com.au/Mac/Ansible/Vagrantfile.').replace('/Library/pgAgent/mybox/playbooks/', 'www.rjmprogramming.com.au/Mac/Ansible/').replace('file://www.','http://www.');
//if (inb.indexOf('file:') == 0) alert('inb=' + inb + ' ourinb=' + ourinb);
} else {
inchapter++;
if (inchapter < chapters.length) {
location.href='./ansible_playbook.html?title=' + encodeURIComponent(chapters[inchapter].replace('?',''));
} else {
location.href='./ansible_playbook.html';
}
}
if (ourinb != '') {
if ((ourinb + '~').indexOf('.jpg~') != -1) {
if (document.URL.indexOf('rjmprogramming.com.au') != -1) inb=inb.replace('http://localhost:8888/ansible_up_and_running.jpg','http://www.rjmprogramming.com.au/Mac/Ansible/ansible_up_and_running.jpg');
if (document.URL.indexOf('rjmprogramming.com.au') != -1) inb=inb.replace('http://localhost:8888/thesetup.jpg','http://www.rjmprogramming.com.au/Mac/Ansible/thesetup.jpg');
if (document.URL.indexOf('rjmprogramming.com.au') != -1) inb=inb.replace('http://localhost:8888/virtualbox.jpg','http://www.rjmprogramming.com.au/Mac/Ansible/virtualbox.jpg');
document.getElementById('rest').innerHTML+='<li id=li' + thisone + '>' + inb + '</li><li><img id=i' + thisone + ' style=position:absolute;left:0px; src=' + inb + '></img></li>';
thatone=thisone;
setTimeout(movedown, 500);
location.href='#li' + thisone;
onetoinvis='i' + thisone;
} else if ((ourinb + '~').indexOf('file:') == 0) {
//if (inb.indexOf('file:') == 0) alert('why0 inb=' + inb + ' ourinb=' + ourinb);
document.getElementById('rest').innerHTML+='<li id=li' + thisone + '><a href=# onclick=" fwino(' + "'" + inb + "'" + ');">' + inb + '</a></li><li><scr' + 'ipt type="text/javascript"> window.open("' + inb + '","_blank","left=50,top=50,width=500,height=500"); </scr' + 'ipt></li>';
} else if ((ourinb + '~').indexOf('http') == 0 && ourinb.indexOf('localhost') == -1 && ourinb.indexOf('rjmprogramming.com.au') == -1) {
//if (inb.indexOf('file:') == 0) alert('why00 inb=' + inb + ' ourinb=' + ourinb);
document.getElementById('rest').innerHTML+='<li id=li' + thisone + '><a href=# onclick=" wino(' + "'" + inb + "'" + ');">' + inb + '</a></li><li><scr' + 'ipt type="text/javascript"> window.open("' + inb + '","_blank","left=50,top=50,width=500,height=500"); </scr' + 'ipt></li>';
} else if ((ourinb + '~').indexOf('http') == 0 && ourinb.indexOf('#') != -1) {
if (ourinb != inb && 1 == 2) {
//alert('<li id=li' + thisone + '>' + inb + '</li><li><scr' + 'ipt type="text/javascript"> window.open("' + ourinb + '_GETME' + '","_blank","left=50,top=50,width=500,height=500"); </scr' + 'ipt></li>');
document.getElementById('rest').innerHTML+='<li id=li' + thisone + '>' + inb.replace('file:///Library/pgAgent', '$HOME') + '</li><li><scr' + 'ipt type="text/javascript"> window.open("' + ourinb + '","_blank","left=50,top=50,width=500,height=500"); </scr' + 'ipt></li>';
} else {
document.getElementById('rest').innerHTML+='<li id=li' + thisone + '>' + inb.replace('file:///Library/pgAgent', '$HOME') + '</li><li><iframe onclick="bodclick=false;" id=i' + thisone + ' style=background-color:white;width:100%;height:400px;margin-left:0px; src=' + ourinb + '></iframe></li>';
}
thatone=thisone;
//setTimeout(movedown, 500);
location.href='#li' + thisone;
onetoinvis='i' + thisone;
} else if ((ourinb + '~').indexOf('http') == 0) {
document.getElementById('rest').innerHTML+='<li id=li' + thisone + '>' + inb.replace('file:///Library/pgAgent', '$HOME') + '</li><li><iframe onclick="bodclick=false;" id=i' + thisone + ' style=background-color:white;width:100%;height:900px;margin-left:0px; src=' + ourinb + '></iframe></li>';
thatone=thisone;
//setTimeout(movedown, 500);
location.href='#li' + thisone;
onetoinvis='i' + thisone;
} else {
thisone--;
if (thatone != thisone && thatone >= 0) {
var kjisin=toastIn.indexOf(inb);
if (kjisin != -1 && (document.URL + '~').indexOf('#l' + thisone + '~') == -1 && document.URL.indexOf('notoast=') == -1) {
//alert('movedown ' + kjisin + ' ' + inb + ' ' + document.URL);
document.getElementById('rest').innerHTML='<li>' + inb.replace('file:///Library/pgAgent', '$HOME') + '</li>';
setTimeout(movedown, 500);
} else {
document.getElementById('rest').innerHTML+='<li>' + inb.replace('file:///Library/pgAgent', '$HOME') + '</li>';
}
} else {
document.getElementById('rest').innerHTML+='<li>' + inb.replace('file:///Library/pgAgent', '$HOME') + '</li>';
}
thisone++;
}
}
thisone++;
}
bodclick=true;
}
function movedown() {
window.location.hash='#li' + eval(-1 + thisone);
location.href='#li' + eval(-1 + thisone);
//alert('=' + window.location.hash);
}
function andthen() {
arrname=document.getElementById('myh1').innerHTML.replace('?','').replace('.','').replace('-','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','');
append();
//alert(arrname);
//for (var i=0; i<eval(arrname + ".length"); i++) {
// inb=eval(arrname + "[" + i + "]");
// append();
//}
}
</script>
<style>
body { font-family: Verdana; font-size: 24px; }
ul.noclass1 li:before { list-style: none; float left; margin-left: -15px; content: '\01F311 \0000a0'; }
ul.noclass2 li:before { list-style: none; float left; margin-left: -15px; content: '\0026F3 \0000a0'; }
ul.noclass3 li:before { list-style: none; float left; margin-left: -15px; content: '\0026BD \0000a0'; }
ul.noclass4 li:before { list-style: none; float left; margin-left: -15px; content: '\00263C \0000a0'; }
ul.noclass5 li:before { list-style: none; float left; margin-left: -15px; content: '\00263D \0000a0'; }
ul.noclass6 li:before { list-style: none; float left; margin-left: -15px; content: '\00263E \0000a0'; }
ul.noclass7 li:before { list-style: none; float left; margin-left: -15px; content: '\01F311 \0000a0'; }
ul.noclass8 li:before { list-style: none; float left; margin-left: -15px; content: '\0026F3 \0000a0'; }
ul.noclass9 li:before { list-style: none; float left; margin-left: -15px; content: '\0026BD \0000a0'; }
ul.noclass10 li:before { list-style: none; float left; margin-left: -15px; content: '\0026f5 \0000a0'; }
ul.noclass11 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x91\xA0 \0000a0'; }
ul.noclass12 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x91\x93 \0000a0'; }
ul.noclass13 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x90\x98 \0000a0'; }
ul.noclass14 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x90\x92 \0000a0'; }
ul.noclass15 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8E\x89 \0000a0'; }
ul.noclass16 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8D\xB0 \0000a0'; }
ul.noclass17 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8D\xA9 \0000a0'; }
ul.noclass18 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8D\xA8 \0000a0'; }
ul.noclass19 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8D\xA7 \0000a0'; }
ul.noclass20 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8D\xA3 \0000a0'; }
ul.noclass21 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8D\xB1 \0000a0'; }
ul.noclass22 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8E\x88 \0000a0'; }
ul.noclass23 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8E\xA7 \0000a0'; }
ul.noclass24 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8E\xA8 \0000a0'; }
ul.noclass25 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8E\xB5 \0000a0'; }
ul.noclass26 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8F\x88 \0000a0'; }
ul.noclass27 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x90\x99 \0000a0'; }
ul.noclass28 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x90\x9E \0000a0'; }
ul.noclass29 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x90\xB6 \0000a0'; }
ul.noclass30 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x90\xBC \0000a0'; }
ul.noclass31 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x90\xBE \0000a0'; }
ul.noclass32 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x93\x8A \0000a0'; }
ul.noclass33 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x93\xA2 \0000a0'; }
ul.noclass34 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x91\xBC \0000a0'; }
ul.noclass35 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x90\xAB \0000a0'; }
ul.noclass36 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x90\xA8 \0000a0'; }
ul.noclass37 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x90\x97 \0000a0'; }
ul.noclass38 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8F\x80 \0000a0'; }
ul.noclass39 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8E\xB7 \0000a0'; }
ul.noclass40 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8E\xA9 \0000a0'; }
ul.noclass41 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8D\xAE \0000a0'; }
ul.noclass42 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8D\x92 \0000a0'; }
ul.noclass43 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8F\x80 \0000a0'; }
ul.noclass44 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8C\x88 \0000a0'; }
ul.noclass45 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x9A\xB2 \0000a0'; }
ul.noclass46 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x9A\xA2 \0000a0'; }
ul.noclass47 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x9A\x99 \0000a0'; }
ul.noclass48 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x9A\x87 \0000a0'; }
ul.noclass49 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x9A\x8F \0000a0'; }
ul.noclass50 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x9A\xA7 \0000a0'; }
ul.noclass51 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x9A\xAA \0000a0'; }
ul.noclass52 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x9A\x83 \0000a0'; }
ul.noclass53 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x9A\x87 \0000a0'; }
ul.noclass54 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x98\x81 \0000a0'; }
ul.noclass55 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x98\x82 \0000a0'; }
ul.noclass56 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x98\xB8 \0000a0'; }
ul.noclass57 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x9A\x92 \0000a0'; }
ul.noclass58 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x9A\x87 \0000a0'; }
ul.noclass59 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x9B\x80 \0000a0'; }
ul.noclass60 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8C\xB4 \0000a0'; }
ul.noclass61 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8C\xB5 \0000a0'; }
ul.noclass62 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8C\xB7 \0000a0'; }
ul.noclass63 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8C\x9F \0000a0'; }
ul.noclass64 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8C\xBD \0000a0'; }
ul.noclass65 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8C\xBE \0000a0'; }
ul.noclass66 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8D\x84 \0000a0'; }
ul.noclass67 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8D\xB7 \0000a0'; }
ul.noclass68 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8D\x8F \0000a0'; }
ul.noclass69 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8D\x9F \0000a0'; }
ul.noclass70 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8D\xB5 \0000a0'; }
ul.noclass71 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8C\x89 \0000a0'; }
ul.noclass72 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8C\x8A \0000a0'; }
ul.noclass73 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8C\x8B \0000a0'; }
ul.noclass74 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8C\x87 \0000a0'; }
ul.noclass75 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8C\x86 \0000a0'; }
ul.noclass76 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8C\x81 \0000a0'; }
ul.noclass77 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8C\x82 \0000a0'; }
ul.noclass78 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8C\x82 \0000a0'; }
ul.noclass79 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8C\x83 \0000a0'; }
ul.noclass80 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x8C\x84 \0000a0'; }
ul.noclass81 li:before { list-style: none; float left; margin-left: -15px; content: '\\xE2\x9B\xAA \0000a0'; }
ul.noclass82 li:before { list-style: none; float left; margin-left: -15px; content: '\\xE2\x9B\xB2 \0000a0'; }
ul.noclass83 li:before { list-style: none; float left; margin-left: -15px; content: '\\xE2\x9B\xBA \0000a0'; }
ul.noclass84 li:before { list-style: none; float left; margin-left: -15px; content: '\\xE2\x9B\x83 \0000a0'; }
ul.noclass85 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x9A\x80 \0000a0'; }
ul.noclass86 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x97\xBB \0000a0'; }
ul.noclass87 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x97\xBC \0000a0'; }
ul.noclass88 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x97\xBD \0000a0'; }
ul.noclass89 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x97\xBF \0000a0'; }
ul.noclass90 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x90\xA7 \0000a0'; }
ul.noclass91 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x99\x8B \0000a0'; }
ul.noclass92 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x99\x88 \0000a0'; }
ul.noclass93 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x99\x89 \0000a0'; }
ul.noclass94 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x99\x8C \0000a0'; }
ul.noclass95 li:before { list-style: none; float left; margin-left: -15px; content: '\\xF0\x9F\x98\x96 \0000a0'; }
button {
display: none;
margin: 0 auto;
margin-top: 32px;
}
.custom-alert {
display: inline-block;
visibility: hidden;
background-color: #666;
color: #fff;
text-align: enter;
margin: 5% auto;
padding: 12px 48px;
}
</style>
</head>
<body ontouchstart=" bodclick=true; " onclick=" append(); " onload=" var ucl=Math.floor(Math.random() * 9) + 1; document.body.innerHTML+='<ul id=rest style=margin-left:200px; class=noclass' + ucl + '></ul>'; var inh=location.search.split('title=')[1] ? decodeURIComponent(location.search.split('title=')[1].split('&')[0]) + '?' : 'Ansible Core - Introduction to Playbooks Tutorial'; document.getElementById('myh1').innerHTML=inh + ''; document.title=inh + ' ... ' + document.title; inchapter=amin(document.getElementById('myh1').innerHTML); andthen(); var hashbs=document.URL.split('#l'); if (hashbs.length > 1) { thatone=eval(hashbs[1]); } setTimeout(hashlook, 2000); wlh=window.location.hash; ">
<h1 ontouchstart="bodclick=true; append();" style=' text-align:center; width:100%;' id='myh1'></h1>
<div ontouchdown="bodclick=true;" style=' text-align:center; width:100%;'><select id="sel" onclick="bodclick=false;" onchange=" location.href='ansible_playbook.html?title=' + this.value; "><option value="">Optionally jump to ...</option></select></div>
<!--ul id=rest style='margin-left:200px;'>
</ul-->
<div id='custom-alert-1' class="custom-alert"></div>
<button id='mydbut' onclick="customAlert()" style='display:none;'>Click to alert</button>
</body>
</html>