Je pense que je devrais commencer à apprendre Ruby avec Ruby de quelque manière que ce soit dans le monde, mais j'aimerais pouvoir écrire la même chose avec python. De nos jours, derrière le célèbre outil d'automatisation d'infrastructure chef, un outil d'automatisation avec python J'ai entendu qu'il y en avait un et j'ai essayé de l'utiliser immédiatement. Ici, nous allons présenter la procédure de configuration d'un environnement distant avec vagrant et de configuration de la machine distante avec ansible. L'environnement hôte est Mac OS X Mavericks.
J'ai résumé l'installation vagabond plus tôt, alors jetez un œil là-bas.
Installez simplement avec pip.
$ pip install ansible
Tout d'abord, préparez une machine distante.
$ 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
Si vous disposez déjà d'une boîte appropriée, vous n'avez pas besoin d'exécuter la commande box add. Cette fois, pour diverses raisons, j'utiliserai la version amd64 d'ubuntu 12.04. D'autres sites l'introduisent souvent en centos, et j'ai pensé qu'il serait utile d'avoir un site qui décrit également comment le gérer avec apt-get, alors je l'ai fait.
Après vagrant init, un Vagrantfile sera créé dans votre répertoire de travail. Modifiez le contenu pour configurer un réseau entre l'hôte et l'invité.
config.vm.network :private_network, ip: "192.168.33.10"
Plus précisément, décommentez simplement ce qui précède. L'adresse IP reste la valeur par défaut, mais vous pouvez la modifier à votre guise.
Ensuite, écrivez les paramètres dans ~ / .ssh / config afin de pouvoir y accéder sans mot de passe.
Host 192.168.33.10
User vagrant
IdentityFile /Users/<username>/.vagrant.d/insecure_private_key
Enfin, définissez le fichier hosts sur ansible. Cela peut être celui par défaut, mais ce n'est pas facile à utiliser, il vaut donc mieux le faire
[servers]
192.168.33.10 #Spécifiez l'adresse IP du système d'exploitation invité
Écrivez le contenu ci-dessus dans un fichier appelé hosts dans le répertoire ansible-test. Vous pouvez en écrire plusieurs comme nom de serveurs.
Modifiez en fonction de votre environnement.
Ceci termine la préparation.
Je n'ai pas vraiment besoin de ce chapitre, mais avant de passer au playbook, je vais vous présenter l'utilisation de base d'ansible. Ce contenu est le même que les autres sites, donc si vous ne l'aimez plus, vous devriez passer à autre chose.
Tout d'abord, la confirmation de ping habituelle.
$ ansible -i hosts servers -m ping
192.168.33.10 | success >> {
"changed": false,
"ping": "pong"
}
Exécution de la commande
$ ansible -i hosts servers -a 'pwd'
192.168.33.10 | success | rc=0 >>
/home/vagrant
Si vous pouvez le copier, passez à la suivante.
L'essence de cet outil n'est pas une opération à distance (l'opération à distance peut être effectuée avec ssh), mais une configuration automatique de l'infrastructure, alors essayez la configuration automatique de l'environnement à l'aide d'un fichier yaml appelé playbook.
Les pages que j'ai vues jusqu'à présent ont introduit la méthode utilisant yum, donc le playbook présenté ici est la spécification apt-get d'ubuntu (bien sûr, certains sites utilisent apt). Afin de voir s'il peut être utilisé de manière pratique, essayez de préparer un environnement qui nécessite une procédure légèrement compliquée. Cette fois, je vais installer Theano, qui est un package Python utilisé en Deep Learning.
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
Tout d'abord, vérifiez si ce yaml est grammaticalement incorrect.
$ ansible-playbook -i hosts playbook_theano.yaml --syntax-check
Si ce n'est pas faux, exécutez.
$ ansible-playbook -i hosts playbook_theano.yaml
Il n'est pas nécessaire de spécifier le serveur cette fois car il est spécifié dans le fichier yaml, puis chaque commande est exécutée en séquence. Le résultat de l'exécution est le suivant
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
Vérifiez s'il est réellement installé.
$ 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:~$
Ça a l'air bien. De plus, dans ce fichier yaml, j'ai également installé un ensemble de packages pour utiliser theano sur GPU, mais je ne peux pas l'utiliser avec VirtualBox, donc je suis désolé.
De plus, je pense que vous devrez répéter plusieurs fois vagrant destroy et vagrant up pour vérifier si une installation propre est possible jusqu'à ce que la construction passe correctement, mais si l'adresse IP utilisée est la même, ssh lancera une erreur. N'oubliez pas de supprimer ~ / .ssh / known_hosts (ou de ne supprimer que la partie pertinente) à chaque fois.
Playbook Tips
Un bref résumé de la collection de tâches utilisée dans le playbook
apt-get
Il existe un module apt.
- 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
Dans l'ordre du haut, il s'agit d'un exemple de configuration d'apt-get update, apt-get upgrade, apt-get dist-upgrade, apt-get install.
Si vous souhaitez installer plusieurs packages à la fois, vous pouvez inclure une boucle.
- 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
Parfois, vous voulez construire à partir des sources sans passer par un système de gestion de paquets. Dans ce cas, la source est obtenue avec le module get_url.
- 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"
Utilisez le module de commande si vous voulez une exécution de commande plus pure
- name: dpkg install cuda repo
command: dpkg -i /home/vagrant/cuda-repo-ubuntu1204_6.0-37_amd64.deb
Un module pour pip est également disponible.
- name: pip install nose
pip: name=nose
Cependant, si vous essayez de faire quelque chose d'un peu compliqué, cela conviendra, il peut donc être préférable de le spécifier directement avec une commande.
- name: pip install theano
command: /usr/bin/pip install --upgrade --no-deps git+git://github.com/Theano/Theano.git
Utilisez le module lineinfile pour modifier les paramètres tels que PATH
- 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
Cette fois, je viens d'ajouter une ligne à la fin du fichier, mais cela fournit également une fonction pour trouver la ligne spécifiée avec une expression régulière et la réécrire.
La saisie de plusieurs lignes ne fonctionne pas simplement en insérant un disjoncteur. Il est plus simple de cloner git puis de le copier dans un emplacement approprié, ou de le récupérer à partir de gist avec wget, mais si ce n'est pas tellement, vous pouvez l'écrire dans une structure de boucle comme suit.
- 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>'"
Ce qui précède est le paramètre lors de l'ajout de wsgi de python à httpd.conf d'apache2. Le but est d'utiliser deux guillemets, des guillemets simples et des guillemets doubles, et mettre des citations dans la boucle et la ligne for.
En fait, je ne suis pas si content pour l'instant, et cet environnement vagrant + ansible est efficace lorsqu'il est combiné avec le service amazon ec2. La prochaine fois, je parlerai de la façon de procéder.
Recommended Posts