[PYTHON] Ansible, un outil d'automatisation d'infrastructure pour les personnes qui ne sont pas douées pour Ruby

introduction

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.

installation vagabonde

J'ai résumé l'installation vagabond plus tôt, alors jetez un œil là-bas.

installation d'ansible

Installez simplement avec pip.

$ pip install ansible

Préparation

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.

Échauffement

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.

Production: création d'un playbook

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

Obtenez la source de l'extérieur

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"

Exécution de la commande

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

exécution de pip

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

Ecrire un fichier de configuration

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.

Entrée multiligne

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.

finalement

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

Ansible, un outil d'automatisation d'infrastructure pour les personnes qui ne sont pas douées pour Ruby
Développement d'une application de calcul de table simple pour les personnes qui ne sont pas douées d'Excel
Collection d'exemples NumPy pour ceux qui ne sont pas bons en mathématiques
Mesures Java SE8 Gold (pour ceux qui ne sont pas bons dans ce domaine)
Aux personnes qui «recrutent mais ne recrutent pas»
[YOLO v5] Détection d'objets pour les personnes masquées et celles qui ne le sont pas