Puppet Needs To Use a Windows Network File Share: How Is This Done Consistently?

Problem Scenario:  You are using Puppet Master on Linux and Puppet Agent on Windows servers.  The manifest attempts to copy to or from a Windows network file share, but you are getting an error about the network path not existing.  The network file share has permissions that are open to Everyone.  What do you do?

Solution:  Puppet Agent will run PowerShell commands under the security context of the user who runs the "puppet agent -t -d" command.  If no one is logged in, the local system user will be the user whose security context is running the commands.  For the first time that the network file share is used from the Windows server, it is sometimes necessary to use a command like this: 

net use \\fileShareServer /USER:continual integration

Replace "fileShareServer" with the hostname of the file share.  Any username and any password will work because the file share is open to Everyone.  Note that there is no closing backslash after the fileShareServer name.  So the Puppet manifest should look like this:

...
command => 'net use \\\fileShareServer /USER:continual integration; echo "this is the manifest command" > \\\fileShareServer'
...

Three backslashes in a manifest on Linux will translate to two backslashes on a Windows server.  The main idea is that the "net use" command needs to run one time for initial use (and any credentials will suffice).

How Do You Control The Order Of When Puppet Manifests Are Applied to a Puppet Agent?

Problem scenario:  One Puppet manifest relies on another manifest to work.  Trying to apply them at the same time is not working.  The "require" and "before" keywords only seem to work for packages, exec, and file resources.  What do you do to order the manifests to satisfy dependency requirements of other manifests?

Solution:  The relationship dependency can be solved by the order in which they are applied.   The keyword "import" has been deprecated and made obsolete in many versions of Puppet.  The keyword "include" in the existing manifests (either one) will not solve the ordering problem.

The solution is to create a third module with its own manifest and call the existing manifests in the desired order from top to bottom with the "include" key word.  We'll call the module "continual" for this example.  Here is its manifest (init.pp):

continual {
   include integration
   include specialty
   }

The above manifest for the "continual" module will apply the "integration" manifest first.  The "integration" manifest is the init.pp file in the manifests directory of the module named "integration."   In the example above "specialty" is a Puppet module that requires "integration" to have been applied.  The "specialty" module will be applied after the "integration" module.

This solution is modular in that the original respective modules can be completely separate and unmodified.  This composite manifest applies the component manifests in the order to solve the dependency problems.

How Do You Use a Text-Based Web Browser on RedHat Linux?

Background:  Text-based browsers are fast.  Operations can be scriptable and repeatable.

Question:  How Do You Use a Text-Based Web Browser on RedHat Linux?

Prerequisites:  You have access to the Internet and root access.

Solution:  As root, enter these two commands (where "#" is the command prompt).

# yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
# yum -y install lynx

To test it out, run this:
lynx continualintegration.com

By default you will be prompted to accept cookies.  If privacy is a concern, this is a good thing.  Radio check buttons are toggled with the right arrow key.  This solution works on AWS instances of RedHat as long as you have access to the Internet.

Puppet IIS Module Troubleshooting

Update on 3/30/17:  The Puppet IIS module has been updated, and the problem below has been eliminated.

Problem scenario:  You want Puppet to install IIS.  You install the IIS module and find the README.md file has this Puppet DSL (as of 12/13/16):

