Showing posts with label Puppet. Show all posts
Showing posts with label Puppet. Show all posts

Saturday, 16 September 2017

Puppet Part Three: In Which I Write My First Module

In my previous post I wrote a manifest for stark that removed specific groups/users and added specific groups/users. This allowed me to do some user standardisation on stark (if this doesn't make sense to you, please read my previous post, Puppet Part Two). On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole it's pretty nifty, right? I mean, I could copy and paste cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user/group stuff from stark's manifest into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 manifests for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r systems and have my user needs satisfied...but is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best way?

Modules: A Quick Overview


There are _a lot_ of things to say about modules and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Puppet documentation on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m is here:


The short, short version is that modules let you write something one time and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n use it in lots of places. Modules are made up of classes and a class, ideally, should do one thing (object-oriented programming is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 programmer's derivative of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Unix philosophy?). For example, you may have a module called 'ssh' - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n that module may have one class for installing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SSH server package, anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r class to configure sshd_config and anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r class to configure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system ssh_config.

Using my scenario above, I have a group of accounts that I want to exist on my servers. Instead of creating those accounts in every manifest I have, I can write a module that does account-y stuff and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n add that one module to each server's manifest. Then when I need to delete an account I can do it one time, in my module, and as my servers check in, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y'll get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new configuration and remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 account. Write once, use lots of places, problem solved!

One quick note: remember, I'm a Puppet noob. I've written very basic modules to do user-y and basic administration-y type stuff. I've not written modules to do more complex things. That's okay, we're learning (more or less) togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Puppet folks on Twitter (@puppetize) are phenomenally supportive.  Their documentation covers doing interesting things, I'm just covering getting started. I may do some more complex things in several months but for now, I'm relying mostly on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 work of ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs and I'm keeping MY work fairly simple.

With that said, let's write a module that does some basic administration-y type things that allow for standardisation of some system services.

The Layout


There are some requirements for Puppet to use a module. It needs to be in a directory that is designated for modules in Puppet's configuration. On Ubuntu, by default, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se are:

/etc/puppetlabs/code/modules
/etc/puppetlabs/code/environments/production/modules

This is configurable but that configuration is outside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scope of this post. Maybe later, if I dive into multiple environments or custom paths for multiple maintainers.

A module itself needs a few things to work. At a bare minimum, it needs:

o a metadata.json file that gives cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 module name, version, author, summary, license and some ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r information
o a manifests directory
o a manifests/init.pp file that has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initial class declaration; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initial class is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same name as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 module

I know, that last bullet may be a little confusing. It will make more sense when we take a look at one.

Three Choices


There are three ways to create a module. You can copy an existing module into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 appropriate directory and modify it to fit your needs but that can be a lot of work - it is worth it to have a template you can copy over for new modules if you're going to write several of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m but that may be unlikely.

The second option is to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'puppet module' command. This is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same way you install and remove 3rd party modules and it is an easy way to create cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initial directory structure, metadata file, init.pp file and basic documentation. Using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'puppet module' command also creates several more files and sub-directories built around cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 idea that you're going to share your module with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 world and do testing across multiple platforms. It is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most complete method available and everyone writing puppet modules should use it at least once.

The third option is to create cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 necessary directories and files yourself. This was my choice since it's not a lot of work, I'm not doing anything especially complex in my modules and I don't plan on sharing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m with anyone. By choosing this option I'm almost guaranteeing to do something in an incorrect way, do it manually at your own risk!

Create cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Module


Puppet lets you store modules pretty much anywhere on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filesystem you want to, provided you tell it where to find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. I like using /etc/puppetlabs/code/modules so that's where I'll create this one.

First I'll change to that directory:

cd /etc/puppetlabs/code/modules

Then I'll make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 directory structure and required files for my new module, "my_users". Ordinarily I would name using "camel case" or "stair-stepped case" - "myUsers" - but when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 puppet agent does a manifest lookup it would look for "myusers" and that would fail. I have several classes with an underscore in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 name now...

mkdir my_users
mkdir my_users/manifests
touch my_users/metadata.json
touch my_users/manifests/init.pp

Then I'll add cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'my_users/metadata.json' file:


Here is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 copy/paste version:

{
  "name": "test-my_users",
  "version": "0.0.1",
  "author": "my name",
  "summary": "User and group standardisation for my VMs",
  "license": "BSD 3-Clause",
  "source": "",
  "project_page": "",
  "issues_url": "",
  "dependencies": [
    { "name":"puppetlabs-stdlib", "version_requirement":">=1.0.0" }
  ],
  "data_provider": null
}

A few quick items. Notice I've named it "test-my_users". The name of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 module is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format -. I'm just using "test" because, well, this is a test after all! I've used "my name" as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 author but it doesn't matter which name you use here. I like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 3-Clause BSD licence, also known as BSD 2.0, so that's what I'm using - it basically says use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 module however you want but do so at your own risk, I'm not liable if it destroys your data centre, just using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 module doesn't mean you'll get support, I'm not endorsing your product and, if you use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 module in your product, you have to say you're using it. Read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 licences that are out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're important.

Right now I just want to get a module that loads so I'm going to use a very basic my_users/init.pp file. All I'm putting in it is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initial class declaration:


At this point it doesn't do anything but it's a good time to see if I can use it with a manifest.

Include and Require


There are two ways to make sure a manifest uses a module or class - eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r by using "include" or by using "require". These have two very different meanings!

"include" tells puppet to make sure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of a class are included when it generates cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list of things for an agent to do. You could, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ory, include ten different classes that all include each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r and puppet can sort that out. Using "include" does not put any specific constraints on ordering - it lets puppet sort all of that out.

"require" tells puppet to make sure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of a class are included *in a specific order". If puppet sees a "require" statement, it will make sure everything that is part of that "require" statement is done before continuing. That is great if you need to have things happen in a certain order, ensure specific files exist before starting a service, etc., but in general it can lead to some serious management headaches. I will use "include" unless I absolutely need to use a "require".

Using a Module or Class in a Manifest


I know that baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on, my actual puppet server, is set to be managed by puppet because I configured it that way in my Puppet Part One post - if you read that post, though, you'll see it has an empty manifest. All cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 manifest contains is:

node baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on { }

(reminder: I put that file at /etc/puppetlabs/code/environments/production/manifests/baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on.pp)

To use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'my_users' module, I need to add a single line to baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on's manifest file. After editing, it will look like this:


For copy/paste, that is:

node baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on {
  include my_users
}

This tells puppet to look in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 module directories and use/include cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 class named 'my_users'. I also could have used:

node baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on {
  require Class['my_users']
}

Again, I don't have a specific need to use "require" so I'm using "include".

The Test...


Now that I've told puppet to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "my_users" module, I need to test it. I can do that with:

sudo /opt/puppet/bin/puppet agent --test

If everything is good, it should compile cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 catalogue and return me to a prompt:


Success! Now I'm ready to make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 module do something useful.

Make my_users Useful


A module is made of classes and classes do one thing. Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same thing as a system's manifest! Since I have already written cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code/configuration necessary to do user stuff in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stark.pp manifest, I'm going to copy it into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 my_users class:


Then I'm going to test it with "puppet agent --test":


Oh no, something went wrong! ... or did it? Remember, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem I'm trying to solve from Puppet Part Two is that I have Ubuntu systems with a user named 'test' and CentOS systems with a user named 'demo'. My goal is to remove those users and add one named 'secops'. Since I'm logged in as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'test' user, it's going to fail on deleting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'test' user and group. I have two choices - I can eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r logout and wait ten minutes (because I have puppet configured to run every ten minutes) or I can just reboot cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 machine. I'm going to reboot...

With cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM rebooted, I'm going to see if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'test' user still exists:


Notice cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'Login incorrect' - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system did remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'test' user! But am I locked out?


No, I'm not! Success!

Just because you can use puppet to manage itself doesn't mean that's always a good idea. Weigh cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cost/benefit before doing this. I like this example because it shows how quickly and easily you can lock yourself out of your management server. BE CAREFUL!

Wrapping Up


Now that I have a class for user management, I can start to simplify management. First, I can edit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 manifest for stark and cut out everything I have in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re -- and replace it with an include for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 my_users module, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same way I did for baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on. I can add cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same include statement to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 manifests for lannister and bolton. By using modules/classes, I can write one time and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n include it everywhere I want to have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'secops' user with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'secopspass' password.

To go even furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, if I need to change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'secops' user on all of my systems, add a different user, add an SSH key or more, I only need to edit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 my_users class and that change propagates to all systems that use it. That is MUCH more efficient (and reliable!) than having that functionality in each server's manifest and editing possibly hundreds or thousands of files just to make one small change.

As I pointed out in a previous post, Puppet is not alone in this functionality. SCCM, ansible, chef and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs are all capable and each brings cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own strengths/weaknesses to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 table. Each one deserves a close look and consideration, even in smaller environments.

Saturday, 29 July 2017

Puppet Part Two: Groups, Users and Simple Manifests

In my first Puppet post I went through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 setup process on both cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Ubuntu and CentOS Linux distributions. That post ended with four VMs:

o baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Puppet server
o stark, running Ubuntu
o bolton, running CentOS
o lannister, running CentOS

My previous post ended with all four systems polling baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Puppet server is configured to manage itself) but nothing was actually managed by it. Two of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VMs, baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on and stark, have a group and user named 'test'. The ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r two, bolton and lannister, have a group and user named 'demo'. In this post I want to:

o remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'demo' user
o remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'demo' group
o remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'test' user
o remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'test' group
o standardise with a 'secops' group
o standardise with a 'secops' user
o make sure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'secops' user's home directory is created
o make sure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'secops' user is in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sudo group
o set an initial password for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'secops' user
o set a password expiration of ninety days for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'secops' user

All of this can be done using Puppet's built-in features.

Users, Groups and Resource Types


Puppet has what it calls "resource types", built-ins for basic system functions. Tonight I want to focus on two of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "group" and "user" types. If you want to read all about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Puppet documentation is racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r good:


I'm intentionally linking to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 4.10 documentation because that is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 version currently installed via pc1. They have a drop-down available for viewing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 documentation from ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r releases. You can install a newer version, 5.0, but none of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 3rd-party modules I've started using officially support 5 so I'm sticking with 4.10!

That's all well and good...but how does one use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m?

Adding a Group


I'm going to start with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 manifest for stark and adding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'secops' group. I'm adding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 group before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user because I want cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to be a member of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 group and if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 group doesn't exist, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user creation can fail.

I created stark's manifest (/etc/puppetlabs/code/environments/production/manifests/stark.pp) in my previous post but all I put in it was an empty definition, basically cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bare minimum for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Puppet agent to successfully "check in". I could start with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 manifest for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Puppet server, baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on, but I want to make sure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 configuration does what I want it to before I risk losing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only user I have on my Puppet server!

Right now, stark's manifest looks like this:

node stark { }

The basic format for adding a group is:

group { 'resource_title':
  ensure => present
}

This will make sure a group named 'resource_title' gets created. You can also remove a group with "ensure => absent". There is an option to explicitly name a group with "name => 'group'", ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise it is implied that you want to use 'resource_title' as your group name. The more I think about it, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more I like this functionality - it means you can do something like this:

group { 'add_special_group':
  name => 'special',
  ensure => present
}
group { 'remove_old_group':
  name => 'old_group',
  ensure => absent
}

With that said, to add a group called 'secops' with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'group' resource type, I can change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 manifest to look like this:

node stark {
  group {
    'secops':
      ensure => present
  }
}

Notice I moved cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "resource title" to a line by itself. That's a personal preference because I don't like having anything after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 opening brace - eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r way works.

Once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file is saved, that's it, that's all I have to do. The next time stark checks in with baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on, it will get its new manifest and will add a group named 'secops'. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 group already exists it won't do anything because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 requirement is already met. Since just waiting for stark to check in and update at its next interval is kind of boring, I'm going to force cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 check-in with 'puppet agent --test':



Now that I have a 'secops' group, I can add a 'secops' user who is a member of that group.

Adding a User


The syntax for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'user' type is identical to that for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'group' type (all Puppet resource types use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same syntax). For example, if I want to make sure a user named 'special_user' is present, I can do this:

user {
  'special_user':
    ensure => present
}

If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user doesn't exist, Puppet will add a user named 'special_user', a group named 'special_user' and create a home directory for that user. For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 average user that's exactly what I might want but what if I want a group named 'infosec' and accounts for 'analyst_0', 'analyst_1' and 'analyst_2' that are all members of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'infosec' and 'sudo' groups? Puppet can do that!

Building off cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above, to add my 'secops' user I will use:

user {
  'secops':
    ensure => present,
    gid => 'secops',
    groups => ["sudo"],
    managehome => true,
    password_max_age => '90',
    password => '$1$ekSmGk/O$ne219/isubq6Q26jE8CKa.'
  }

This does *a lot*. Let's step through it.

First, it makes sure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a user named 'secops'. Then it sets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 primary group for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to 'secops' and makes sure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 account is also a member of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'sudo' group. "sudo" doesn't need to be passed as an array because I'm only adding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to that one additional group but I'm doing it as an array anyway to show you can pass an array of groups. Even though Puppet defaults to managing whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r a home directory is created, I explicitly tell it to manage this user's home directory. On Linux, Solaris and AIX, Puppet can set a password expiration age so I'm setting that to 90 days. Finally, I'm providing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password hash for my user. Linux can use multiple hash types for passwords, from MD5 to SHA512, and in production I might use SHA512, but since I'm typing this password hash I'm going to use MD5. An easy way to get an acceptable hash is with 'openssl passwd -1', which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n prompts for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value to hash and uses MD5 to hash it (if you're curious, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password I hashed is 'secopspass'; if you want to crack that hash, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 salt is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second and third $ symbols).

The actual manifest and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results of forcing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 check-in look like this:



Notice how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user now shows up in /etc/passwd, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 groups 'secops' and 'sudo' and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have a home directory of '/home/secops'. Success!

Removing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Existing Users


Now that I have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user and group added that I want, I can set about removing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing users I no longer need. This is almost a copy-and-paste of something I wrote above. To remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'test' user, I can use:

user {
  'test':
    ensure => absent,
    managehome => true
}

I also want to remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 *group* named 'test', since that group only existed for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'test' user. This would look like:

group {
  'test':
    ensure => absent
}

Since I want to remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'demo' user from ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r systems, I'm going to go ahead and add a section for that as well. It won't do anything on stark but this is setup for my third post.

user {
  'test':
    ensure => absent,
    managehome => true
}
user {
  'demo':
    ensure => absent,
    managehome => true
}
group {
  'test':
    ensure => absent
}
group {
  'demo':
    ensure => absent
}

When cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Puppet agent on stark checks in, it will delete cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'test' user -- but that's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user I'm using! To avoid any issues, I've logged out as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'test' user and logged in with 'secops' (remember, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password is 'secopspass'). The manifest and results of forcing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 check-in look like this (so that I could get it in a screenshot, I've moved cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 resource titles to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same line as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 opening braces):



The user and group have been removed: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 account doesn't show up in /etc/passwd, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 group doesn't show up in /etc/group and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user's home directory is gone. I now have my 'standard' set of end-users and groups set on stark!

Wrapping Up


My goal was to show how to add and remove both users and groups with Puppet - we've achieved that. To add more users to stark I would just add more user sections. The same goes for groups - to add more, just add more sections.

That's _great_ for stark, but what about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r systems? It's a bit tedious to copy and paste all of that Puppet code into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 manifest for each system, isn't it? I'm only working with four servers so it isn't too terrible but imagine having to add a user to forty, four hundred or maybe even four *thousand* systems. Copying that code into each system's manifest would take longer than both writing AND RUNNING cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script to do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 work for you. That's where modules, roles and profiles come in and in my next post I'm going to cover how to create a profile for (and assign that profile to) all of my Linux servers so that when I need to change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password hash, add new users or change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 password age, I only have to edit one file and everything gets sorted as systems check in.

Friday, 14 July 2017

So...I thought I'd Jump Into Puppet (Puppet Part One)

A Quick Note


A lot of folks like to write about things cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y know very well and about which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can answer questions. Generally speaking I prefer to write about things that I can at least troubleshoot to *some degree*. The next few posts will not be any of those because I have no idea what I'm doing with puppet. I'm pretty excited!

The Test Environment


My environments are primarily Ubuntu Linux with a smattering of Windows Server 2012R2, Windows Server 2016 and CentOS. To keep things simple I'm going to stick with Ubuntu Server 16.04 and CentOS 7.

In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last year I have jumped really, really deep into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Elastic stack. I've seen demos for things that ultimately border on useless because  cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r a) assume your environment is very small or b) show you how to add '2 + 2' and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n expect you to make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 leap from that to differential equations. I'm not going to do that.

Instead, I want to go step by step (more or less) from four fresh Linux systems to a fully configured ELK + RabbitMQ stack, managed almost entirely via puppet. This entire ecosystem will look like this:

o Ubuntu Server 16.04.2 LTS for puppet named baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on
o Ubuntu Server 16.04.2 LTS for ELK named stark
o CentOS 7 for ElasticSearch named greyjoy (this will cluster with ES on stark)
o CentOS 7 for RabbitMQ named bolton

Each server will have one core, four gigabytes of RAM, twenty gigabytes of disk and four gigabytes of swap.

Note: All of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 documentation I've read expects your puppet server to be named 'puppet'. When cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 puppetserver package installs, it creates a certificate expecting its name to be 'puppet'. I think that makes sense, and I understand why it makes that assumption, but sometimes you can't have a host named puppet -- for example, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's a group at my organisation that has puppet., even though it's not used to manage systems organisation-wide. I think it's important to know how to deal with that.

The rest of this post is just cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 puppet installation and making sure each host can chat to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 puppet server.

Some Prep - Host Names and IPs


Remember, I said I was going to start with fresh Linux systems. I have two VMs running Ubuntu Server and two running CentOS. No additional software has been added yet.


Notice cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're all named after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 template I used to create cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. My first step is to login on all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir names in /etc/hostname and add an entry for all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to each host's /etc/hosts file (that step is unnecessary when DNS is configured as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y could look each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r up via DNS). There is one small caveat -- cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Puppet server always expects its name to be puppet so my _agents_ will be configured to use 'baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on' but I'm still adding 'puppet' to baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on's /etc/hosts file. It's weird, I know, but I'm still learning and I'm not sure how to deal with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server installation without doing that...and since it's local to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server itself, I'm not concerned with doing that. If I find out how to prevent that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n I'll update this post.

With that done, after a reboot it looks a little more interesting:


The next step is to add cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 puppet repo and install cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 appropriate server or agent package.

The Puppet Server


My puppet server, baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on, is running Ubuntu so I want to add cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 puppet apt repository for installation. Instead of trying to track down cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir GPG key, add it and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n add cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir repo, I can do it all with one .deb file available from puppet. The instructions are here:

https://apt.puppetlabs.com/README.txt

but I'm going to outline cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m anyway.

First, download cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 .deb file from apt.puppetlabs.com:

wget https://apt.puppetlabs.com/puppetlabs-release-pc1-xenial.deb

Then install it with:

sudo dpkg -i puppetlabs-release-pc1-xenial.deb

Remember, this adds cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 puppet apt repository to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system - but it doesn't update cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 apt cache. Do that with:

sudo apt update

Then install cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server with:

sudo apt install puppetserver

It will have quite a few dependencies. On my cable internet connection at home, this takes about five minutes to download and install.

The First Agent -- The Puppet Server


If you read that and you scratched your head, it's okay! Yes, I'm going to use Puppet *on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server* to manage some aspects of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 puppet server itself. That means baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on is both my server *and* my first agent - but not until I configure it that way.

The configuration file I care about is

/etc/puppetlabs/puppet/puppet.conf

The default file looks like this:


I want to add a few things. First, Puppet uses certificates for aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ntication and encryption of communication, and you can specify what you want cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 certificate name for a given host to be (don't worry, most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 certificate stuff is handled behind cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scenes). In my case, I want cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 certificate for each host to have that host's name -- so baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on's certificate will be named baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on. Next, I want to make sure my clients know that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Puppet server lives at baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on. Puppet has a notion of environments, so you can have one environment for 'test', one for 'quality_assurance', one for 'production', etc. The default environment is 'production' so I'm going to tell all of my systems to use that environment. Finally, I want all of my systems to check-in with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server every ten minutes.

To accomplish all of this, I'm going to add cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following to puppet.conf on baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on:


To ease copy/paste, I added cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se lines:

certname = baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on
server = baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on
environment = production
runinterval = 10m

I'm going to add that same block to all of my Puppet agents with one change -- "certname" will have a different value on each host. You can get more information on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 configuration options at:

https://docs.puppet.com/puppet/4.10/config_file_main.html

Now I'll exit and do a little housekeeping to make sure Puppet is configured to start on bootup and that it's running now. To make sure it's enabled at boot, I'll use:

sudo systemctl enable puppetserver

And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n I'll make sure it's running with:

sudo systemctl restart puppetserver

Be warned, it can take a few minutes for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 puppetserver process to start/restart, especially if you are running it on a VM with only one core! If you don't see any output from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 restart for a minute or two it's okay, just give it some more time.

Before I enrol my first agent, I want a way to test it. By default, Puppet looks in /etc/puppetlabs/code/environments/production/manifests to see if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are any files named .pp and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n it applies whatever it finds in those files based on numeric/alphabetical order. In my scenario I want to have a separate .pp file for each node so I will have four of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se - baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on.pp, stark.pp, lannister.pp, bolton.pp. The general layout of those files is:

node {
 
}

Again, is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 name of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client. The most basic manifest for baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on would look something like this:

node baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on { }

And you can see that here:


It just says "I have a node named baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on but I'm not going to tell it to do anything" - and that's okay! For this post we're just making sure everything is installed and can chat. This means I'm going to create cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following files:

/etc/puppetlabs/code/environments/production/manifests/baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on.pp
/etc/puppetlabs/code/environments/production/manifests/stark.pp
/etc/puppetlabs/code/environments/production/manifests/bolton.pp
/etc/puppetlabs/code/environments/production/manifests/lannister.pp

And all I'm going to put in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m are empty node declarations like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one above (but make sure to change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 name of each node inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 .pp files!!).

To make sure baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on can get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 manifest from itself, first I'm going to manually tell it to check in with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server and see if anything is waiting. To do that, I'll use:

sudo /opt/puppetlabs/bin/puppet agent --test

When I run it, I get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following:


Success! It successfully applied cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 catalogue. Now, if I want to make sure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 agent is started and running at boot, I can eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r use systemctl or I can use puppet itself:

sudo /opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true

When it runs, Puppet will give output in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same format as a manifest:


This is taken from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Puppet documentation at:

https://docs.puppet.com/puppet/4.6/services_agent_unix.html

More Agents


Now that my server is configured, I can install cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 agent on my remaining Ubuntu and CentOS systems. On stark I'll use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same .deb file I downloaded on baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on but instead of installing puppetserver I'm going to install puppet-agent. That means cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 instructions for all of my Ubuntu 16.04 agents will be:

wget https://apt.puppetlabs.com/puppetlabs-release-pc1-xenial.deb
sudo dpkg -i puppetlabs-release-pc1-xenial.deb
sudo apt update
sudo apt install puppet-agent

Then I'll edit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 puppet.conf file to look like:

[agent]
certname = stark
server = baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on
environment = production
runinterval = 10m

Notice cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two changes: instead of [master] I used [agent] and for certname I used 'stark' instead of 'baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on'. Now I need to make sure it can chat to baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on. I'll use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same "puppet agent --test" command I used on baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on:

sudo /opt/puppetlabs/bin/puppet agent --test

The output on an agent is a little different:


Since this is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first time this agent has checked in, Puppet will create an SSL certificate request on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server. On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server I can list any unsigned certificates with:

sudo /opt/puppetlabs/bin/puppet cert list

I'll have one waiting for stark so I'm going to go ahead and sign it with:

sudo /opt/puppetlabs/bin/puppet cert sign stark

If it succeeds cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n it will remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signing request on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server and I get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following:


Now I'm going to go back to stark and try to check-in again using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same "puppet agent --test" command:


Excellent! I now have a Puppet server running on baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on AND my first proper agent, stark, can poll for catalogues of activity to perform! Now I just need to make sure puppet starts on boot-up and that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 puppet agent is running as a service:

sudo systemctl enable puppet
sudo systemctl restart puppet

With that done, I can move on to my CentOS agents.

Even More Clients: CentOS


The steps for CentOS are very similar to those for Ubuntu; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 full instructions for both are available from Puppet at:

https://docs.puppet.com/puppet/4.10/install_linux.html

Still, I'm going to outline cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. Basically, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are:

o install cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pc1 package to setup cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 yum repo
o install cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 puppet-agent package
o edit puppet.conf
o run 'puppet agent test' to create cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CSR
o sign it on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server
o run cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 test again to make sure it works
o make sure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 agent is set to run at boot/is running with systemctl

Instead of signing each certificate, one for bolton and one for lannister, individually, I'm going to do everything to both of those VMs up until cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CSR is generated, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n I'm going to hop over to baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on and sign both CSRs with one command (this is what you would do if, for example, you had just spun up a cluster of servers and wanted to sign cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir CSRs at one time). Then I'll go back to working on each VM. Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're identical, I'm just going to write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 commands once.

First, to install cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pc1 package, you can eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r download it and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n install it (what I would do in production, so I had a known-good installation source) or you can tell yum to install it directly from Puppet. I did cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latter:

sudo rpm -ivh https://yum.puppet.com/puppetlabs-release-pc1-el-7.noarch.rpm

This yielded:


Then I installed puppet-agent with yum:

sudo yum install puppet-agent

Yum prompted to accept/install cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Puppet GPG keys. Since I didn't want to cut my post short here, I pressed 'y'!

When that completed, I edited puppet.conf with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proper agent section:

[agent]
certname = bolton
server = baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on
environment = production
runinterval = 10m

Then do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initial check-in/poll manually with 'puppet agent test':

sudo /opt/puppetlabs/bin/puppet agent --test

When I'd done that for bolton and lannister, I listed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 certificates on baracá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365on and saw both of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. To sign cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m both, I used:

sudo /opt/puppetlabs/bin/puppet cert sign --all

When I listed and signed both certs, it looked like this:


Then I went back to each VM and make sure 'puppet agent test' pulled cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 catalogue for that system:



It worked! Then to make sure puppet is enabled at boot and that it was running:

sudo systemctl enable puppet
sudo systemctl restart puppet

Fantastic, four VMs all ready to be managed by Puppet!

Wrapping Up Part One


Okay, between you and I, I know, I didn't do anything groundbreaking. I have a handful of VMs that are all checking in with a single Puppet server and not doing anything...but at this point that's okay. The goal was to step through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 installation and make sure that initial communication works and THAT goal has been accomplished.

So where to go from here?

Well, if you're Linux/Unix savvy, you may have noticed my Ubuntu VMs have a user named 'test' and my CentOS VMs have a user named 'demo'. That's a problem and in part two I want to look at how I can use each system's manifest file (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 .pp file) to make sure I have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same user on all four systems (and remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing 'test'/'demo' users). In part three I'll take a look at classes and in part four I'll use classes to install cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ELK stack and setup a RabbitMQ node.

Parallelising Python: What Happens When a Beginner Discovers Multiprocessing

Some of you will remember that I have a few scripts that can be used for incident response in G Suite environments, available at: https...