Tämä harjoitus on tehty osana Haaga-Helian Tietojenkäsittelyn koulutusohjelman kurssia Palvelinten hallinta (ICT4TN022, kevät 2018). Kurssin pitäjänä toimii Tero Karvinen, joka on määritellyt tämän harjoituksen tehtävänkuvaukset. Tehtävien vastaukset ovat Pekka Heleniuksen (allekirjoittanut) tuottamia.
Harjoituksen esivaatimuksena on käyttää useampaa Minion-konetta Salt:lla. Useamman Salt-minionin luomiseen on monta eri tapaa, kuten
Toteutetaan vaihtoehto 1) Vagrantilla.
Toteutetaan minion-koneet Vagrant-virtualisoinnilla.
Tässä vaiheessa oletetaan, että koneelta löytyy Salt-master jo valmiina (ks. mm. harjoitus 1).
Asennetaan vagrant
sudo apt-get -y install vagrant
Tietokoneelta löytyy ennestään virtualbox asennettuna, mutta se voidaan asentaa myös:
sudo apt-get -y install virtualbox
Vagrant käyttää laatikoita (boxes) virtualisoitujen ympäristöjen toteuttamisessa. Käytän harjoituksessa laatikkoa debian/jessie64. Tässä täytyy olla tarkkana, ettei käytettyjen Salt:ien versiot ja API:t rikkoonnu! Tuotantoympäristössä nämä on tarkistettava ja katsottava huolella!
Luodaan kaksi Salt minion -konetta ajamalla seuraava Vagrantfile Master-koneen myöhemmin valittavassa alihakemistossa:
Vagrantfile - Multiple Salt minions
HUOM! Vagrant-ratkaisu ei toimi hyvin jo-virtualisoiduissa työympäristöissä, eli Vagrantia tulisi ajaa "fyysisellä" koneella.
Ladataan yllä mainittu Vagrantfile master-koneen alihakemistoon /srv/salt/vagrant_minions:
sudo mkdir -p /srv/salt/vagrant_minions
sudo wget https://raw.githubusercontent.com/Fincer-altego/central-management-of-multiple-servers/master/scripts/vagrant_salt-minions/Vagrantfile -O /srv/salt/vagrant_minions/Vagrantfile
Ladatussa Vagrantfile:ssä on jo ennestään määritetty luotavaksi kaksi Salt-minionia: minion_1 ja minion_2 laatikkotemplatella debian/jessie64.
HUOM! Monet vagrant -komennot on sidottu työhakemistoon. Ennestään luodut virtuaalikoneet tulee ne tuhota siitä hakemistosta käsin, jossa koneet on luotu (ja siis jossa Vagrantfile sijaitsee). Vagrant luo tähän hakemistoon piilohakemiston .vagrant/machines, johon koneet on luotu.
Annetaan master-koneen normaalille ylläpitäjälle (UID: 1000, GID: 1000 ja kuuluu sudo-ryhmään) omistusoikeus kansioon /srv/salt/vagrant_minions:
sudo chown 1000:1000 -R /srv/salt/vagrant_minions
Luodaan tällä käyttäjällä tuohon hakemistoon viittaava symbolinen linkki kys. käyttäjän kotihakemistoon:
ln -s /srv/salt/vagrant_minions $HOME/vagrant-minions
HUOM! Edellä olevaa ei ole pakko tehdä, ja se on täysin vapaaehtoista. Halusin tehdä sen selkeyden vuoksi.
Ajetaan ladattu Vagrantfile:
cd $HOME/vagrant-minions
vagrant up
Testataan laatikoiden minion_1 ja minion_2 SSH-toimivuus ajamalla:
vagrant ssh minion_1
vagrant ssh minion_2
Hyväksytään nämä minion-koneet masterilla:
[23/04/2018 19:24:57 - fincer: vagrant ]$ sudo salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
minion_1
minion_2
Proceed? [n/Y] y
Key for minion minion_1 accepted.
Key for minion minion_2 accepted.
Vastaus:
Ajetaan root-käyttäjänä (sudo-komento) seuraava shell-skripti master-koneella:
Pekka Helenius - salt_pillar_sample.sh
Masterilta saatu output:
[23/04/2018 19:41:45 - fincer: vagrant ]$ sudo sh pillar_sample.sh
base:
'minion_1':
- minion-1
'minion_2':
- minion-2
test_variable: 'secret like coffee shop wants to say hello to the world'
test_variable: 'hidden miniart: superman vs. hulk figures'
This is my pillarfile which has the following content:
{{ pillar['test_variable'] }}
pillar_file:
file.managed:
- user: 1000
- group: 1000
- name: /tmp/pillarfile_for_{{ grains['id'] }}
- source: salt://files/pillarfile
- makedirs: True
- template: jinja
minion_2:
True
minion_1:
True
**Salt -- pillar.items output**
minion_2:
----------
test_variable:
hidden miniart: superman vs. hulk figures
minion_1:
----------
test_variable:
secret like coffee shop wants to say hello to the world
**Salt -- state.apply output**
minion_1:
----------
ID: pillar_file
Function: file.managed
Name: /tmp/pillarfile_for_minion_1
Result: True
Comment: File /tmp/pillarfile_for_minion_1 is in the correct state
Started: 16:42:18.786164
Duration: 54.806 ms
Changes:
Summary for minion_1
------------
Succeeded: 1
Failed: 0
------------
Total states run: 1
Total run time: 54.806 ms
minion_2:
----------
ID: pillar_file
Function: file.managed
Name: /tmp/pillarfile_for_minion_2
Result: True
Comment: File /tmp/pillarfile_for_minion_2 is in the correct state
Started: 16:42:18.886370
Duration: 57.26 ms
Changes:
Summary for minion_2
------------
Succeeded: 1
Failed: 0
------------
Total states run: 1
Total run time: 57.260 ms
**Salt -- get file output with head command**
minion_2:
This is my pillarfile which has the following content:
hidden miniart: superman vs. hulk figures
minion_1:
This is my pillarfile which has the following content:
secret like coffee shop wants to say hello to the world
Vastaus:
Asennetaan molemmille orjille Apache HTTP daemon seuraavaa shell-skriptiä käyttäen:
Masterilta saatu output:
[24/04/2018 01:57:10 - fincer: vagrant ]$ sudo sh apache_sample.sh
{% if grains['id'] == 'minion_2' %}
site_data: '{{ salt['cmd.run']('uname -a') }}'
{% endif %}
<VirtualHost *:80>
ServerName {{ servername }}
ServerAlias {{ serveralias }}
ServerAdmin webmaster@localhost
DocumentRoot {{ ('/var/www/html/' + grains['id'] + '/') }}
ErrorLog /error.log
CustomLog /access.log combined
</VirtualHost>
{{ pillar.get('site_data','Nothing interesting here') }}
{% set servername = grains['os'].lower() + '.' + grains['id'] + '.com' %}
{% set serveralias = 'www.' + grains['os'].lower() + '.' + grains['id'] + '.com' %}
apache_install:
pkg.installed:
- pkgs:
- apache2
- curl
sample_page_conf:
file.managed:
- name: /etc/apache2/sites-available/{{ grains['id'] }}.conf
- source: salt://apache/samplesite.conf
- mode: 0644
- user: root
- group: root
- template: jinja
- context:
servername: {{ servername }}
serveralias: {{ serveralias }}
- require:
- pkg: apache_install
enable_sample_page:
cmd.run:
- name: 'a2ensite {{ grains['id'] }}.conf'
- require:
- file: sample_page_conf
sample_page_content:
file.managed:
- mode: 0644
- user: root
- group: root
- makedirs: True
- template: jinja
- name: {{ ('/var/www/html/' + grains['id'] + '/index.html') }}
- source: salt://apache/sampleindex.html
- require:
- cmd: enable_sample_page
add_vhost_domain:
file.append:
- name: /etc/hosts
- text: 127.0.0.1 {{ servername }}
- require:
- file: sample_page_content
restart_httpd:
service.running:
- name: apache2.service
- watch:
- file: add_vhost_domain
- cmd: enable_sample_page
test_page:
cmd.run:
- name: 'curl -s {{ servername }}'
- require:
- service: restart_httpd
**Salt -- pillar.items output**
minion_1:
----------
test_variable:
secret like coffee shop wants to say hello to the world
minion_2:
----------
site_data:
Linux fincer-laptop 4.15.10-1-ARCH #1 SMP PREEMPT Thu Mar 15 12:24:34 UTC 2018 x86_64 GNU/Linux
test_variable:
hidden miniart: superman vs. hulk figures
**Salt -- state.apply output**
minion_1:
----------
ID: apache_install
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 22:59:25.325084
Duration: 273.26 ms
Changes:
----------
ID: sample_page_conf
Function: file.managed
Name: /etc/apache2/sites-available/minion_1.conf
Result: True
Comment: File /etc/apache2/sites-available/minion_1.conf is in the correct state
Started: 22:59:25.599368
Duration: 51.619 ms
Changes:
----------
ID: enable_sample_page
Function: cmd.run
Name: a2ensite minion_1.conf
Result: True
Comment: Command "a2ensite minion_1.conf" run
Started: 22:59:25.651513
Duration: 20.174 ms
Changes:
----------
pid:
13401
retcode:
0
stderr:
stdout:
Site minion_1 already enabled
----------
ID: sample_page_content
Function: file.managed
Name: /var/www/html/minion_1/index.html
Result: True
Comment: File /var/www/html/minion_1/index.html is in the correct state
Started: 22:59:25.671991
Duration: 9.937 ms
Changes:
----------
ID: add_vhost_domain
Function: file.append
Name: /etc/hosts
Result: True
Comment: File /etc/hosts is in correct state
Started: 22:59:25.682126
Duration: 1.011 ms
Changes:
----------
ID: restart_httpd
Function: service.running
Name: apache2.service
Result: True
Comment: Service restarted
Started: 22:59:25.697483
Duration: 2145.224 ms
Changes:
----------
apache2.service:
True
----------
ID: test_page
Function: cmd.run
Name: curl -s ubuntu.minion_1.com
Result: True
Comment: Command "curl -s ubuntu.minion_1.com" run
Started: 22:59:27.842981
Duration: 9.994 ms
Changes:
----------
pid:
13523
retcode:
0
stderr:
stdout:
Nothing interesting here
Summary for minion_1
------------
Succeeded: 7 (changed=3)
Failed: 0
------------
Total states run: 7
Total run time: 2.511 s
minion_2:
----------
ID: apache_install
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 22:59:25.453349
Duration: 273.908 ms
Changes:
----------
ID: sample_page_conf
Function: file.managed
Name: /etc/apache2/sites-available/minion_2.conf
Result: True
Comment: File /etc/apache2/sites-available/minion_2.conf is in the correct state
Started: 22:59:25.728257
Duration: 10.512 ms
Changes:
----------
ID: enable_sample_page
Function: cmd.run
Name: a2ensite minion_2.conf
Result: True
Comment: Command "a2ensite minion_2.conf" run
Started: 22:59:25.739209
Duration: 18.428 ms
Changes:
----------
pid:
13160
retcode:
0
stderr:
stdout:
Site minion_2 already enabled
----------
ID: sample_page_content
Function: file.managed
Name: /var/www/html/minion_2/index.html
Result: True
Comment: File /var/www/html/minion_2/index.html is in the correct state
Started: 22:59:25.757909
Duration: 8.736 ms
Changes:
----------
ID: add_vhost_domain
Function: file.append
Name: /etc/hosts
Result: True
Comment: File /etc/hosts is in correct state
Started: 22:59:25.766840
Duration: 0.933 ms
Changes:
----------
ID: restart_httpd
Function: service.running
Name: apache2.service
Result: True
Comment: Service restarted
Started: 22:59:25.779507
Duration: 2102.595 ms
Changes:
----------
apache2.service:
True
----------
ID: test_page
Function: cmd.run
Name: curl -s ubuntu.minion_2.com
Result: True
Comment: Command "curl -s ubuntu.minion_2.com" run
Started: 22:59:27.882439
Duration: 11.578 ms
Changes:
----------
pid:
13282
retcode:
0
stderr:
stdout:
Linux fincer-laptop 4.15.10-1-ARCH #1 SMP PREEMPT Thu Mar 15 12:24:34 UTC 2018 x86_64 GNU/Linux
Summary for minion_2
------------
Succeeded: 7 (changed=3)
Failed: 0
------------
Total states run: 7
Total run time: 2.427 s
Luotujen HTML-sivustojen sisältö:
[24/04/2018 01:59:28 - fincer: vagrant ]$ sudo salt 'minion_1' cmd.run 'curl -s ubuntu.minion_1.com'
minion_1:
Nothing interesting here
[24/04/2018 02:00:47 - fincer: vagrant ]$ sudo salt 'minion_2' cmd.run 'curl -s ubuntu.minion_2.com'
minion_2:
Linux fincer-laptop 4.15.10-1-ARCH #1 SMP PREEMPT Thu Mar 15 12:24:34 UTC 2018 x86_64 GNU/Linux