class mywebsite {
  iis::manage_app_pool {'my_application_pool':
    enable_32_bit           => true,
    managed_runtime_version => 'v4.0',
  }
   iis::manage_site {'www.mysite.com':
    site_path     => 'C:\inetpub\wwwroot\mysite',
    site_id       => '10'
    port          => '80',
    ip_address    => '*',
    host_header   => 'www.mysite.com',
    app_pool      => 'my_application_pool'
  }
...

It is also found on https://forge.puppet.com/puppet/iis

Why is there no comma after site_id? 

Solution:  This appears to be a typo in the syntax.  Any line besides the last should have a comma after it.  The open source movement has numerous advantages.  However, sometimes the community has to keep after the discovery of errors to make things work.

How Do I Assign User Input from a Bash Script to a Variable?

Question
How Do I Assign User Input from a Bash Script to a Variable?

Answer
The script below will read in two variables.  One will be referred to as $remoteIP and the other will be referred to as $remotePort later in the script.  The "$" symbol will evaluate the variable so its value will participate in the expression (e.g., for echoing to the screen or manipulating for conditional logic) later in the script.

#!/bin/bash
echo "Enter the IP address you want to test"
read remoteIP

echo "Enter the port number you want to test"
read remotePort

How Do You Install IIS In An Automated Way Without The Install-WindowsFeature Command?

Problem scenario:  You want to install IIS on Windows Server 2016 in an automated way.  But you are prevented from using Install-WindowsFeature or Add-WindowsFeature commands for business related reasons.
Normally something like this would work: 
Import-module servermanager; Add-WindowsFeature web-server, web-webserver -Verbose
What do you do?

Solution:  Use PowerShell with the System.Windows.Forms.SendKeys feature.

servermanager
start-sleep 2
[System.Windows.Forms.SendKeys]::SendWait{%"M"}
[System.Windows.Forms.SendKeys]::SendWait{%"M"}
start-sleep 1
[System.Windows.Forms.SendKeys]::SendWait("{DOWN}")
[System.Windows.Forms.SendKeys]::SendWait({~})
[System.Windows.Forms.SendKeys]::SendWait({nnn})
start-sleep 1
[System.Windows.Forms.SendKeys]::SendWait({w})
[System.Windows.Forms.SendKeys]::SendWait{~~}
start-sleep 1
[System.Windows.Forms.SendKeys]::SendWait("%{n}")
[System.Windows.Forms.SendKeys]::SendWait("%{n}")
[System.Windows.Forms.SendKeys]::SendWait("%{n}")
[System.Windows.Forms.SendKeys]::SendWait("%{n}")
[System.Windows.Forms.SendKeys]::SendWait("%{i}")

How do you update the hosts file on a Windows server with PowerShell?

Problem scenario:  Whenever you use PowerShell to append to the c:\windows\system32\drivers\etc\hosts file you get spaces before and after every character of every string.  The problem does not happen with ordinary text files.

To illustrate, here is a line of PowerShell code and take not of the destination flat file involved:
echo "8.8.8.8        continualintegration.com" >> c:\windows\system32\drivers\etc\hosts

The above code results in a line like this inside the file:
8 . 8 . 8 . 8         c o n t i n u a l i n t e g r a t i o n . c o m

Solution:  Copy the c:\windows\system32\drivers\etc\hosts to an intermediate file.  Update that file through your PowerShell script.  Then copy that file to c:\windows\system32\drivers\etc\hosts to overwrite it.

Installing Git 2.x on CentOS and Getting Passed Two Potential Problems

Notice that there are two problem scenarios and two solutions.

Problem scenario:  When installing Git on CentOS you get this error "http-push.c ... fatal error ... expat.h: No such file or directory"

Solution
Run this: yum install expat-devel

Problem scenario:  When running commands to install Git on CentOS, you use the "make" command.  But you get this error:  "git-compat.util.h:...: fatal error: openssl/ssl.h  No such file or directory."

Solution
Run this: yum install openssl-devel

Finally, for some good directions for installing Git 2.x on CentOS, see this link: http://tecadmin.net/install-git-2-x-on-centos-rhel-and-fedora/

How Do You Install Ansible on an AWS Instance of Linux SUSE?

Problem scenario
You want to use Ansible with Linux SUSE.  How do you install Ansible (the control node) on an AWS Instance of Linux SUSE?

Solution
Prerequisite
You must have 2.5 GB of memory (either in RAM or with a combination of RAM and swap space). For directions on how to configure swap space in the amount of 2 GB, see this posting. You have installed Git too.


Procedures
1.  Make sure your server is in a Security Group that allows it to have access to the Internet.

2.  Create a file called /tmp/ansible.sh with the following content:

zypper -n install python-setuptools
cd /tmp
git clone git://github.com/ansible/ansible.git --recursive
mv ansible /usr/local/
cd /usr/local/ansible
echo 'PATH="$PATH":/usr/local/ansible/bin' > /etc/profile.d/ansible.sh
python setup.py build
python setup.py install
echo 'Run "export PATH="$PATH":/usr/local/ansible/bin" to immediately start using Ansible'
echo 'Then you can run "ansible --version" to confirm it was installed'

3. Run it with sudo bash /tmp/ansible.sh