Ich denke, ich sollte anfangen, Ruby mit Ruby auf irgendeine Weise auf der Welt zu lernen, aber ich wünschte, ich könnte dasselbe mit Python schreiben. Heutzutage steht hinter dem berühmten Chefkoch für Infrastrukturautomatisierungstools ein Automatisierungstool mit Python Ich habe gehört, dass es eine gibt, und habe sofort versucht, sie zu verwenden. Hier werden wir das Verfahren zum Einrichten einer Remote-Umgebung mit Vagrant und zum Einrichten der Remote-Maschine mit Ansible vorstellen. Die Host-Umgebung ist Mac OS X Mavericks.
Ich habe die vagabundierende Installation früher zusammengefasst, also schauen Sie dort nach.
Einfach mit pip installieren.
$ pip install ansible
Bereiten Sie zunächst eine Remote-Maschine vor.
$ mkdir ansible_test
$ cd ansible_test
$ vagrant box add ubuntu12.04_amd64 https://cloud-images.ubuntu.com/vagrant/precise/current/precise-server-cloudimg-amd64-vagrant-disk1.box
$ vagrant init ubuntu12.04_amd64
Wenn Sie bereits eine geeignete Box haben, müssen Sie den Befehl box add nicht ausführen. Dieses Mal werde ich aus verschiedenen Gründen die amd64-Version von Ubuntu 12.04 verwenden. Andere Websites führen es oft in Centos ein, und ich dachte, es wäre nützlich, eine Website zu haben, die auch beschreibt, wie man mit apt-get damit umgeht, also habe ich das getan.
Nach vagrant init wird eine Vagrantdatei in Ihrem Arbeitsverzeichnis erstellt. Ändern Sie den Inhalt, um ein Netzwerk zwischen dem Host und dem Gast zu konfigurieren.
config.vm.network :private_network, ip: "192.168.33.10"
Insbesondere kommentieren Sie einfach das Obige aus. Die IP-Adresse bleibt die Standardeinstellung, Sie können sie jedoch nach Ihren Wünschen ändern.
Schreiben Sie als Nächstes die Einstellungen in ~ / .ssh / config, damit Sie ohne Kennwort darauf zugreifen können.
Host 192.168.33.10
User vagrant
IdentityFile /Users/<username>/.vagrant.d/insecure_private_key
Stellen Sie abschließend die Hosts-Datei auf ansible ein. Dies kann die Standardeinstellung sein, ist jedoch nicht einfach zu verwenden, daher ist es besser, sie zu erstellen
[servers]
192.168.33.10 #Geben Sie die IP des Gastbetriebssystems an
Schreiben Sie den obigen Inhalt in eine Datei namens hosts im Verzeichnis ansible-test. Sie können mehrere als Namen von Servern schreiben.
Bearbeiten Sie entsprechend Ihrer Umgebung.
Damit ist die Vorbereitung abgeschlossen.
Ich brauche dieses Kapitel nicht wirklich, aber bevor ich zum Playbook gehe, werde ich die grundlegende Verwendung von Ansible vorstellen. Dieser Inhalt ist der gleiche wie auf anderen Websites. Wenn Sie ihn nicht mehr mögen, sollten Sie fortfahren.
Zunächst die übliche Ping-Bestätigung.
$ ansible -i hosts servers -m ping
192.168.33.10 | success >> {
"changed": false,
"ping": "pong"
}
Befehlsausführung
$ ansible -i hosts servers -a 'pwd'
192.168.33.10 | success | rc=0 >>
/home/vagrant
Wenn Sie es kopieren können, fahren Sie mit dem nächsten fort.
Das Wesentliche an diesem Tool ist nicht der Fernbetrieb (der Fernbetrieb kann mit ssh durchgeführt werden), sondern die automatische Konfiguration der Infrastruktur. Versuchen Sie daher die automatische Umgebungskonfiguration mithilfe einer Yaml-Datei namens Playbook.
Die Seiten, die ich bisher gesehen habe, haben Methoden mit yum eingeführt, daher ist das hier vorgestellte Playbook Ubuntus apt-get-Spezifikation (natürlich verwenden einige Websites apt). Um festzustellen, ob es praktisch verwendet werden kann, versuchen Sie, eine Umgebung vorzubereiten, die ein etwas kompliziertes Verfahren erfordert. Dieses Mal werde ich Theano installieren, ein Python-Paket, das in Deep Learning verwendet wird.
playbook-theano.yaml
- hosts: servers
sudo: true
user: vagrant
tasks:
- name: apt-get update
apt: update_cache=yes
- name: apt-get upgrade
apt: upgrade=yes
- name: apt-get dist-upgrade
apt: upgrade=dist
- name: apt-get install git make python-dev python-setuptools libblas-dev gfortran g++ python-pip python-numpy python-scipy liblapack-dev
apt: name={{ item }} state=latest
with_items:
- git
- make
- python-dev
- python-setuptools
- libblas-dev
- gfortran
- g++
- python-pip
- python-numpy
- python-scipy
- liblapack-dev
- name: pip install nose
pip: name=nose
- name: pip install theano
command: /usr/bin/pip install --upgrade --no-deps git+git://github.com/Theano/Theano.git
- name: get deb package from cuda, http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb
get_url: url="http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb" dest="/home/vagrant"
- name: dpkg install cuda repo
command: dpkg -i /home/vagrant/cuda-repo-ubuntu1204_6.0-37_amd64.deb
- name: apt-get update
apt: update_cache=yes
- name: apt-get install cuda
apt: name=cuda state=latest
- name: add cuda path to environmental variable (1/2)
lineinfile: dest=/home/vagrant/.bashrc state=present line="export PATH=$PATH:/usr/local/cuda-6.0/bin:" insertafter=EOF
- name: add cuda path to environmental variable (2/2)
lineinfile: dest=/home/vagrant/.bashrc state=present line="export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-6.0/lib64:" insertafter=EOF
Überprüfen Sie zunächst, ob dieses Yaml grammatikalisch falsch ist.
$ ansible-playbook -i hosts playbook_theano.yaml --syntax-check
Wenn nicht falsch, ausführen.
$ ansible-playbook -i hosts playbook_theano.yaml
Diesmal muss der Server nicht angegeben werden, da er in der yaml-Datei angegeben ist. Anschließend wird jeder Befehl nacheinander ausgeführt. Das Ausführungsergebnis ist wie folgt
PLAY [servers] ****************************************************************
GATHERING FACTS ***************************************************************
The authenticity of host '192.168.33.10 (192.168.33.10)' can't be established.
RSA key fingerprint is XXXXXXXXXXXXXX
Are you sure you want to continue connecting (yes/no)? yes
ok: [192.168.33.10]
TASK: [apt-get update] ********************************************************
ok: [192.168.33.10]
TASK: [apt-get upgrade] *******************************************************
changed: [192.168.33.10]
TASK: [apt-get dist-upgrade] **************************************************
ok: [192.168.33.10]
TASK: [apt-get install git make python-dev python-setuptools libblas-dev gfortran g++ python-pip python-numpy python-scipy liblapack-dev] ***
changed: [192.168.33.10] => (item=git,make,python-dev,python-setuptools,libblas-dev,gfortran,g++,python-pip,python-numpy,python-scipy,liblapack-dev)
TASK: [pip install nose] ******************************************************
changed: [192.168.33.10]
TASK: [pip install theano] ****************************************************
changed: [192.168.33.10]
TASK: [get deb package from cude, http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb] ***
changed: [192.168.33.10]
TASK: [dpkg install cuda repo] ************************************************
changed: [192.168.33.10]
TASK: [apt-get update] ********************************************************
ok: [192.168.33.10]
TASK: [apt-get install cuda] **************************************************
changed: [192.168.33.10]
TASK: [add cuda path to environmental variable (1/2)] *************************
changed: [192.168.33.10]
TASK: [add cuda path to environmental variable (2/2)] *************************
changed: [192.168.33.10]
PLAY RECAP ********************************************************************
192.168.33.10 : ok=13 changed=9 unreachable=0 failed=0
Überprüfen Sie, ob es tatsächlich installiert ist.
$ vagrant ssh
vagrant@vagrant-ubuntu-precise-64:~$ python
Python 2.7.3 (default, Feb 27 2014, 19:58:35)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import theano
>>>
vagrant@vagrant-ubuntu-precise-64:~$
Es sieht okay aus. Darüber hinaus habe ich in dieser yaml-Datei eine Reihe von Paketen für die Verwendung von theano auf der GPU installiert, die ich jedoch nicht mit VirtualBox verwenden kann. Es tut mir leid.
Darüber hinaus denke ich, dass Sie Vagrant Destroy und Vagrant Up mehrmals wiederholen müssen, um zu überprüfen, ob eine Neuinstallation möglich ist, bis der Build ordnungsgemäß ausgeführt wurde. Wenn die verwendete IP-Adresse jedoch dieselbe ist, gibt ssh einen Fehler aus. Vergessen Sie nicht, ~ / .ssh / unknown_hosts jedes Mal zu löschen (oder nur den relevanten Teil zu löschen).
Playbook Tips
Eine kurze Zusammenfassung der im Playbook verwendeten Aufgabensammlung
apt-get
Es gibt ein passendes Modul.
- name: apt-get update
apt: update_cache=yes
- name: apt-get upgrade
apt: upgrade=yes
- name: apt-get dist-upgrade
apt: upgrade=dist
- name: apt-get install git
apt: name=git state=latest
In der Reihenfolge von oben ist dies ein Einstellungsbeispiel für apt-get update, apt-get upgrade, apt-get dist-upgrade und apt-get install.
Wenn Sie mehrere Pakete gleichzeitig installieren möchten, können Sie eine Schleife einfügen.
- name: apt-get install git make python-dev python-setuptools libblas-dev gfortran g++ python-pip python-numpy python-scipy liblapack-dev
apt: name={{ item }} state=latest
with_items:
- git
- make
- python-dev
- python-setuptools
- libblas-dev
- gfortran
- g++
- python-pip
- python-numpy
- python-scipy
- liblapack-dev
Manchmal möchten Sie aus dem Quellcode erstellen, ohne ein Paketverwaltungssystem zu durchlaufen. In diesem Fall wird die Quelle mit dem Modul get_url abgerufen.
- name: get deb package from cuda
get_url: url="http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb" dest="/home/vagrant"
Verwenden Sie das Befehlsmodul, wenn Sie eine reinere Befehlsausführung wünschen
- name: dpkg install cuda repo
command: dpkg -i /home/vagrant/cuda-repo-ubuntu1204_6.0-37_amd64.deb
Ein Modul für Pip ist ebenfalls erhältlich.
- name: pip install nose
pip: name=nose
Wenn Sie jedoch versuchen, etwas Kompliziertes zu tun, passt es. Daher ist es möglicherweise besser, es direkt mit einem Befehl anzugeben.
- name: pip install theano
command: /usr/bin/pip install --upgrade --no-deps git+git://github.com/Theano/Theano.git
Verwenden Sie das Lineinfile-Modul, um Einstellungen wie PATH zu ändern
- name: add cuda path to environmental variable (1/2)
lineinfile: dest=/home/vagrant/.bashrc state=present line="export PATH=$PATH:/usr/local/cuda-6.0/bin:" insertafter=EOF
Dieses Mal habe ich nur eine Zeile am Ende der Datei hinzugefügt, aber es bietet auch eine Funktion, um die angegebene Zeile mit einem regulären Ausdruck zu finden und neu zu schreiben.
Das Eingeben mehrerer Zeilen funktioniert nicht nur durch Einfügen eines Unterbrechers. Es ist einfacher, einen Klon zu erstellen und ihn dann an einen geeigneten Ort zu kopieren oder ihn mit wget von gist abzurufen. Wenn es jedoch nicht so viel ist, können Sie ihn wie folgt in eine Schleifenstruktur schreiben.
- name: add wsgi settings
lineinfile:
dest=/etc/apache2/httpd.conf
state=present
line={{ item }}
insertafter=EOF
with_items:
- "'WSGIScriptAlias / /var/www/hoge/wsgi.py'"
- "'WSGIPythonPath /var/www/hoge/'"
- "'<Directory /var/www/hoge/>'"
- "'<Files wsgi.py>'"
- "'Order deny,allow'"
- "'Allow from all'"
- "'</Files>'"
- "'</Directory>'"
Das Obige ist die Einstellung beim Hinzufügen von wsgi von Python zu httpd.conf von apache2. Es geht darum, zwei Anführungszeichen zu verwenden, einfache Anführungszeichen und doppelte Anführungszeichen, und Anführungszeichen in die for-Schleife und die Zeile einzufügen.
Eigentlich bin ich bisher nicht so glücklich, und diese vagabundierende + ansible Umgebung ist effektiv, wenn sie mit dem amazon ec2-Service kombiniert wird. Nächstes Mal werde ich darauf eingehen, wie es geht.
Recommended Posts