In my existing collection of automated install scripts for HDP I always try to extend it with further examples of different provisioners, providers, and settings. Recently I added with hdp22-n1-centos6-ansible an example Ansible environment for preparing a HDP 2.2 installation on one node.
Ansible differs from other provisioners like Puppet or Chef by a simplified approach in dependence on SSH. It behaves almost as a distributed shell putting little dependencies on existing hosts. Where for example Puppet makes strong assumptions about the current state of a system with one or multiple nodes, does Ansible more or less reflect a collection of tasks a system gone through to reach it’s current state. While some celebrate Ansible for it’s simplicity do others abandon it for it’s lack of strong integrity.
In this post I would like to share a sample Ansible Playbook to prepare a HDP 2.2 Amabri installation using Vagrant with Virtualbox. You can download and view the in this post discussed example here.
Installing HDP w/ Ansible
Every installation of HDP with Ambari is usually quite straight forward. First all possible interfering services like iptables and selinux are disabled or removed. Talking about an Ambari installation little but the installation of an Ambari agent on all nodes together with the installation of Amabri server on one node has to be accomplished. It is probably worth mentioning that for a cluster setup it is really important networking services like DNS have to work properly between all hosts.
To install HDP you obviously also need a repository containing the required service. Part of this can also be achieved by an installation through Ambari where as we only need the Ambari repo for 1.7 here.
Summary of installation tasks:
- Disable/Uninstall Interfering Services
- Configure Networking Services
- Install and Configure Ambari Repository
- Install and Configure Ambari Agent on ALL Nodes
- Install, Configure, and Start Ambari Server on ONE Node
- Install HDP using Ambari Blueprints
Ansbile Tasks to HDP 2.2
Disable/Uninstall Interfering Services
Possible interfering service are iptables and selinux. Both are disabled with the following taks:
---
- hosts: all
user: vagrant
sudo: True
tasks:
- name: Stop iptables
command: service iptables stop
- name: Stop iptables6
command: service ip6tables stop
- name: If needed temporaly disable SELinux
shell: echo 0 > enforce
args:
chdir: /selinux
removes: enforce
- name: Disable SElinux permanetly
lineinfile: dest=/etc/selinux/config state=present create=no regexp='SELINUX=.*' line='SELINUX=disabled'
Configure Networking Services
Each hostname of the cluster needs to be resolve able by each host. We also need the Vagrant Host plugin, but some of this is also done with the following tasks. Also we need time synchronization using NTP:
- hosts: all
user: vagrant
sudo: True
tasks:
- name: Install NTP
yum:
pkg: ntp
state: installed
- name: Start NTP
command: service ntpd start#
- name: Create hostname entry to {{ ownhostname }}
lineinfile: dest=/etc/hostname state=present create=yes regexp='.*' line='{{ ownhostname }}'
- name: Set networking yes
lineinfile: dest=/etc/sysconfig/network create=yes state=present regexp='NETWORKING=.*' line='NETWORKING=yes'
- name: Set hostname to {{ ownhostname }}
lineinfile: dest=/etc/sysconfig/network create=yes state=present regexp='HOSTNAME=.*' line='HOSTNAME={{ ownhostname }}'
Install and Configure Ambari Repository
We copy the Ambari repo using wget. {{ hdp_ambari_repo }} is a variable passed to the playbook. In this case the variable is set in the Vagrant file:
---
- hosts: all
user: vagrant
sudo: True
tasks:
- name: Create Ambari Repo {{ hdp_ambari_repo }}
command: wget {{ hdp_ambari_repo }} -O /etc/yum.repos.d/ambari.repo
- name: Clean YUM
command: yum clean all
Install and Configure Ambari Agent on ALL Nodes
On each node we install an Ambari agent and configure the possible Amabri server hostname:
---
- hosts: all
user: vagrant
sudo: True
tasks:
- name: Install Ambari Agent
yum:
pkg: ambari-agent
state: installed
- name: Configure Ambari agent to register at Ambari server
lineinfile: dest=/etc/ambari-agent/conf/ambari-agent.ini create=no state=present regexp='hostname=.*' line='hostname={{ ambarihostname }}'
Install, Configure, and Start Ambari Server on ONE Node
Only the “one” node installs the Amabri server. This is accomplished by the provided ansible.group config in the Vagrant file:
- hosts: ambari_host
user: vagrant
sudo: True
tasks:
- name: Install Ambari server
yum:
pkg: ambari-server
state: installed
- name: Configure Ambari server
command: ambari-server setup -s
- name: Start Ambari server
command: 'sleep 10 && ambari-server start'
Install HDP using Ambari Blueprints
As with all the given environments in the collection HDP is installed using Ambari blueprints. A default setting can be found in blueprint.json and hostmapping.json in the same folder as the Vagrant file. With ./install_blueprint.sh this can be installed.
Putting It All Together
Ansible Playbook hdp_centos6_playbook.yml:
---
- hosts: all
user: vagrant
sudo: True
tasks:
- name: Install NTP
yum:
pkg: ntp
state: installed
- name: Start NTP
command: service ntpd start
- name: Stop iptables
command: service iptables stop
- name: Stop iptables6
command: service ip6tables stop
- name: If needed temporaly disable SELinux
shell: echo 0 > enforce
args:
chdir: /selinux
removes: enforce
- name: Disable SElinux permanetly
lineinfile: dest=/etc/selinux/config state=present create=no regexp='SELINUX=.*' line='SELINUX=disabled'
- name: Create hostname entry to {{ ownhostname }}
lineinfile: dest=/etc/hostname state=present create=yes regexp='.*' line='{{ ownhostname }}'
- name: Set networking yes
lineinfile: dest=/etc/sysconfig/network create=yes state=present regexp='NETWORKING=.*' line='NETWORKING=yes'
- name: Set hostname to {{ ownhostname }}
lineinfile: dest=/etc/sysconfig/network create=yes state=present regexp='HOSTNAME=.*' line='HOSTNAME={{ ownhostname }}'
- name: Create Ambari Repo {{ hdp_ambari_repo }}
command: wget {{ hdp_ambari_repo }} -O /etc/yum.repos.d/ambari.repo
- name: Clean YUM
command: yum clean all
- name: Install Ambari Agent
yum:
pkg: ambari-agent
state: installed
- name: Configure Ambari agent to register at Ambari server
lineinfile: dest=/etc/ambari-agent/conf/ambari-agent.ini create=no state=present regexp='hostname=.*' line='hostname={{ ambarihostname }}'
- hosts: ambari_host
user: vagrant
sudo: True
tasks:
- name: Install Ambari server
yum:
pkg: ambari-server
state: installed
- name: Configure Ambari server
command: ambari-server setup -s
- name: Start Ambari server
command: 'sleep 10 && ambari-server start'
Vagrant file:
# -*- mode: ruby -*-
# # vi: set ft=ruby :
BOX="puppetlabs/centos-6.5-64-puppet"
BOX_URL="http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box"
HDP_AMBARI_REPO="http://public-repo-1.hortonworks.com/ambari/centos6/1.x/updates/1.7.0/ambari.repo"
nodes = [
{:name => :one, :cpu => 1, :mem => 4096, :ip => "192.168.33.101"},
]
VAGRANTFILE_API_VERSION = "2"
PLAYBOOK_PATH='../../ansible'
PLAYBOOK_NAME='hdp_centos6_playbook.yml'
HOST_TLD = "hdp"
AMBARI_HOST_NAME = "one.%s" % HOST_TLD
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = BOX
config.vm.box_url = BOX_URL
if Vagrant.has_plugin?("vagrant-cachier")
config.cache.scope = :box
end
nodes.each do |opts|
config.vm.define opts[:name] do |config|
config.vm.hostname = "%s.%s" % [opts[:name].to_s, HOST_TLD]
config.vm.network :private_network, ip: opts[:ip]
config.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--cpus", opts[:cpu] ] if opts[:cpu]
vb.customize ["modifyvm", :id, "--memory", opts[:mem] || 2048 ]
end
config.vm.provision :hosts do |provisioner|
provisioner.autoconfigure = false
provisioner.add_localhost_hostnames = false
nodes.each do |n|
provisioner.add_host n[:ip], [ "%s.%s" % [ n[:name].to_s, HOST_TLD ], n[:name].to_s ]
end
end
config.vm.network "forwarded_port", guest: 8080, host: 8080, auto_correct: true if "%s.%s" % [ opts[:name].to_s, HOST_TLD ] == AMBARI_HOST_NAME
config.vm.provision "ansible" do |ansible|
ansible.groups = {
"ambari_host" => ['one']
}
ansible.extra_vars = {
"hdp_ambari_repo" => HDP_AMBARI_REPO,
"ownhostname" => "%s.%s" % [opts[:name].to_s, HOST_TLD],
"ambarihostname" => AMBARI_HOST_NAME
}
ansible.playbook = "%s/%s" % [PLAYBOOK_PATH, PLAYBOOK_NAME]
end
end
end
end
HDP Ansible Playbook Example http://t.co/lvyLGKx3Zz
LikeLike