Python ansible 自動化

Python学習【365日チャレンジ!】257日目のマスターU(@Udemy11)です。

アメリカ大統領選挙も投票日が近いということで、アメリカは結構両陣営の対立がヒートアップしていますね。

日本にいれば、入ってくる情報は、民主党びいきの報道がほとんどということで、トランプを批判した情報が多いのですが、そこまで批判されているのになぜ4年前に大統領になれたのかという疑問が湧いてきます。

メディアが報道している内容がリアルなのかフェイクなのかしっかりと見極める必要がありそうなので、少し調べてみたところ、いろいろと問題があるようです。

大手のメディアはほとんどが民主党を支持していて、トランプ大統領の失脚を狙った報道をしていたとか、バイデン候補はロシアから賄賂を受け取っているとか、民主党やセレブがアメリカをコントロールして自分たちのいいように支配しようとしているなんて記事も見つけることができます。

調べれば調べるほど、いったい何を信じたらいいのかよくわかなくなってきますね。

ま〜、テレビのドラマでやっているような一般人にはわからない怪しいことは存在するんでしょうけど、どちらが勝っても、国民のための政治をやってもらいたいものです。

それでは今日もPython学習を始めましょう。

昨日の復習

昨日は、自動化ができるAnsibleを調べてみました。

インフラ構築を自動化するツールは他にもあるなかで、Ansibleは、管理専用のエージェントソフトを必要としないエージェントレスであるのが特徴でした。

設定ファイルはYAML形式のファイルを使っていて、少し設定が難しそうという感じでした。

詳細については、昨日の記事をごらんください。

今日は、Ansibleを使って自動でアプリケーションをサーバーにインストールする方法を学習します。

ファイル構造

今回Ansibleで自動化を設定するためのファイル構造(commonの設定まで)はこのようになります。

Python ansible 自動化

前回はFabricを使った自動化だったので、fab_projectフォルダに設定ファイルを用意しましたが、今回は、Ansibleなので、ansible_projectフォルダに設定ファイルを作っていきます。

トップの階層には、rolesフォルダ、investoriesフォルダ、site.ymlファイルをつくっています

investoriesフォルダの中には、hostsフォルダを作ってその中にhosts.txtを作成します。

rolesフォルダの中にcommonフォルダとwebserverフォルダを用意して、それぞれの中にtasksフォルダをつくり、さらにその中にmain.ymlファイルを作成します。(今回はcommonなのでwebserverフォルダは展開していません。)

今回は、commonの設定を行いますので、commonフォルダの中にinstall-packages.ymlファイルも作成します。

それぞれのファイルを順番に見ていきましょう。

site.yml

設定のためのymlファイルは、---(ハイフン3つ)で始めて、最後の行は...(ピリオド3つ)で締めくくります。

---

- hosts: webservers

  roles:
    - common

...

3行目でhostsの設定をwebserversに指定して、rolesは、commonを読みにいってくださいというコードになります。

hosts.txt

次に、hostsの設定で読み込まれるwebserversに関するコードです。

[webservers]
server2 ansible_host=172.16.200.102 ansible_port=22 ansible_user=root ansible_ssh_pass=root ansible_python_interpreter=/usr/bin/python3

なんとなくわかるかと思いますが、サーバー名、ホスト、ポート、ユーザーID、パスワード、使うPythonのパスを指定しています。

main.yml

こちらは、site.ymltasksで指定したcommonによって読み込まれるファイルです。

commonが指定されているので、その下のtasksフォルダの中にあるmain.ymlが実行されることになります。

---

- include_tasks: install-packages.yml

...

名前のとおり、メインの設定ファイルなので、このファイルに設定をすべて書き込むことも可能ですが、Pythonの得意技であるパーツ分けをすることでわかりやすくなります。

1行だけのコードになりますが、install_packages.ymlを読み込むだけのコードになります。

今回読み込むファイルが一つだけですが、こちらのファイルに別のパーツを設定するYAMLファイルを読み込ませることもできます。

install_packages.yml

今回実際に実行される設定ファイルinstall_packages.ymlを書いていきます。

---

- name: Add universe repo
  apt_repository:
    repo: deb http://archive.ubuntu.com/ubuntu xenial universe
    state: present
    update_cache: yes

- name: Install packages
  apt:
    name:
      - python3-setuptools
      - software-properties-common

- name: Install pip
  apt:
   name:
     - python-pip
     - python3-pip
   state: latest

...

3行目、9行目、15行目のnameは、それぞれのコマンドのコメントのようなもので、何をするのかわかりやすいタイトルにします。

3行目から7行目はubuntuxenial universeの現在のバージョンをインストールしますが、7行目でインストールする前にapt-get updateを実行します。

9行目から13行目では、setuptoolssoftware-properties-commonをインストールしています。

15行目から20行目でpipをインストールしています。

酒井さんのレクチャーでは、5行目から7行目でname: "{{ item }}"としてwithステートメントを使ったコードにしていたのですが、どうもうまくいかなかったので、こちらのコードに変更しました。

また、9行目からのpipのインストールもeasy_installを使うとエラーが起こっていたので、このコードに変更しました。

実行結果

ということで、今回もかなりハマりまくって、過去のQ&Aをみながらなんとかエラーが起こらないコードにすることができました。

このコードを一旦実行してみると次のようにエラーが無く終了しました。

黄色のchangedが気になりますが、こちらは、ファイルなどを新しく設置したときの表示のようです。

ちなみにinstall_packagesは新しくパッケージをインストールしているので、1回めならchangedになるはずですが、すでに何度か実行してパッケージが存在するためokという表示になっています。

まとめ

これまでに何度も紹介していますが、現在学習しているのは、シリコンバレーで活躍中のプログラマー酒井さんの下記の講座です。

Udemy講師 酒井さん プログラミング Python

酒井さんの講座は、Pythonの基本から応用までを幅広く網羅しているのですが、若干古いコードを使っているレクチャーが残っているので、私が使っているバージョンとは違い、色々とエラーが起こるところがあります。

基本的に、自分でエラーの原因を突き止めて解決する必要があるので、ハマってしまったときはかなり勉強になりますし、最終的にはQ&Aで質問すれば、解決に繋がります。

ま〜、自分が引っかかっているところは、他の受講生も引っかかっている可能性があるので、すでに質問で解決していたりするとすぐに問題を解決することができます。

ほんと今回はかなりハマってしまったので、次のwebserverでもハマりそうなので、ちょっと怖いのですが、進まないことには始まらないので、明日もじっくりコードと向かい合おうと思います

それでは明日もGood Python!