Oisix ra daichi Creator's Blog(オイシックス・ラ・大地クリエイターズブログ)

オイシックス・ラ・大地株式会社のエンジニア・デザイナーが執筆している公式ブログです。

Ansibleで有意義な夏のインターンに!!

はじめに

SREセクションでインターンに参加しています杉尾秀真と申します。 この記事では、私が今回オイシックス・ラ・大地のインターンで学んだことをまとめていきます!

インターン目標

プロジェクトのミッション

WindowsServer をAnsibleで管理する

自分のミッション

  • 1個以上の新しいスキルを身につける
  • インターン終了までにSREセクションのメンバ全員とコミュニケーションを取る

取り組んだこと

今回のインターンでは"WindowsServerをAnsibleで管理する"のプロジェクトに取り組んでいきました。
本プロジェクトで学んでいったことを以下にまとめていきたいと思います!!

①環境構築

インターンが始まってまず取り組んだのは、環境構築です。 AnsibleをPCにインストールしたり、AWSにアクセスし必要なインスタンスを構築したり、GitHubのアカウント作成などを行いました。このインターンの中で、この環境構築がなんだかんだ一番大変であったのではないかと個人的に思っています。

②簡単なPlaybookの作成

Ansibleの実行形式ファイルであるPlaybook をたくさん作成していきました。
以下には、各お題に対して作成したPlaybook中からいくつか記載しています!

  • Playbook中で変数を指定し、内容を表示
- name: Hello World!
  hosts: localhost
  vars:
    - message_text: Hello World!
  tasks: 
    - debug: 
        msg: "{{ message_text }}"
  • 対話式で変数を入力し、内容を表示
- name: Input vars
  hosts: localhost
  gather_facts: false

  vars_prompt:
  - name: input_var
    prompt: "input: "
    confirm: no
    private: no
    default: "Hello World, default"

  tasks:
    - debug:
        msg: "{{ input_var }}"

③WindowsServerでいろいろなmoduleを使ってみる

作成したPlaybookの処理内容は以下の通りです。

  • タイムゾーンを日本時間に変更する
  • ファイルをリモートへコピーする
    • hostnameコマンドを実行するPowershell scriptファイル
    • 画像ファイル
  • PowerShellを実行する
    • 最初にリモートへコピーしたPowershell scriptファイルを実行する
  • ローカルのコンピュータ名(ホスト名)を変更
    • コンピュータ名はinventoryの変数で指定する
    • コンピュータ名の変更には再起動が必要になるので、変更があった場合は再起動する

 

- name: Windows playbook
  hosts: all
  gather_facts: false

  tasks:
    - name: Timezone
      community.windows.win_timezone:
         timezone: Tokyo Standard Time

    - name: Copy directory to remote
      ansible.windows.win_copy:
         src: ./remote_copy
         dest: "C:\Temp"

    - name: Run PowerShell script
      ansible.windows.win_shell: "C:\Temp\remote_copy\hostname.ps1"
      register: res1
    
    - name: Check the PowerShell script
      debug:
        msg: "{{ res1 }}"

    - name: Rename hostname
      ansible.windows.win_hostname:
        name: "{{ win_hostname }}"
      register: res2

    - name: Reboot
      ansible.windows.win_reboot:
      when: res2.reboot_required

Windows ではLinux と異なる接続方式やモジュールを使用するので、少し苦労しました。

④Webサーバを構築する

今回、このインターンで私はAnsibleの操作のほかに、自分で作成したhtmlファイルがサーバ上で実際に動作する様子を見たい思いも凄くあり、この4つ目の内容に関してはエキサイトな気持ちで取り組んでおりました!!

作成したPlaybookの処理内容は以下の通りです。また、実行対象はLinuxサーバです。

  • yum モジュールでhttpd をインストールする

  • systemd モジュールでApache httpdサービスを開始し、かつenabledにする

  • 手元にtest.htmlファイルを用意し、copy モジュールでLinuxサーバの/var/www/htmlの配下へ送る

  • ブラウザからhttp://<public IP>http://<public IP>/test.htmlにアクセスし、Apache http の画面と、テストで書いたhtmlの内容が表示されるのを確認する

作成したPlaybookは以下の通りです。

