[PYTHON] Ansible, ein Tool zur Automatisierung der Infrastruktur für Leute, die Ruby nicht gut können

Einführung

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.

vagabundierende Installation

Ich habe die vagabundierende Installation früher zusammengefasst, also schauen Sie dort nach.

Installation von Ansible

Einfach mit pip installieren.

$ pip install ansible

Vorbereitung

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.

Aufwärmen

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.

Produktion: Erstellen eines Spielbuchs

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

Holen Sie sich die Quelle von außen

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"

Befehlsausführung

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

Pip-Ausführung

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

Konfigurationsdatei schreiben

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.

Mehrzeiliger Eingang

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.

Schließlich

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

Ansible, ein Tool zur Automatisierung der Infrastruktur für Leute, die Ruby nicht gut können
Entwickelte eine einfache Tabellenberechnungs-App für Leute, die nicht gut in Excel sind
NumPy-Beispielsammlung für diejenigen, die nicht gut in Mathe sind
Java SE8 Gold misst (für diejenigen, die nicht gut darin sind)
An Menschen, die "rekrutieren, aber nicht rekrutieren"
[YOLO v5] Objekterkennung für maskierte und nicht maskierte Personen