commit
8ec0800082
22 changed files with 491 additions and 0 deletions
@ -0,0 +1,2 @@ |
|||||
|
admin.pub |
||||
|
*.retry |
||||
@ -0,0 +1,4 @@ |
|||||
|
[submodule "openshift-ansible"] |
||||
|
path = openshift-ansible |
||||
|
url = https://github.com/openshift/openshift-ansible.git |
||||
|
branch = release-1.5 |
||||
@ -0,0 +1,21 @@ |
|||||
|
The MIT License (MIT) |
||||
|
|
||||
|
Copyright (c) 2016 Nicolas MASSE |
||||
|
|
||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
|
of this software and associated documentation files (the "Software"), to deal |
||||
|
in the Software without restriction, including without limitation the rights |
||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
|
copies of the Software, and to permit persons to whom the Software is |
||||
|
furnished to do so, subject to the following conditions: |
||||
|
|
||||
|
The above copyright notice and this permission notice shall be included in all |
||||
|
copies or substantial portions of the Software. |
||||
|
|
||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
|
SOFTWARE. |
||||
@ -0,0 +1,14 @@ |
|||||
|
# OpenShift-Lab |
||||
|
This project is the Ansible Playbook to install OpenShift in a Lab Environment. |
||||
|
|
||||
|
## Preparation work |
||||
|
|
||||
|
1. Pull the "openshift-ansible" sub-project using `git submodule init && git submodule update` |
||||
|
2. Review \*.hosts and change hostnames to target your Virtual Machines |
||||
|
|
||||
|
## Example |
||||
|
|
||||
|
``` |
||||
|
./ansible bootstrap vm.openshift.test |
||||
|
./ansible play allinone |
||||
|
``` |
||||
@ -0,0 +1,67 @@ |
|||||
|
#!/bin/bash |
||||
|
|
||||
|
options="" |
||||
|
ssh_key="$HOME/.ssh/id_rsa" |
||||
|
initial_user="root" |
||||
|
|
||||
|
target="$1" |
||||
|
shift |
||||
|
case "$target" in |
||||
|
"bootstrap") |
||||
|
if [ -z "$1" ]; then |
||||
|
echo "Please specify the target host(s) !" |
||||
|
exit 1 |
||||
|
fi |
||||
|
echo "Bootstraping $@..." |
||||
|
echo |
||||
|
echo -n "Please enter the initial $initial_user password: " |
||||
|
read -s password |
||||
|
echo # Add a Line Feed since the "read -s" do not output it ! |
||||
|
echo |
||||
|
|
||||
|
# Pre-register SSH Host Keys |
||||
|
for host; do |
||||
|
echo "Connecting to $host to register the SSH Host Key !" |
||||
|
LC_ALL=C sshpass -p "$password" ssh -i $ssh_key -o StrictHostKeyChecking=no "$initial_user@$host" /bin/true |
||||
|
done |
||||
|
|
||||
|
# Setup authentication |
||||
|
if [ -n "$password" ]; then |
||||
|
options="$options -e ansible_ssh_pass=$password" |
||||
|
else |
||||
|
options="$options -e ansible_ssh_private_key_file=$ssh_key" |
||||
|
fi |
||||
|
|
||||
|
# Setup the ssh user |
||||
|
options="$options -e ansible_ssh_user=$initial_user " |
||||
|
|
||||
|
# Generate an inventory file "on the fly" |
||||
|
echo "[bootstrap]" > "bootstrap.hosts" |
||||
|
for host; do |
||||
|
echo -e "$host" |
||||
|
done >> "bootstrap.hosts" |
||||
|
|
||||
|
ansible-playbook -i "bootstrap.hosts" $options bootstrap.yml |
||||
|
|
||||
|
rm -f "bootstrap.hosts" |
||||
|
;; |
||||
|
"play") |
||||
|
if [ -z "$1" ]; then |
||||
|
echo "Please specify the playbook to run !" |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
playbook="$1" |
||||
|
shift |
||||
|
|
||||
|
ansible-playbook -i "$playbook.hosts" $options "$@" $playbook.yml |
||||
|
;; |
||||
|
*) |
||||
|
echo "Usage: $0 {bootstrap|play} [options]" |
||||
|
echo |
||||
|
echo "Samples: " |
||||
|
echo " $0 bootstrap machine.example.com" |
||||
|
echo " $0 play allinone" |
||||
|
exit 1 |
||||
|
;; |
||||
|
esac |
||||
@ -0,0 +1,3 @@ |
|||||
|
[defaults] |
||||
|
# This is needed by the openshift-ansible installer |
||||
|
deprecation_warnings=False |
||||
@ -0,0 +1,9 @@ |
|||||
|
--- |
||||
|
|
||||
|
- name: Bootstrap one or more CentOS 7 nodes |
||||
|
hosts: bootstrap |
||||
|
become: no |
||||
|
vars_files: |
||||
|
- private/private_vars.yml |
||||
|
roles: |
||||
|
- bootstrap |
||||
@ -0,0 +1,7 @@ |
|||||
|
--- |
||||
|
timezone: Europe/Paris |
||||
|
ansible_python_interpreter: /usr/bin/python2 |
||||
|
ansible_ssh_user: redhat |
||||
|
ansible_ssh_private_key_file: "{{ lookup('env','HOME') }}/.ssh/id_rsa" |
||||
|
ansible_ssh_public_key: "{{ lookup('file', ansible_ssh_private_key_file + '.pub' ) }}" |
||||
|
ansible_connection: ssh |
||||
@ -0,0 +1,4 @@ |
|||||
|
--- |
||||
|
|
||||
|
- name: restart sshd |
||||
|
service: name=sshd state=reloaded |
||||
@ -0,0 +1,58 @@ |
|||||
|
--- |
||||
|
|
||||
|
- name: Tell SSHD not to use DNS |
||||
|
lineinfile: dest=/etc/ssh/sshd_config regexp="^#* *UseDNS +" line="UseDNS no" |
||||
|
notify: restart sshd |
||||
|
tags: config |
||||
|
|
||||
|
- name: Tell SSHD to forbid root accesses |
||||
|
lineinfile: dest=/etc/ssh/sshd_config regexp="^#* *PermitRootLogin +" line="PermitRootLogin no" |
||||
|
notify: restart sshd |
||||
|
tags: config |
||||
|
|
||||
|
- name: Tell SSHD to forbid password accesses |
||||
|
lineinfile: dest=/etc/ssh/sshd_config regexp="^#* *PasswordAuthentication +" line="PasswordAuthentication no" |
||||
|
notify: restart sshd |
||||
|
tags: config |
||||
|
|
||||
|
- name: Install some software |
||||
|
yum: name={{ item }} state=installed |
||||
|
with_items: |
||||
|
- vim-enhanced |
||||
|
- tmux |
||||
|
- unzip |
||||
|
- tcpdump |
||||
|
- telnet |
||||
|
- strace |
||||
|
- man-pages |
||||
|
- man |
||||
|
- iptraf |
||||
|
- wget |
||||
|
- openssh-clients |
||||
|
tags: rpm |
||||
|
|
||||
|
- name: Install Open-VM tools |
||||
|
yum: name=open-vm-tools state=installed |
||||
|
tags: rpm |
||||
|
|
||||
|
- name: Fix /etc/environment to include PATH |
||||
|
lineinfile: dest=/etc/environment regexp="^PATH=" line="PATH=/bin:/usr/bin:/sbin:/usr/sbin" |
||||
|
tags: config |
||||
|
|
||||
|
- name: Persist the hostname |
||||
|
lineinfile: dest=/etc/sysconfig/network regexp="^HOSTNAME=" line="HOSTNAME={{ inventory_hostname_short }}" |
||||
|
tags: |
||||
|
- config |
||||
|
- dns |
||||
|
|
||||
|
- name: Set the hostname |
||||
|
command: hostnamectl set-hostname {{ inventory_hostname_short }} --static |
||||
|
tags: |
||||
|
- config |
||||
|
- dns |
||||
|
|
||||
|
- name: Ensure consistent locale across systems (1/2) |
||||
|
lineinfile: dest=/etc/locale.conf regexp="^LANG=" line="LANG=en_US.utf8" |
||||
|
|
||||
|
- name: Ensure consistent locale across systems (2/2) |
||||
|
lineinfile: dest=/etc/locale.conf line="LC_CTYPE=en_US.utf8" |
||||
@ -0,0 +1,32 @@ |
|||||
|
--- |
||||
|
|
||||
|
- name: Create groups |
||||
|
group: name={{ item.name }} state=present |
||||
|
with_items: "{{ itix_groups }}" |
||||
|
tags: bootstrap |
||||
|
|
||||
|
- name: Create users |
||||
|
user: state=present name={{ item.login }} group={{ item.group }} groups={{ item.groups }} uid={{ item.uid }} comment={{ item.comment }} password={{ item.password }} |
||||
|
with_items: "{{ itix_users }}" |
||||
|
tags: bootstrap |
||||
|
|
||||
|
- name: Create the .ssh directory for users |
||||
|
file: state=directory owner={{ item.login }} group={{ item.group }} mode=0700 path=/home/{{ item.login }}/.ssh |
||||
|
with_items: "{{ itix_users }}" |
||||
|
tags: bootstrap |
||||
|
|
||||
|
- name: Set a strong root password (only usable from console) |
||||
|
user: name=root password={{ root_password }} |
||||
|
tags: bootstrap |
||||
|
|
||||
|
- name: Set SSH key for users |
||||
|
authorized_key: user={{ item.login }} key="{{ item.ssh_public_key }}" |
||||
|
with_items: "{{ itix_users }}" |
||||
|
when: "item.ssh_public_key is defined" |
||||
|
tags: bootstrap |
||||
|
|
||||
|
- name: Configure SUDO |
||||
|
template: src=sudoers dest=/etc/sudoers owner=root group=root mode=0440 validate="/usr/sbin/visudo -cf %s" |
||||
|
tags: |
||||
|
- bootstrap |
||||
|
- config |
||||
@ -0,0 +1,3 @@ |
|||||
|
# {{ ansible_managed }} |
||||
|
%wheel ALL=(ALL) NOPASSWD: ALL |
||||
|
root ALL=(ALL) NOPASSWD: ALL |
||||
@ -0,0 +1,60 @@ |
|||||
|
--- |
||||
|
|
||||
|
- name: Check for mandatory variables required by this playbook |
||||
|
fail: |
||||
|
msg: "This playbook requires {{item}} to be set." |
||||
|
when: "{{ item }} is not defined or {{ item }} == ''" |
||||
|
with_items: |
||||
|
- docker_storage_vg |
||||
|
tags: docker-storage |
||||
|
|
||||
|
- name: Install Docker |
||||
|
yum: name=docker state=installed |
||||
|
tags: rpm |
||||
|
|
||||
|
- name: Start docker |
||||
|
service: name=docker state=started |
||||
|
tags: docker-storage |
||||
|
|
||||
|
- name: Determine if docker storage driver == devicemapper |
||||
|
shell: docker info | grep 'Storage Driver:.*devicemapper' |
||||
|
register: correct_storage_driver |
||||
|
changed_when: false |
||||
|
ignore_errors: yes |
||||
|
|
||||
|
- debug: |
||||
|
var: correct_storage_driver |
||||
|
|
||||
|
- name: set docker_storage_setup_needs_to_run |
||||
|
set_fact: |
||||
|
docker_storage_setup_needs_to_run: '{{ correct_storage_driver.rc == 1 }}' |
||||
|
tags: docker-storage |
||||
|
|
||||
|
- name: stop docker |
||||
|
service: |
||||
|
name: docker |
||||
|
state: stopped |
||||
|
when: docker_storage_setup_needs_to_run |
||||
|
tags: docker-storage |
||||
|
|
||||
|
- name: delete /var/lib/docker |
||||
|
command: rm -rf /var/lib/docker |
||||
|
when: docker_storage_setup_needs_to_run |
||||
|
tags: docker-storage |
||||
|
|
||||
|
- name: Configure docker-storage-setup to use LVM |
||||
|
template: dest=/etc/sysconfig/docker-storage-setup src=docker-storage-setup |
||||
|
register: docker-storage-setup |
||||
|
when: docker_storage_setup_needs_to_run |
||||
|
tags: docker-storage |
||||
|
|
||||
|
- name: Run docker-storage-setup |
||||
|
command: docker-storage-setup |
||||
|
environment: |
||||
|
PATH: /bin:/usr/bin:/sbin:/usr/sbin # Fix buggy PATH on RHEL7 |
||||
|
when: docker_storage_setup_needs_to_run |
||||
|
tags: docker-storage |
||||
|
|
||||
|
- name: Start Docker |
||||
|
service: name=docker state=started enabled=yes |
||||
|
tags: docker-storage |
||||
@ -0,0 +1,9 @@ |
|||||
|
STORAGE_DRIVER=devicemapper |
||||
|
DOCKER_ROOT_VOLUME=yes |
||||
|
|
||||
|
{% if docker_storage_disk is defined %} |
||||
|
DEVS={{ docker_storage_disk }} |
||||
|
{% endif %} |
||||
|
{% if docker_storage_vg is defined %} |
||||
|
VG={{ docker_storage_vg }} |
||||
|
{% endif %} |
||||
@ -0,0 +1,11 @@ |
|||||
|
--- |
||||
|
|
||||
|
- name: Install iptables-services |
||||
|
yum: name=iptables-services state=installed |
||||
|
tags: rpm |
||||
|
|
||||
|
- name: Disable firewalld |
||||
|
service: name=firewalld state=stopped enabled=no |
||||
|
|
||||
|
- name: Enable iptables |
||||
|
service: name=iptables state=started enabled=yes |
||||
@ -0,0 +1,48 @@ |
|||||
|
--- |
||||
|
|
||||
|
- name: Check for mandatory variables required by this playbook |
||||
|
fail: |
||||
|
msg: "This playbook requires {{item}} to be set." |
||||
|
when: "{{ item }} is not defined or {{ item }} == ''" |
||||
|
with_items: |
||||
|
- lab_dns_suffix |
||||
|
- openshift_master_default_subdomain |
||||
|
|
||||
|
- name: Make sure each machine has an up-to-date /etc/hosts |
||||
|
template: dest=/etc/hosts src=hosts |
||||
|
tags: config |
||||
|
|
||||
|
- name: Install dnsmasq |
||||
|
yum: name=dnsmasq state=installed |
||||
|
when: "'name-server' in group_names" # Only on admin server |
||||
|
tags: rpm |
||||
|
|
||||
|
- name: Set dnsmasq config |
||||
|
template: src=dnsmasq.conf dest=/etc/dnsmasq.conf |
||||
|
when: "'name-server' in group_names" # Only on admin server |
||||
|
tags: config |
||||
|
|
||||
|
- name: Generate an /etc/hosts with all hosts |
||||
|
template: dest=/etc/hosts.dnsmasq src=hosts |
||||
|
when: "'name-server' in group_names" # Only on admin server |
||||
|
tags: config |
||||
|
|
||||
|
- name: Make sure dnsmasq daemon is enabled and started |
||||
|
service: name=dnsmasq state=started enabled=yes |
||||
|
when: "'name-server' in group_names" # Only on admin server |
||||
|
tags: config |
||||
|
|
||||
|
- name: Add an iptable rule to allow DNS queries from other hosts |
||||
|
lineinfile: dest=/etc/sysconfig/iptables line="-A INPUT -p udp --dport 53 -j ACCEPT" insertafter="-A INPUT -i lo -j ACCEPT" |
||||
|
when: "'name-server' in group_names" # Only on admin server |
||||
|
tags: iptables |
||||
|
|
||||
|
- name: Restart iptables |
||||
|
service: name=iptables enabled=yes state=restarted |
||||
|
when: "'name-server' in group_names" # Only on admin server |
||||
|
tags: iptables |
||||
|
|
||||
|
- name: Fix the /etc/resolv.conf of other hosts |
||||
|
template: dest=/etc/resolv.conf src=resolv.conf |
||||
|
when: "'name-server' in groups and 'name-server' not in group_names" # On all other nodes (if a name server has been setup) |
||||
|
tags: config |
||||
@ -0,0 +1,28 @@ |
|||||
|
# {{ ansible_managed }} |
||||
|
|
||||
|
domain-needed |
||||
|
bogus-priv |
||||
|
expand-hosts |
||||
|
log-queries |
||||
|
local-ttl=60 |
||||
|
|
||||
|
# Do not read the default /etc/hosts |
||||
|
no-hosts |
||||
|
|
||||
|
# But read this one... |
||||
|
addn-hosts=/etc/hosts.dnsmasq |
||||
|
|
||||
|
# Default suffix for all machines |
||||
|
domain={{ lab_dns_suffix }} |
||||
|
|
||||
|
# |
||||
|
# Wildcard DNS entries (see lab_route_suffix variable) |
||||
|
# |
||||
|
# note: will generate something like this : |
||||
|
# address=/app.openshift.test/192.168.23.20 |
||||
|
# |
||||
|
{% if 'lb' in groups %} |
||||
|
address=/{{ openshift_master_default_subdomain }}/{{ hostvars[groups['lb'][0]]['ansible_default_ipv4']['address'] }} |
||||
|
{% else %} |
||||
|
address=/{{ openshift_master_default_subdomain }}/{{ hostvars[groups['masters'][0]]['ansible_default_ipv4']['address'] }} |
||||
|
{% endif %} |
||||
@ -0,0 +1,9 @@ |
|||||
|
# {{ ansible_managed }} |
||||
|
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 |
||||
|
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 |
||||
|
|
||||
|
{% if "name-server" not in groups %} |
||||
|
{% for item in groups['all'] %} |
||||
|
{{ hostvars[item]['ansible_default_ipv4']['address'] }} {{ hostvars[item]['inventory_hostname']}} {{ hostvars[item]['inventory_hostname_short']}} |
||||
|
{% endfor %} |
||||
|
{% endif %} |
||||
@ -0,0 +1,5 @@ |
|||||
|
# {{ ansible_managed }} |
||||
|
search {{ lab_dns_suffix }} |
||||
|
{% for item in groups['name-server'] %} |
||||
|
nameserver {{ hostvars[item]['ansible_default_ipv4']['address'] }} |
||||
|
{% endfor %} |
||||
@ -0,0 +1,18 @@ |
|||||
|
--- |
||||
|
|
||||
|
- name: Install centos-release-openshift-origin |
||||
|
yum: name=centos-release-openshift-origin state=installed |
||||
|
tags: rpm |
||||
|
|
||||
|
- name: Install required RPMs |
||||
|
yum: name={{ item }} state=installed |
||||
|
with_items: |
||||
|
- git |
||||
|
- net-tools |
||||
|
- bind-utils |
||||
|
- bridge-utils |
||||
|
- bash-completion |
||||
|
- origin-clients |
||||
|
- NetworkManager |
||||
|
- nfs-utils |
||||
|
tags: rpm |
||||
@ -0,0 +1,63 @@ |
|||||
|
# |
||||
|
# Variables used by my playbook |
||||
|
# |
||||
|
[allinone:vars] |
||||
|
lab_dns_suffix=itix.test |
||||
|
docker_storage_vg=docker |
||||
|
|
||||
|
[allinone:children] |
||||
|
masters |
||||
|
|
||||
|
# |
||||
|
# Shared variables used by both openshift-ansible and my playbook |
||||
|
# |
||||
|
[all:vars] |
||||
|
# Default route suffix |
||||
|
openshift_master_default_subdomain=app.itix.test |
||||
|
|
||||
|
[masters] |
||||
|
openshift.itix.test |
||||
|
|
||||
|
[nodes] |
||||
|
openshift.itix.test openshift_node_labels='{ "workload": "infra", "workload": "app" }' |
||||
|
|
||||
|
# |
||||
|
# The rest is used only by the OpenShift installer playbook |
||||
|
# |
||||
|
[OSEv3:children] |
||||
|
masters |
||||
|
nodes |
||||
|
|
||||
|
[OSEv3:vars] |
||||
|
# Yes, we need to use sudo |
||||
|
ansible_become=yes |
||||
|
|
||||
|
# what to install |
||||
|
deployment_type=origin |
||||
|
|
||||
|
# New installation method : everything in containers ! |
||||
|
contenairized=true |
||||
|
|
||||
|
# Clustering method |
||||
|
openshift_master_cluster_method=native |
||||
|
|
||||
|
# Bypass Registry Security Checks |
||||
|
openshift_docker_insecure_registries=172.30.0.0/16 |
||||
|
|
||||
|
# Disable any authentication |
||||
|
openshift_master_identity_providers=[{'name': 'allow_all', 'login': 'true', 'challenge': 'true', 'kind': 'AllowAllPasswordIdentityProvider'}] |
||||
|
|
||||
|
# default project node selector |
||||
|
osm_default_node_selector='workload=app' |
||||
|
|
||||
|
# Make sure NTP is enabled |
||||
|
openshift_clock_enabled=true |
||||
|
|
||||
|
# default router |
||||
|
openshift_hosted_router_selector='workload=infra' |
||||
|
|
||||
|
# Do not create the default project "my-project" |
||||
|
openshift_additional_projects={} |
||||
|
|
||||
|
# Enable the multitenant SDN |
||||
|
os_sdn_network_plugin_name='redhat/openshift-ovs-multitenant' |
||||
@ -0,0 +1,16 @@ |
|||||
|
--- |
||||
|
|
||||
|
- name: Prepare an "All-in-one" VM for OpenShift |
||||
|
hosts: allinone |
||||
|
become: yes |
||||
|
vars_files: |
||||
|
- private/private_vars.yml |
||||
|
roles: |
||||
|
- { name: 'base', tags: 'base' } |
||||
|
- { name: 'iptables', tags: 'iptables' } |
||||
|
- { name: 'name-resolution', tags: 'name-resolution' } |
||||
|
- { name: 'docker', tags: 'docker' } |
||||
|
- { name: 'openshift-prereq', tags: 'openshift-prereq' } |
||||
|
|
||||
|
# Launch the OpenShift Installer Playbook |
||||
|
- include: "./openshift-ansible/playbooks/byo/config.yml" |
||||
Loading…
Reference in new issue