Ansible 101 - Episode 1 - Introduction to Ansible

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
Alright, it looks like it's working.  Every time I start these streams,   since I'm using a little bit of an older  Mac, it gobbles up the CPU and the stream doesn't always start right on time. But  it looks like things are working now,   and I'm seeing that on my other device  it is…it is showing me! So that's good. Welcome everybody! A week or so  ago—actually it was a few days   ago—I was thinking about the fact  that a lot of people got my book,   and I also started doing some live streaming  for Drupal, and I put the two together and   I thought “Why not just live stream how  to use Ansible, teaching from my book?”. If you don't know about it, this is Ansible  for DevOps. You can get a paperback copy of it   on Amazon, but right now until the end of March  you'll be able to get it for free on Leanpub. I   may or may not be able to extend that to another  month or something like that, but we'll see. But thank you for joining the live stream! I  can see people—you're hearing my voice twice,   that's not good…is anybody—okay, works  on reload. All right. So that's weird. As I said at the beginning, YouTube is  sometimes a little shaky with the setup   that I have on my older laptop,  so if you have any problems,   go ahead and put them in chat and  hopefully we'll get them worked out. But thanks for joining the live stream!  My intention is to go through examples   in the book and kind of start from scratch,  assuming you've never used Ansible before   and don't even have it installed and go from  there. So I figure we can get started in the   Preface. And I will grab out my handy little  bookmark, which is a Raspberry Pi 0. It's   nice and flat makes a good bookmark.  I have plenty of them sitting around,   I also have a Pi A and all these little  projects that I'm working on—here's a Pi 4. It's pretty fun using them for testing  with Ansible, because they're by nature   pretty headless, if you're using them  for projects or in the house like I do,   and we might get into that later in this  series, but probably not today unfortunately. In the preface of the book I kind of go through  how I got started with Ansible. I started using   Ansible in…2013, I think it was, and the reason  for that was I was transitioning from using a   lot of projects that had the single server  or maybe two servers, something like that,   to having projects that had five, ten, fifteen  servers, or managing lots of different projects   that had servers that had similar requirements.  And once you start making that transition,   which a lot of people and a lot of companies  made in the early 2000s or mid-2000s,   you start realizing it's hard to manage all  these servers. So configuration management   tools that existed, Chef and Puppy were out,  CFEngine, there were some other things too,   and a lot of people had shell scripts or run  books that they would do, but there wasn't   anything really, really easy and simple. It  wasn't as simple as writing a shell script   and running it on your server, especially  if you had to install stuff on your servers. So as we made that transition, Ansible came  onto the scene and made things a lot simpler,   because instead of having to know kind of some  programming languages or some special DSLs,   you could basically take a shell script  and turn it into a simple Ansible script,   or “playbook” as we call them, and you wouldn't  even have to use any special Ansible modules or   logic or anything. But you could make it so  it could run all your servers really easily. In the book I start from the perspective  that you probably have done some form of   Linux administration before. This book is written  from the perspective of me, who came into it as   a junior-to-mid-level Linux sysadmin, and you go  from that point and we're gonna take you through   to automating large-scale infrastructure. And then  eventually we're going to talk about Kubernetes,   Docker, things like that as well. And in the book  there's a lot of different typographic conventions   and things, but one important thing is, I have in  here—if you have the book, there is a section on   the current published book version—it's important  that I have that because a lot of books that I've   gotten in the past, you buy the book and then  it's out of date within a week, or a month, or,   you know in the best case scenario, a year or  so, because technology keeps evolving so much. And the reason I push people to buy my book on  Leanpub is because on Leanpub you can get the   book updates free forever, and I've already  pushed out 22 major revisions to the book,   with hundreds—or I think now of thousands of  changes, a lot of them from people who found   bugs or issues in the code in the book. And the  other cool thing is I have all almost all the   examples in the book in continuous integration,  so when a new version of Ansible comes out and   changes something, I know that that it’s broken  right away and I can fix it. So if you have the   book from Amazon, a paperback version, you can  get a free copy of the Leanpub book right now,   just go to Leanpub, search for  Ansible for DevOps, and grab it! But it's also important, if you're looking at the  book and you see the current book version is like,   version 1.18, there's a lot of changes  from 1.18 to now! And you can find all   the errata on the book's website which is  Ansiblefordevops.com, and down at the bottom   there's a link to the errata and changes page,  which has links to a lot of the fixes that are   in the book. If you have the ebook, you  can always download the newest copy and   you'll have that. If you have the paperback,  you might want to grab the ebook as well. In the introduction chapter I talked a little  bit about Ansible and Red Hat and the history,   and also DevOps—I think it's funny  I named my book “Ansible for DevOps”   partly because DevOps was beginning to  be a very popular thing at that point. And also like I said earlier, put stuff in  the in the chat stream and I will check on   it throughout this video…and [viewer]  asks if you're touching on network   devices—I probably won't get specifically  into networking in this initial series,   but I will try to find ways to point you  in the right direction for things that   might have to do with networking, Windows,  other things that I won't cover directly. But in the introduction I mentioned that DevOps is  kind of a loaded word. some people call themselves   DevOps engineers, other people say that DevOps  isn't a real thing, all this kind of stuff,   and in the book I make the point that DevOps to  me is more of a philosophy than necessarily a job   position or a role. It's the philosophy that  your development and operations are really tied   together, and that's becoming even more so today  when developers might be managing build tools, and   and things like—you know, with Docker containers  being pushed up into Kubernetes clusters,   and with applications using a newer kind of micro  services architecture, or even if it's a monolith   with split up code base, all the different  ways that deployments happen, a lot of times   development has to account for the operational  capacity of running the things that are developed. So in that sense, I think it's it's a good  word and a good movement to get around,   to be able to have development and operations  be intermixed. There’s still always going to   be a need for SREs and sysadmins who are  kind of running the servers and making   sure applications work, and there's developers  who specialize in building the applications,   but it's it's more and more integrated  these days and I think that's a good thing. And then with Ansible’s history—Ansible started  out as a small project that was—the goal of it   was initially kind of like an offshoot of a  thing called Funk, which would allow you to   run commands on multiple servers. And an  interesting thing about the word Ansible:   if you don't know what that is, and if  you google it there's a few different   things with Ansible if you Google it, I think  there's a festival somewhere in South America,   like “Ansible Fest”, which is funny because we  have a festival for Ansible called “Ansible Fest”,   and so when you search that timeline on  Instagram, you see like, some people partying,   and then other people partying who are  not quite the same kind of partying! But “Ansible” is a device that was in the book  Ender's Game; it's a sci-fi book from—I don't   remember when it was published, but it's a,  you know, relatively modern sci-fi book. And   the Ansible is a device that lets you communicate  instantaneously with other devices throughout the   universe without any delays, not even the speed  of light. It's like instant communication. The   idea was that you can instantly communicate with  all your servers from your local machine or from   a CI machine or from Ansible tower or something  like that, using Ansible, which is the device that   communicates with them all. And Funk—and Ansible  itself, if you just use the Ansible command—can   run commands on servers using an inventory,  which we’ll describe in a couple minutes. But some of the goals of Ansible are that  it's clear, fast, complete, efficient,   and secure. Those are the things that I  put in the book. The idea is that it's   easy to learn and pick up quickly, especially  if you're used to shell scripting or any kind   of basic automation. It's complete  in that it has everything included   with it—and that's an interesting  thing that I'll get into later on. The idea is that it has its “batteries included”,  because when you install Ansible you get something   like 4,000 or 5,000 different modules that do  all these different things with networking,   with Windows, with Linux servers, even Mac  with homebrew, and things like that. It’s   also efficient, because you don't need to install  extra stuff and have them running on your servers. Ansible uses SSH, or—we'll get into it—other  communication methods to communicate with the   servers natively without having to  install a daemon that's running on   the servers or having an open port on your  servers just for the automation tool. It's   also secure because of the fact that  it uses secure transport protocols,   and there's minutia that we could get into  later. But a couple more interesting bits of   trivia is that up until Ansible 2, major releases  were named after Led Zeppelin songs, and in—no,   let's see—up until version 2 it was Van Halen,  and from version 2 on it’s Led Zeppelin songs.   You might not see that day-to-day using it  so well, but it's a fun thing to think about. I actually named some releases of another project  I work on called Drupal VM after songs from Tron!   I exhausted all of the Tron original 1972  songs by Wendy Carlos, but I have now I'm   using the songs from Tron Legacy from Daft Punk.  So fun things that you can do in your project! Ansible was founded a little bit  after the project was started,   and then Ansible was actually bought by Red  Hat in 2015. And if you follow the news,   Red Hat was acquired by IBM in 2018,  I think…it might have been last year,   I don't know. Time flies, and the past few  weeks have been a little bit crazy anyways! Anyway, so at this point Red Hat is in charge  of Ansible, and Ansible integrates a lot into   the Red Hat ecosystem, which makes sense  because Red Hat integrates with like,   everything in the world of Linux  and cloud computing and all that. And another thing to note in the introduction  is that all the examples that we'll be doing   in this book and in this video series are linked  from the book’s website, so if you go to the code   sample section, this is a GitHub repository,  it's open source—you can you can download,   it you can fork it and do whatever you want  with it. Most of the examples are in here,   and on the readme it has a mapping of which  chapter the example comes from. I'm actually   working on moving some more examples from the book  into the repository so you can grab them easily. And hello to everybody saying hi! It's good  to see you guys, and it looks like we have   a good representation from all around the  world, which is which is pretty awesome. There's also some other things  that if you're getting started   with Ansible it's good to know about.  One is obviously docs.Ansible.com—not   “doc”—“docs” dot Ansible dot com. It  has all of the official documentation   for pretty much all of the Ansible ecosystem,  and there's lots of great documentation here. My book is not meant to be like a documentation  guide. It's meant to be a more practical set of   examples to get you started quickly, but the  documentation has a lot of good—it has videos,   it has information about Ansible Tower,  which we'll get into much later in the book,   and networking. I know someone  mentioned networking earlier,   there's documentation for it, and also  using content off Ansible Galaxy. All   these different things are documented here,  and this has grown quite a bit since I started,   and it's a great resource. There's a great  team of people at Red Hat that work on this   documentation, they make it one of the best  open source documentation sets I've ever used. There's also a mailing list, Ansible Project  mailing list. I think it's on GitHub,   or—not GitHub, Google Mail—Gmail or whatev—Google  Groups, that's what it is. All these resources   are in the Ansible Community Guide, which is on  Ansible.com. But this this mailing list is good   for asking general questions or getting general  feedback. There's also an Ansible development   mailing list. These are good resources, and  they're pretty active too. A lot of communities,   you put out an email and you'll never get  a response, but here a lot of times you get   some good responses, sometimes from  other people with the same problems. Someone mentioned “IBM acquired Red Hat  in 2019”, yes that is true. Someone's   saying “Hello from Aquia”—hi!! That  was my—I worked at Aquia in the past,   so it's good to see some good former co-workers  coming in from there. There's also a lot of other   guides. If you Google—if you go to the Ansible  Community section, there's a lot of guides for   all the different things you can do in Ansible  once you start realizing how awesome it is.   There's also the Ansible blog, which is “The  Inside Playbook”. Blog dot Ansible dot com,   maybe? Maybe not. Yeah, well…”Ansible  blog”, I’ll go back to the old Google… The Inside Playbook has a lot of good resources  a lot of good articles and it can keep you up to   date when there's major changes in the Ansible  ecosystem. There's a good article on here with   Ansible collections, which is a big change.  I'll mention it from time to time in the book. For this video series, I'm talking about Ansible  2.9, which is the current version of Ansible. In   Ansible 2.10, some things will start changing with  the way that content is delivered. Earlier I said   something about “batteries included”—the way that  Ansible is distributed will change a little bit,   so that it's mostly “batteries included”  but there are ways that you can make it   so that you can kind of get Ansible  WITHOUT the batteries included, too. Anyway, so let's move on and get started  with using Ansible! The first chapter gets   into basically how you're going to do your first  work with Ansible, and see kind of how it works,   how it interacts with your servers. And the reason  I start here is because I think a lot of people   that come into Ansible or Chef or Puppet or any  kind of automation work, they realize, you know,   that they have what we call “snowflake servers”,  and a snowflake server is a server that—I’m   gonna get back to my page here. A snowflake  server is something that you set up by hand,   or you have manual processes involved in managing  that server, and you can't get that server back   to a clean state with [just] a click of a button  or running one command. You might have to do a   bunch of steps, or you use a runbook to  get that server back into a good state. A lot of times, the motivation for  automation is [that] you want to   get the ability to have servers set up and  spin up new servers, or build containers,   or build <fix> or images for your servers  that are able to be put up very quickly,   especially if you need to scale up and scale  down if you run web applications, or have   jobs that need to be able to spin up new servers  quickly. There's a lot of different tools for it;   I mentioned earlier there's CFEngine, Puppet,  and Chef are three of the big ones that were   out in the time that Ansible came into  existence. Saltstack is another one that   came out around the same time as Ansible and  actually has a lot of similarities to Ansible,   although there's also plenty of differences there,  too, but it’s—I guess Salt and Ansible are sort of   two of the more what I would call the the modern  yaml-based systems for configuration management. One of the things I liked about Ansible  was the fact that I could take my shell   scripts and shell commands and things that I  already knew how to do and just kind of move   them into Ansible and let Ansible run them for  me, and I didn't have to learn about Ansible’s   modules. I didn't have to learn Python, I  didn't have to learn any special syntax,   all I had to learn was how to  run that command on my servers. And the first thing that you need to do to be  able to do that is install Ansible. There's a   ton of different ways to install Ansible, but the  way that I like and I use on almost every server   that I've installed Ansible on, and my local  machine, my Mac—my Windows machine is using   “pip” which is a Python package library manager,  and if you're using—if it's 2020 like it is now,   you should probably start using Python  3, because Python 2 has been deprecated. But there's still cases where people use Python 2,  and in the Python language there's “pip”, which is   the Python 2 version, or “pip3”, which I'm using  because I'm using Python 3 now. So I'm going to   say pip3 install Ansible, and that's going to  install the full set of everything in Ansible.   It's gonna install the Ansible command, the  Ansible playbook command for running playbooks,   which we'll get into a little later. It's  gonna install inventory management commands,   and documentation commands, all the things  that we'll get into throughout this book,   and it installs Ansible plus  all the packages it relies on. The first time you do this, it might take a  few minutes to download and install everything,   and if you have problems with it, sometimes  that's related to your Python environment on   your computer. You might be using a Python  version that's built into your computer and   it has issues with permissions, and you might  be tempted to run “sudo pip install ansible”,   and that might or might not make it work, but  that's something that I won't get into in this   particular video because we could go down a deep  rabbit hole with Python environment management. Hello also to—someone's from Argentina, the  Netherlands…I was gonna wear my Holland or   my Netherlands soccer jersey today,  but instead I have this boring blue   shirt. But maybe I'll wear that  in another future episode here. So Ansible is installed now, and I installed  it via pip, and if I run Ansible <fix> version   I can check and make sure that it's running. And  when I do that it also gives me some information   about how Ansible is running, which package it's  using, where the executable is, what the Python   version is that Ansible sees, and if you're  running Ansible—if you're a Python developer,   I'm not a Python developer, but if you're a  Python developer and you use PI environment   or some other tool to manage your Python  environments, this stuff can be a lot more   helpful to make sure you're running in the right  setup and not not running in the wrong place,   because in Python you might have like, five  installations of Python at a time running. Someone asks about Miniconda, Anaconda, all  that—I am—like I said, I'm not a Python developer,   and I'm sure a lot of people on this  watching this are not Python developers,   and if you're not you might not want to dive  straight into the world of Python environment   management. And I don't particularly—I  think what I did was I used a homebrew,   so on the Mac it's “brew install Python 3” or  something like that. That's how I installed my   Python environment, and I'm happy with  it, and it works, and I only use a few   different things. If you're a Python developer,  dive into all that stuff and figure it out. The next step here is I want to start running a  command on server, so I actually set up in Amazon,   in my Amazon Web Services account, I set up  a little EC2 server. I'm on their free tier,   because I you know, I'm saving money.  I set up a little T2 Micro server,   and this is its public IP address. I also  made sure it has a security group that has   port 22 open, but you can—this could be a server  anywhere, it could be a server in DigitalOcean,   it could be a server running in your house, it  could be a Raspberry Pi. All that I need to do   is make sure that the server’s on and has SSH  available, and by default it's sent to a server. In Amazon, if you want to log in to that  server, you need to make sure you have the   key pair downloaded on your computer and added  in your key chain. And then I can log into it   right now using SSH. CentOS is the default  user at that IP address. And now now I'm   logged in to it, and you can also see that  I'm in Saint Louis, Missouri, using Charter,   which—I don't particularly like Charter, but  it's working right now, so what can I say. I'm gonna exit out of that server,  but I can log into it by SSH,   and that's all that Ansible needs to do  to be able to log into all your servers.   There's other ways to connect to other  types of things, network devices and   Windows and all that, but you know, this  book is targeted at Linux administration. I’m going to be able to connect to that server  with Ansible, because I can already connect to it   with this SSH. We've gotten Ansible installed. If  you're on Windows—if you're on Mac or Linux, pip   is the easiest way. If you're on Windows, there's  actually a few different ways you can do it. I recommend using the Windows subsystem  for Linux. Hopefully the WSL 2 will come   out soon. If you're watching this  video after the stream is over,   it might actually be out by now! But it's  easier to manage things that way inside of   that Linux subsystem environment, because  it's basically Linux inside of Windows,   so you can install it the same way using  pip. You might have to install the Python 3   pip package using pip, but once it's installed  you can run “pip3 install Ansible” and get it. There's also a lot of different ways to  install Ansible that I didn't cover that   the book actually goes through.  You can find those in the book,   or look online at ansible.com. It's in the  documentation, just search “install Ansible”. The first thing we need to do to get Ansible  to know about the server—I know it, because I   know the IP address here. We need to create an  inventory file. An inventory file just says,   “Hey Ansible, here's the servers that I'm working  on,” and in this case we just have one server. I'm going to go into my site's  directory where I have my projects   and make a new folder called “Chapter 1”.  I'm gonna go into that folder, Chapter 1,   and I'm going to make an inventory file. So  I'm gonna say “touch inventory”, then I'm   gonna open this folder in my text editor, which is  Sublime Text, and the inventory’s file is empty. It uses—by default, inventory files use an  INI style syntax. It's not exactly INI syntax,   but it's close enough. The way it works is you  set up a group, an inventory group of servers.   I'm going to call this “example”, because it's  an example, and then you list all the servers   beneath that group. So in the example group I just  have this one server right now, the EC2 server. Daniel says in the chat, “I recommend  installing Linux over Windows is the   first step ;)”, yeah, that's an  option for some people I guess! So here's my inventory file and this is  basically [?] Ansible. I have a group of   servers called “example”, and in this case  there's just one server in that group with   this IP address. You can put an IP  address, you can put in a host name,   whatever it is, however you reach  that server when you call it via SSH. I'm gonna save that inventory file, and now  Ansible knows about that server. What I can   do is I can say “ansible”—oops, I think I  hit escape—“ansible”, and then you pass the   inventory file to it, so “- i inventory”—that  tells Ansible where the inventory file is for   your servers. And then I can say “example”,  which is the group of servers I'm operating on,   and then “-m ping”, and this tells Ansible to  use its ping module to ping the servers. And   then I'm gonna say use user CentOS,  because that's who I logged in as. When Ansible comes back it says it was  successful connecting to that server,   there were no changes made on the  server—this will be important for   something I'll mention in a bit—and when  it pings the server it got a “pong” back.   It also is telling me that it found  Python on the server, which is great. One quick note is that I said that Ansible’s  agentless, and it doesn't require anything   special to be installed on the servers.  That's mostly true, but you do need Python,   a version of Python, to be installed on the  servers, which probably 95 to 98% of servers   out there have Python on them already so this  isn't gonna be a problem. But if you do have a   server out there that doesn't have any Python  available on it, you might need to make sure   that that those servers have Python available  for Ansible to be able to interact with them,   because it it sends over a Python module, it  runs it, and then it gets the results back. Anyway, we've just used Ansible to communicate  with that server instead of using SSH,   but Ansible actually uses SSH in the  background. You might think also,   this is kind of annoying that I had to  put in, like, the inventory is here,   and I had to put in a username. You can actually  put some of these things into the inventory file.   I can put Ansible SSH user in here to to tell it  what what SSH user to use, and I can also set up   an “ansible.cfg” file, which I'll do now to give  Ansible some general configuration directives. I’m going to create an Ansible…”ansible.cfg”,  and then in here I’m gonna override Ansible’s   defaults, and I'm gonna set—I think its  “INVENTORY = inventory”. Let's see if that works. So now I don't have to specify that inventory  file, and all the directives that you can   put into your Ansible configuration  are available online if you search   for “Ansible configuration”. The  Ansible documentation has that. I’m gonna save that and close it, save the  inventory file. Another few notes about this:   I put in here “-u centos”. You can also specify  if you don't have key based authentication—so   I'm using the SSH key, or what is it, I forget  what Amazon calls it—the key pair! I'm using a   key pair, or an SSH key, to connect to the server.  If you want to use password-based authentication   you can actually do that, and I think the  flag for that is “-k”? I have it in the book. You can use “-k”, and you can also “--ask-pass”  to provide the password in the command line   instead of having it in your prompt and in your  history. But it's a lot better to use SSH keys.   If you're not familiar with them, there's some  links in the book. You can also use a link to   Ubuntu’s documentation, because it's the most  complete and simple I think, but the idea is   that you have a private key on your computer,  and you put the public key pair on the server,   so that you can connect from your computer to that  server securely using key-based authentication,   which is a little easier to use and also  easier to automate than using passwords,   and it's more secure than having passwords  being transported all over the place. It's nice that we can see that we can  ping the server, but that's not very   useful. One thing that I actually do  use—these are called ad-hoc commands,   and “ad hoc” is Latin for “to this”  or “for this” or something like that,   I took Latin and I'm already forgetting  all of it, back in college and high school. But anyway, these commands basically  run something against the server,   and so I'm going to run the command “free  -h”, which is going to give me the the free   memory space descriptions on on the server.  You can see it doesn't have any swap space,   but it has a gig of memory and has 800 MGs or 750  MGs free, so that has a lot of space available. Sometimes when I'm diagnosing a problem I might  run this against a set of servers just to see,   is one of them overloaded, is one of them  having some processes that are that are locked,   that kind of thing. You can also—a lot of  times I run a command like “date” against   a set of servers, because sometimes  you notice one is doing weird things,   and probably half the time it's due to  either DNS being the problem—as they say on,   you know, Guinness, “it can't be  DNS, it's never DNS. It was DNS.” Same thing with dates. If the date gets out  of sync on your servers, sometimes you can   have weird problems with databases and other  applications. That's happened in the past for   me. Then you have to figure out why that server’s  not connecting to NTP, that kind of thing. So you can run commands using Ansible that way,  and at this point we're able to basically run   any command that we want, and you might notice  too that I—in this first command I used “-m   ping” and I didn't have any “-a” argument. “-m”  tells Ansible what module to use and “-a” gives   arguments for the module. If you don't pass any  module than Ansible defaults to “-m command”,   which is the command module that  runs a command on the server. But there’s—Ansible, as I said,  it has thousands of modules,   and you can use any module that you want on  the command line like this using ad-hoc tasks. What is in the example file again? Examples is a  variable? Oh, yeah, I'll clarify that here. So in   this command, the first thing is Ansible, you're  calling Ansible to run run a task on a host,   or on a set of hosts. “Example” here  refers to the group in your inventory,   so that's “example” here. I could also specify  this server in particular instead of example,   but I'm just saying whatever servers are in  the example group run this command on all   those servers. This is the argument passed  to the command module that's the default if   you don't specify a module, and use CentOS to  connect. And then Ansible will use whatever   settings are in my SSH config and use any  keys that are in my SSH keychain locally. So that is that, and we've hit the end of  chapter one, and it's good timing too! I   was hoping we'd be able to get through Chapter  2 today, and it looks like we will be able to. And [viewer] is saying “You haven't  passed the -m module”, and like I said,   the main thing is you can pass—I could pass “-m  command” here, but the point is that Ansible   defaults to the command module if you don't  pass a module, so if I do this, this will run   the exact same thing as the above command,  because it defaults to the command module. Of course it's being a little slower,  probably because it's getting later in   the stream and my CPU is starting to  fall over and die, so let's move on! In chapter 2 I start talking about ways that  you can develop infrastructure locally without   doing it in the cloud. A lot of times, like if  I'm working on an airplane or something, I'll   be able to do this stuff, and you can work very  fast unless you need to download things over the   Internet. You probably shouldn't be on airplanes  right now anyway, so I shouldn't talk about that   example. But if you're in a local environment,  you can do things a lot faster a lot of times   than working through the cloud and interacting  with servers that are farther from your computer. So I usually use Vagrant to build virtual machines  locally. It’s interesting, a lot of people earlier   on in the kind of revolution of configuration  management, a lot of people still would not   have necessarily, like, a development set of  servers that they would work on when they're   automating them, and then production. They  would work on some automation in production,   or they would work on a new server automating it,  and then they'd kind of like, let it sit there   and be very careful with it. So you're still  working with snowflake servers in that case. I like to always start by building a local  virtual machine or a local Docker container,   and then I start automating inside  of it. Once I'm done with that,   I delete everything and then I start it up  again and make sure that everything's the same,   and then I keep doing that, and whenever I come  back to a project I can quickly come back to it. Vagrant is extremely helpful for that. Vagrant’s  a little bit of an older tool, but it's still   extremely useful for building local virtual  machines and building in the automation workflow   to test them and make sure they're working. And  then it can also work with cloud machines too. [viewer], sorry if I'm butchering your name there,  is also mentioning [that] for networks you use   “-k” so that you can use passwords. There  are a lot of cases where you can't use SSH,   and in those cases, yeah, you do need  to use different command line flags to   be able to send in a password. You can  also use a password file on your system,   so that Ansible doesn't need to ask you  for a password so it's still automatable. [viewer] mentions, from what I was  mentioning with the airplane, “Stay home,   WFH, wash your hands”. Yes, make sure that  we work to get rid of this crazy coronavirus! For anybody watching this video in the next  decade, it probably won't be relevant in a   few years, but still, if you really  want to live relive the old days,   this video was made in the midst of one  of the most crazy timelines of my life,   with all this coronavirus stuff going  on. The first sign of how serious that   was getting was when I was noticing what was  going on in China, and then I also saw the   they canceled ALL of the professional sports in  America, things were starting to get serious. And now it's kind of sad, there's a lot  of people having their lives affected   in very bad ways for various reasons and  various things, not just the virus itself,   so I pray for them. As I mentioned  in an earlier video, I'm a Catholic,   so I'm gonna pray for you whether you like it or  not. But anyway, hopefully things will get better,   and I mean things WILL get better, but hopefully  that happens soon and doesn't have too much of a   human toll on it. But that's part of the reason  I'm doing this video! So let's move along. I also use Vagrant most of the time  with VirtualBox. There's actually   different ways to use Vagrant, you  can use it with Amazon EC2 instances,   you can use it with Docker, you  can use it with, what is it,   there's a lot of different virtualization tools  out there. VMware Fusion on your local machine. But I use it with VirtualBox, mostly because  VirtualBox is easy to get on Windows, Mac,   or Linux. Even if it's not necessarily the most  optimal on Linux, versus some other solutions   it works really well, and there's tons and tons  of what Vagrant calls “base boxes” available.   There's base boxes for every known operating  system that I've ever seen, and there's lots   of different ones that you can download from  the community, and you can build your own. We're not going to work on building our own  base box right now, but I actually maintain   a bunch and use a lot of them in this book  for like things like CentOS 7, CentOS 8,   CentOS 6, even, I still maintain one for  that. Debian 8, 9, and 10, Ubuntu 16,   18, and now 24—whatever system that you  want to use in your production servers,   chances are there's a base box available  for it that you can use without much work. To get started with Vagrant, you  can download it from vagrantup.com,   or if you use a package manager like Homebrew  on Mac you can do “brew install vagrant”.   Then you also need VirtualBox, which  you can download from virtualbox.org. I already have those downloaded and installed,  because they're a little bit bigger and take   a little longer to install. I didn't want  to spend time just sitting watching them   install on this stream. But VirtualBox and  Vagrant are both updated pretty regularly,   so you want to make sure you always  have the latest versions of both,   because sometimes like when a new version of  Mac OS or a new version of Windows comes out,   things can break, and if you're on an older  version you're gonna have a painful experience. So once you have those downloaded and  installed—I’ll just run “vagrant --version”   to make sure it's installed, it's version 2.2.7,  which is the latest version—you can start using   them to build local virtual machines. I'll go  ahead and close that window out. I'm gonna close   this, and for the first server that we're gonna  do I'm just going to create a quick CentOS 7 VM. I'm going to make that in a new directory, so make  that “chapter2” because that's where we are right   now, Chapter 2, and what I'm gonna do is I'm  going to run the command “vagrant” in it, which   creates a new Vagrant environment using what's  called a Vagrant file. The Vagrant file tells   Vagrant about what kind of environment you want,  how you want it to be set up, how you want its   networking to be set up, all that kind of stuff,  but we're just going to use the defaults for now. So I'm going to say “vagrant  init geerlingguy/centos7” and   it's going to create a Vagrant file.  I'm going to close this chapter window,   and I can close that, I don't need it  anymore, and I'm gonna open this folder,   and you can see the Vagrant file it  just created, which is right here. And vagrant files are in Ruby. You don't really  have to know Ruby to be able to work with them,   but if you want to do a lot of powerful things  you might need to know a little bit of Ruby   syntax. But at it's very basic level, the Vagrant  file tells Vagrant what box to use—in this case,   CentOS7, and you can find more boxes by  going to this URL, vagrantcloud.com/search,   and of course since I closed that browser  window it went to my other screen. Like I said, you can find boxes for pretty  much any OS that you could ever imagine,   so if we wanted to use Ubuntu 20.4 which is  not yet release but will be extremely soon,   you can find that. Here's my box that I  just released a couple days ago. So you   can use any kind of box that you want  in your local environments. I'm gonna   use CentOS 7 just because it's stable and will  probably still be working in three four years,   since CentOS and Red Hat versions  are supported practically forever. And that's all it has in this file. It just says  that this is the box to use. So once I have that,   I can run the command “vagrant up” and that's  going to download the box if you don't have it   on your computer already. I think I already  have this box on my computer, so it doesn't   have to redownload it, and then it's gonna start a  VirtualBox machine with that with that VM running. While it's doing that I'm  gonna glance at the chat,   because I noticed somebody's  putting some new things in here. “Default file/directory structure to your  Ansible project code” I will get into that,   not in this video, but as we get into  playbooks I'm gonna start talking about   that. But at a very basic level I usually  have an inventory file and a main playbook,   usually called main.yaml, and then a readme  file that has all the information about how   to use the project and what it's for, and if you  have roles and collections and things like that,   those will all be in there too. But I'll get  into that as we get further into the book. “IoT-devices”—there are ways to do it, you  can use Ansible with any kind of connection.   If your computer can connect to another  device, no matter what transport it is,   chances are there's already a module or plugin for  Ansible to be able to connect to it, a connection   plug-in. But if there's not, you could write one  depending on if it's something that—basically,   if your computer can communicate with it, Ansible  could be made to communicate with it. However,   you might also need to be able to run commands on  it in a different way than just using Python, so,   you know, we can can talk about that later. You  might want to pop that onto a mailing list and   see what other people are thinking, because people  do use Ansible for Internet of Things quite a bit. “Playbook to see VMs and see what things  don't have space”…one thing is that…Ansible   is not necessarily tool for monitoring, but  if you wanted to check on which devices don't   have much space you could use those ad hoc  commands. You can put an inventory file out,   or—we'll get into this later, again—have a dynamic  inventory that pulls all the information out of   your your hosting system or like EC2 or vCenter,  and then it would look at all those servers and   run that command and give you the output. But  we'll get into more advanced inventories later. Anything else…”If you can script you can do it  with Ansible”, that's basically what I said,   yeah. If your computer can do it already,  chances are there's already something for   Ansible to do that that you just need to install,  or it might already be built in to Anssible. You   can do inventory via other mechanisms.  I’m just showing the INI style method,   which is not truly INI, but it's very  much like INI. You can also use yaml,   and there's other ways to do it too, and  there's plugins to interact with EC2 and   DigitalOcean and all these different posting  providers out there, Azure and Google Cloud. Someone asked “What does sublime do”—or  “What does ‘subl .’ do?” On the Mac,   “open .” opens the file in the finder wherever  you are in the terminal, so I use that a lot if   I need to get into here and find out what's  in there. And then Sublime has a shortcut,   Sublime Text, that's my editor that I use,  as a shortcut to open the folder in Sublime.   So here's here's this directory. If I say  “ls”, you can see there's the Vagrant file. Anything else? Yeah and again, if you want  the book, it's free. I forgot to mention   that it shows up with what the default price  is, and if you want to grab it for free just   drag the slider—and you need to have JavaScript  enabled, I know this audience probably has a   number of people that don't have JavaScript  enabled in their browser, you live with the   pain just so that you can you can protect the  privacy in your CPU a little bit more!—anyway,   you have to have JavaScript enabled, and  then you can drag the slider over to zero. I think that's all the questions that I saw really  quick. I'll also try to go back and make sure that   I answer anything I missed, but we have a VM  running now, and if I run “vagrant ssh” that's   a shortcut that that Vagrant uses to let me SSH  into the VM that I just set up. By default it   sets up a host-only network, so you can connect  to it but other computers outside your computer   can't see this VM, and this connects me to SSH.  If I want to also see how to connect to it,   if I wanted to just use SSH itself, I  can say “vagrant ssh config” and that's   going to give me some information about how  how to connect to that VM from elsewhere. It basically gives you the the different  instructions. I could put this in my SSH   config file to be able to connect just  by SSHing to the server name. Actually,   by default it doesn't set up, I guess, a  virtual private network on an interface   like 192.-something, or I think on  my network it's 100.0.10.-whatever,   it's a local private network. It doesn't do that  by default, so you have to tell it to do that. But anyway, so now I can I can also do  things like “vagrant halt” shuts down the VM,   “vagrant destroy” deletes the  VM, all these different things. The next step that I'm gonna do though  is I'm gonna say I want to use Ansible   with this Vagrant VM, because I want to  start doing some development. I want to   develop a playbook that works on a CentOS  7 server, and I'm gonna use Vagrant to run   that playbook. Vagrant lets me—without having  to configure all this and an Ansible inventory,   I can just tell Vagrant “Hey, I  have this playbook, I want you to   run this playbook on the server”, and  it takes care of those details for me. And to do that, I just go in the Vagrant file—I’m  gonna clear out all the extra comments that we   don't need, just to make this this Vagrant file  a little simpler, and all I need to do is put in   a little configuration, “config.vm.provision”  is a provisioner for Vagrant. You can actually   use a lot of different provisioners. You  can use a shell script provisioner, Chef,   Puppet, Ansible. There's other ones too,  but I'm going to use Ansible for this one. “do [ansible]”…and then I'm going  to say the Ansible playbook to use   is “playbook.yaml”. And now you might be  wondering “Where is this playbook.yaml?” Well,   we haven't created it yet! So I'll go ahead and  do that. I'll do it here, “touch playbook.yaml”,   and in the playbook I'm gonna make a  really simple Ansible playbook. We’ll   get deeper into playbooks later, but for now  I'm basically going to tell Ansible what to do. It's the same thing as running Ansible commands,  ad hoc commands, individually on the command line,   but I'm going to describe them in a format that  Ansible can run them one by one in sequence. First I'm going to say the host that I want  Ansible to operate on are all the hosts that’s   available, and Vagrant will intelligently tell  Ansible about all the hosts that are available,   which in this case is just this  one host that it's connecting to. I'm going to say “become: yes”, and I'll  describe why I'm doing this in a minute,   and I'm gonna give Ansible a list of  tasks. The first one is, these servers   might be used for database or something, so  I want to make sure the time is synchronized,   so I'm going to say “Ensure NTP  is installed.”, and I'm gonna say,   I’m gonna use Ansible’s yum module, and I'll  talk about how this all works in a minute. “name=NTP state=present”, and somebody I'm sure  is gonna mention the fact that CentOS 7 uses   chronyd by default, we can talk about that  later. And I'm also going to make sure that   “Ensure NTP is running.”, it's not very useful if  it's not actually running and synchronizing time.   I'm gonna say “service: name=ntpd state=started  enabled=yes”, and I'll get into that in a minute. So I have this playbook, which I'll describe  in a second, and Vagrant can actually run this   playbook against the server by running “vagrant  provision”, and when you do this it's gonna run   any provisioners you have defined in the  Vagrant file, which, I didn't save this   Vagrant file so it's probably not actually  gonna run that. Let's see what it does. Yeah, it didn't do it because I haven't actually  saved the Vagrant file, so I'll try this again.   So Vagrant provision’s gonna pick up the fact that  I want to run this Ansible playbook, and then it's   gonna grab this Ansible playbook and kind of put  all the right things together for Ansible to run   it, and of course it's gonna throw out this little  compatibility mode warning, don't worry about that   if you ever see it using Vagrant. I actually have  an issue in, hopefully that will be removed soon. But it's going to run these these two tasks  against the server, and this playbook—we’ll   get a little bit more into playbooks in probably  the next video, because we're running up on time   at this point, but the playbook is basically  saying, this is a play. Ansible playbooks have   a list of plays. This is one play, that starts  with this list item, and the play has to tell   Ansible what hosts it wants to operate on. In  this case it's all ,or we could put 127.0.0.1   because that's the host that it’s operating on,  if we just wanted this play to affect one host. I also use “become” because this task, the yum  task that's installing NTP, needs to be sudo, or   it needs to be the root user. The basic user that  that Vagrant uses in its system is called vagrant,   and it doesn't have the rights to install packages  and make changes that the root user needs to do. So “become” says “Run this playbook as sudo”  or becoming the sudo user, whoever that is,   and by default it uses sudo. There's actually  other ways to elevate your privileges in other   systems, so Ansible has plug-ins for that too.  Then once it connects and becomes the root user,   it runs this task, which uses Ansible’s yum  module. The yum module manages packages,   and you pass it a name of one or more  packages to install, and then you pass   it “state=present”. I could also uninstall  the package using “state=absent”, and you can   also upgrade modules using “statement=latest”,  we'll get into that later. And then it runs the   second task—let's see…well that's annoying.  I thought this worked earlier…service name… That is kind of strange. I wonder if something's  different with the version of Ansible I have   installed today, because I've been installing and  reinstalling Ansible a bunch. But anyway, this   task uses the service module Ansible’s service  module, which translates behind the scenes—or   it's supposed to translate behind the scenes, this  looks like someone's going wrong!—that I want the   ntpd service started. So I want it to be running  right now, and I want to enable it…is it enabled?   Yeah, that's the problem, I had a typo in my  playbook, and sometimes—this is one complaint that   sometimes you'll get with starting out in Ansible,  the error messages are not necessarily that good   sometimes and you might end up realizing later  on that you actually had a typo in your playbook. But anyway, this task uses Ansible’s  service module to behind the scenes see   if it's running with sysvinit or systemd  or whatever service manager there is,   and it makes sure that the service is running  and makes sure that it's also enabled. Now something I haven't mentioned yet  but is going to be very important in   our Ansible journey is idempotence. I think  that's how you say the word, and it's not   really in a lot of dictionaries, but the idea  of idempotence, or something being idempotent,   is you can run it once or a thousand times and  it won't effect a change after that first time   that it makes all the changes. So you could  see this first time that I ran it up here,   it showed that this task resulted in a change,  and then in the output below it says there was   one thing changed and there's also something that  failed unfortunately, and it failed again here,   but the second time it didn't report a  change, because NTP was already installed. So Ansible checks, “Hey, is it already installed?  Yes, okay, I don't need to do anything”,   and it reports no changes. So this third one,  it actually—since I fixed my typo, it shows that   something did change, but it still says that this  has not changed. So if I run this again, since I'm   using Ansible’s modules that are intelligent  enough to know when to make changes and to   not make changes, this time it should report no  changes and it should say that everything is okay. There's three, three okay tasks, no changes,  nothing failed, assuming that nothing fails   with with this VM right now—you can look up  here and see my CPUs are all kind of working   like crazy right now. Whenever you're running  a bunch of VMs locally and doing a live stream,   it's not very good for an old laptop. But you  can see that it says that nothing's changed,   and this is very helpful because later on  we'll talk about using Ansible for CI and CD. You can actually have play books like  this that are run on a CHRON timer,   like run it every day or run it every hour or run  it every week, and you can verify things. They can   can verify that nobody's accidentally changed  configurations because Ansible will say “Hey,   this changed”. You can flag that in  your CI store in Ansible Tower and   say “We need to check on the server because  something's happened to it that's outside   of our automation”, that's something  that's very useful to be able to do. Similarly—and this is way later on—Ansible  operators can also use this principle in a   Kubernetes cluster, running your applications to  check on them and make sure that they're healthy   in tandem with Kubernetes, and you can do  some extra special checks for that too. So idempotence is important, and that's one   reason it's good to always use  Ansible modules when you can,   because that way you're able to rely on the fact  that Ansible can track changes on your systems. Somebody also popped in to the live chat  the actual definition of idempotence,   and I think I actually have that somewhere in  the book—I think it's earlier in the preface   or something. But you can go back  and find where that is if you want. Let's see. So going through the playbook in the  book, I mentioned a few other things…there's   also another word on idempotence. So you know  you could, in Ansible, if you wanted to run a   command you can just say “command: yum install -y  NTP”. This would be the equivalent of the above,   but only for the first time. The problem is if  I go up here and I run this playbook again, it's   going to run this second task, and it's going to  say it changed, because every time you run this,   Ansible or whatever other system doesn't  know whether or not a change happened here. It probably didn't if NTP was already installed,  but it doesn't know that. Yaml’s not intelligent   enough to to output something that says  “This changed vs. didn't change anything”. So, if you wanted to make this idempotent  you can actually use Ansible’s shell module,   and in yaml this little bar here means  everything after it should be on different lines,   and you can actually inline a shell  script in Ansible. So I could write,   basically check if if this is actually  installed yet. “-qa | grep -qw ntp;   then” “yum install -y ntp”. I could actually  inline the shell script and use the output here   to be able to determine if this changed or not,  but you know this is kind of obtuse syntax and   it's not immediately obvious unless you're like,  a shell script guru what this is actually doing,   vs. saying “Hey I just, I want to make  sure that this package is installed”. So that's one thing with playbooks that's nice  about using Ansible’s modules, and I have an   example in the book of turning this into an  idempotent bash script, but that is actually   like eight lines long, and it's not very—it's just  really annoying to do it that way all the time. Until I learned about Ansible, I was actually  doing this. I had a lot of shell scripts, they   were somewhat itempotent because I liked being  able to run them multiple times on my servers,   but being able to maintain that, it was really  hard. Ansible takes that effort and puts it into   Python modules that are pretty well tested  and maintained, and you can kind of offload   all that and abstract it into these statements  which in my opinion are a lot easier to use. And   if you're somebody who likes having fewer lines  of code, you can even take out these comments. I can take out the name comments here, and this is  also the exact same equivalent playbook. I could   run it the same way and it would work the same.  But Ansible itself in the documentation says this   many times, and I believe it—it’s best have the  documentation in your playbooks and in your code.   So Ansible lets you name anything including place,  so I can say “name: Ensure NTP is installed.”,   and now it's obvious what the intent of this  particular task is, because it has a name. The other nice thing is, if you don't  have a name, it just says “TASK [yum]”,   and you're like “Okay, I don't know  what that is”. You could get verbosity   and see exactly what's happening, but  if I have a name for it and I run it,   it says “TASK” and then it has the name of  it up here, “[Ensure NTP is installed.]”. So it's better for the output, it's better  for the documentation in line with the code,   and you can also name plays  like this. I could say “name:   Setup NDP on all servers.”, and now  my play is going to be named as well. So right now we're going to be dealing  mostly with playbooks with one play in them,   and that's what most play books will be,  probably, but sometimes you'll have multiple   plays in a play book, and it's good to name them  too. Let's see, there's a few more things here… [viewer] asks, “How can I help  keep the lights on?” Yeah,   I mean definitely if you're buying the  book and you can pay for it and all that,   that's great, that would be awesome. There's  actually other ways to help—and since it's 11   o'clock and since I finished this task, here,  the last thing that I'll do here is “vagrant   destroy” because I don't want to have this  VM running on my computer this whole time. But we have a playbook running. Next week  we'll get into a little bit more advanced   usage of ad hoc commands, and we'll  get into play books a little bit more,   get a lot deeper than this really simple example. But to that question about “How can I help,  how can I make sure that these streams keep   going on even if I end up in some weird  situation”, you can actually sponsor me. GitHub sponsors…yes…somewhere here… You  can sponsor me on GitHub if you want,   that would be really awesome to see. I have  some sponsors there, they're very helpful   in helping with all my open source work. In  addition to this video series and the books,   I maintain 200 or so projects on  GitHub, and I'd love to keep doing that,   and the more sponsors I have, the  more time I can devote to that. You can also support me on Patreon. Another  thing is, below me there's a subscribe button   on YouTube—if you subscribe on YouTube that  actually helps a little bit with with my ability   to get a little bit of ad revenue. It's like  a few pennies per video, but anything counts,   you know? And there's also a notification  button if you want to get notifications.   I hate notifications, I don't recommend it, but  you know, if you like notifications, you do you! And you can also hit the like button on this  video, I guess! there's my YouTuber spiel,   I guess. But you know, I would say at this point  I am I'm doing okay, and I hope you are too. The   main reason I put out the book for free and I'm  doing this video series is because I want to help   people that aren't doing so well, and I hope that,  you know, if that's if that's you please feel free   to take advantage of whatever you can for free  at this point. And you know, if someday you can   pay it forward, that's great! If not, you know, I  hope that you are in a better place in the future! “How can you get the physical book?”, someone  asks. If you go to ansiblefordevops.com,   you can buy it on Amazon—so there's three  places I publish, Amazon, Leanpub, and iTunes,   and on Leanpub and iTunes you can get book  updates a little easier, but if you want the   paperback it's available on Amazon and should be  able to ship pretty quickly still. It's saying   that you can still deliver by April 24. I know  some books take longer to ship, but somehow my   book has missed that cut, and you can get it  in a couple days in most parts of the world. Any other questions or notes here?  Someone's asking about editors and   things. I'm using Sublime Text, and it  has built-in yaml support. It has a lot   of different languages. It also  has Jinja, too, which is nice,   I will get into that later on in the series, which  is the templating language that Ansible uses. But Vscode has has good support for Ansible and  yaml and things, and so does Vim, and some other   tools, basically any editor does yaml files these  days, and that's that's most of what Ansible does. Anything else, let's see…”Thank you”, and  yeah! And also alternate days—so [user]   asks if—and again, sorry if I butcher your name,   I’m one of the worst people at reading  people's names probably in the world,   so it's no offense to you—but can I do alternate  days? I’m gonna plan on doing these on Wednesdays,   but i'm gonna make sure that I record all of them.  This will be available on the YouTube channel   within minutes after I finish the recording, and  i'm gonna make sure that they're all up there,   and I’m going to put them all together in a  blog post so that you can refer back to them. So please feel free to look back at these  videos, and hopefully you like it. And again,   if you liked the video, you can hit the like  button, whatever, but definitely do hit Subscribe   if you're interested in this series. I’m gonna  get a lot deeper into Ansible as time goes on,   thank you very much, and right at the  end someone asks “Terraform vs. Ansible?” We will probably get into that as well, but that  is not something for a day one intro topic. But   thank you everyone for being on this stream,  and for watching if you're not watching the live   stream, and hopefully you guys are doing well! As  i said earlier this is a crazy time in our world,   definitely try to reach out to each other  and help. Be a friend to people who might   not have someone at their at their residence  who who's with them and keeping them company,   even if they do—you know a lot of us, if we have  kids they can kind of drive us insane, so it's   nice to be able to talk to somebody who has the  ability to have logic and reasoning. So reach   out to your friends and co-workers during this  time, and please stay safe and wash your hands,   avoid getting near other people! Let's conquer  this crazy virus as soon as possible. Thanks!
Info
Channel: Jeff Geerling
Views: 200,873
Rating: 4.9728756 out of 5
Keywords: drupal, drupal 8, migrate, migration, drupal 7, upgrade, github actions, github, php, docker
Id: goclfp6a2IQ
Channel Id: undefined
Length: 63min 42sec (3822 seconds)
Published: Wed Mar 25 2020
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.