- name: Install Apache HTTPD
  hosts: all
  become: yes # root ユーザになる
  gather_facts: false

  tasks:
  - name: Install httpd
    yum:
      name: httpd
      state: present

  - name: Start httpd
    systemd:
      name: httpd
      state: started
      enabled: yes

  - name: Create target dir
    file: path=/var/www/html state=directory

  - name: Copy html
    ansible.builtin.copy:
      src: ./test.html
      dest: /var/www/html/test.html
      follow: no

確認で表示させるhtmlには下記のコードを作成し、使用しました。

<h2>CatPhotoApp</h2>
<main>
  <p>Click here to view more <a href="#">cat photos</a>.</p>

  <a href="#"><img src="https://cdn.freecodecamp.org/curriculum/cat-photo-app/relaxing-cat.jpg" alt="A cute orange cat lying on its back."></a>

  <p>Things cats love:</p>
  <ul>
    <li>cat nip</li>
    <li>laser pointers</li>
    <li>lasagna</li>
  </ul>
  <p>Top 3 things cats hate:</p>
  <ol>
    <li>flea treatment</li>
    <li>thunder</li>
    <li>other cats</li>
  </ol>

  <form action="https://www.freecatphotoapp.com/submit-cat-photo">
    <label for="indoor"><input id="indoor" type="radio" name="indoor-outdoor" value="indoor" checked> Indoor</label>
    <label for="outdoor"><input id="outdoor" type="radio" name="indoor-outdoor" value="outdoor"> Outdoor</label><br>
    <label for="loving"><input id="loving" type="checkbox" name="personality" value="loving" checked> Loving</label>
    <label for="lazy"><input id="lazy" type="checkbox" name="personality" value="lazy"> Lazy</label>
    <label for="energetic"><input id="energetic" type="checkbox" name="personality" value="energetic"> Energetic</label><br>
    <input type="text" placeholder="cat photo URL" required>
    <button type="submit">Submit</button>
  </form>
</main>

ブラウザからアクセスした画面

この後、AWSでApplication Load Balancer の作成とRoute53でドメインの設定をすることで、IPアドレスではなくドメインでアクセスできるようになったことも確認できました。普段自分が見ているURLの構成になっており、完成できた時にはすごく感動しました!

まとめ

今回のインターンでは、主に環境構築、AWSの操作、インスタンス作成、Playbookの作成、Ansibleの実行、Webページの構築方法etc. たくさんのことを学ばさせていただきました。この中でも一番大変であったのは、環境構築ですね。実際にやってみてなかなか自分一人では難しいと思いながら、青木さんにサポートいただきながら取り組みました。これからエンジニアを目指す上での大きな一歩をこのインターンで踏み出せたと個人的に思っております。今回の経験を活かして、サイトを作ってみたり、もっとAWSについて学習していきたいと思いました。また、学生のうちからAnsibleのことを学べる経験はとても貴重であったので、それも極めていきたいです!
それから、インターンの目標と自分のミッションに関しては、Playbookをたくさん作成しましたし、SREセクションの皆さんとたくさんコミュニケーションをとることができたので、ミッション大成功だと思います!SREセクションの皆さん本当にありがとうございました😊 また、どこかでお会いしましたら、その時はよろしくお願いします。

メンターからのコメント

こんにちは。杉尾さんのメインメンターを担当しましたSREセクション青木です。
今回のインターンでは、ORDではなかなか実現が進まなかったAnsibleでのWindows Serverの構成管理に取り組んでいただきました。
Ansible はもちろん、LinuxやAWS、Git は初体験ということで、学んでいただくことが盛り沢山でしたが、吸収が早く、実質10日間で予想以上の成長を見せてくれました。 Windows Server のAnsible管理は杉尾さんの取り組みを機にチーム内でどんどん進めていきたいと思います。
最後に実施していただいたWebサイトの構築は、杉尾さんの熱い想いを受けて提案させていただきました。 今回は一番基本的な構成でシンプルに作っていただきましたが、Docker を利用してローカルでお手軽に構築する方法や、 GitHub Pagesで静的Webサイトを公開する方法にもトライしていただけると、さらに楽しめると思います(お家でぜひ)。
あっという間でしたが私自身もとても楽しかったです!インターン先にORDを選んでいただきありがとうございました 🎉

Oisix ra daichi Creator's Blogはオイシックス・ラ・大地株式会社のエンジニア・デザイナーが執筆している公式ブログです。

オイシックス・ラ・大地株式会社では一緒に働く仲間を募集しています