対象者

  • 今回の記事は下記ような人を対象としています。
    1. ansibleが何なのか、どういったものなのかをある程度理解をしている
    2. 誰かが構築したansibleを触ったことがある
    3. 自身では、まだansibleを構築したことない人

自分もまだ触り始めて半年も経ってない(というか自分で環境構築とか始めたのはつい1ヶ月くらい前くらいからです...)
ので、ベストプラクティスとかよくわかっていなかったり、誤った情報を書いてしまっているかもしれないので、何かあればご指摘の程宜しくお願い致します:bow:

ハンズオン開始

環境情報

種類 バージョン
OS centos6.7
ansible 2.3.1.0
python 2.6.6

CentOS環境構築

Ansible環境

  • 今回はvagrantを使用して、CentOS環境を構築します。
  1. Vagrant boxの確認

    $ vagrant box list  
    
    • 上記コマンドを実行してCentos6.5のvagrant boxが無ければ手順の2番へ、Centos6.7のvagrant boxが既にある方は2番を飛ばして下さい。
      • ※コマンドを実行して出てくるvagrant boxの名前はvagrant boxを追加するときに任意に設定するものなので必ずしもCentos6.7という名前とは限りません
  2. Centos6.7のvagrant boxを追加する

    $ vagrant box add centos6.7 https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box
    
    • vagrant box addの後に任意のboxの名前を付けている
  3. Vagrant初期化

    • 個人的にinitをするときに初期化っていうのがすごい気持ち悪い、、、
    $ vagrant init centos6.7    
    
  4. Vagrantfile修正

    • vagrant initするとVagrantfileが実行したディレクトリに生成されるので下記のように修正する
    Vagrantfile
    # Create a private network, which allows host-only access to the machine
    # using a specific IP.
    - # config.vm.network "private_network", ip: "192.168.33.10"
    + config.vm.network "private_network", ip: "192.168.33.10"
    
  5. Vagrant起動&ログイン

    $ vagrant up
    $ vagrant ssh
    

Ansible実行対象

  • 実際の運用に近づけるために、今回はAnsibleの実行対象用のvagrantの環境も作る
  1. Vagrant初期化

    $ vagrant init centos6.7    
    
  2. Vagrantfile修正

    • vagrant initするとVagrantfileが実行したディレクトリに生成されるので下記のように修正する
    Vagrantfile
    # Create a private network, which allows host-only access to the machine
    # using a specific IP.
    - # config.vm.network "private_network", ip: "192.168.33.10"
    + config.vm.network "private_network", ip: "192.168.33.11"
    
  3. Vagrant起動&ログイン

    $ vagrant up
    $ vagrant ssh
    

Ansibleインストール

  1. EPELリポジトリの追加

    $ sudo -y yum install epel-release
    
  2. Ansibleインストール

    $ sudo yum -y install ansible
    
  3. Ansible実行対象のvagrant環境にAnsibleの公開鍵を登録する

    • Ansibleサーバから対象のvagrant環境にSSHでノンパスでログインできるようにするため、公開鍵を送る
      • 対象サーバは192.168.33.11
    $ ssh-keygen -t rsa
    $ ssh-copy-id vagrant@192.168.33.11
    
  4. 接続確認

    • 下記コマンドを実行してパスワードを聞かれることなくログインできたらOK
    $ ssh vagrant@192.168.33.11
    

inventoryファイル作成

  • 対象のサーバを記述するファイル
  1. ansibleルートディレクトリー及び、iventoryディレクトリを作成する

    $ mkdir ansible ; cd $_
    $ mkdir inventory ; cd $_    
    
  2. 対象サーバのIPアドレスをhostsファイルに記載する

    • inventoryディレクトリ配下にhostsファイルを作成し対象サーバのIPを記載する
      • ※今回は192.1683.33.11
    ansible/inventory/hosts
    [target]
    192.168.33.11
    
    • 上記の[target]targetというグループ192.168.33.11というホストを属させている。
  3. 疎通確認

    • ansibleのルートディレクトリに移動して、ansibleコマンドを実行する
    $ cd ~/ansible
    $ ansible all -i hosts -m ping
    192.168.33.11 | SUCCESS => {
        "changed": false,
        "ping": "pong"
    }
    
    • -i {inventoryファイル名}でinventoryファイルを指定している
    • all を指定した場合、-i で指定したhostsに記載されているホスト全部が対象となる
    • -m {モジュール名}でモジュールを指定している

Playbookを作成

  • 大きく分けて、playbookには3つの事を定義する
    1. target
      • どこに誰が実行するか
    2. vars
      • 変数を指定する(taskで使用する)
        • ※実際はplaybookではなく変数用のディレクトリ・ファイルを作成して、共通化することがほとんど(所感)
    3. task
      • どんなことをするかモジュール使って記述する
  1. 変数を定義

    • group_vars/targets.ymlというファイルを作成する
    $ mkdir group_vars ; cd $_
    $ vi targets.yml
    
    • 下記を記載
    ansible/group_vars/targets.yml
    message: "Hello Ansible!"
    
    tokyo:
      edogawa:
        population: 68,2400
      katsushika:
        population: 44,4400
    
    
    • ※内容については特に意味はないです
  2. playbookの定義

    • 今回はdebugモジュールを使用してmsgに格納した文字列を対象サーバで出力するタスク
    ansible/test.yml
    - hosts: target
      user: vagrant
      tasks:
        - name: output message.
          debug: msg="{{ message }}"
    
        - name: output population downtown
          debug: msg="I was born {{ item.key }}, with a population {{ item.value.population }} people"
          with_dict: "{{ tokyo }}"  
    

Playbook実行

  1. ansibleのルートディレクトリでansibleを実行する

    • ansible-playbook -i inventory/hosts test.yml
      • -i {inventoryファイル名}で対象のホストを指定
      • test.ymlは実行するplaybookを指定している。
      • playbookの中で対象のホストをtargetというグループを指定しているので、おのずと変数もtarget.ymlを読み込むようになっている
        ※Ansibleでは決まったディレクトリなどから情報を暗黙的に取得するため、依存関係を理解しておく必要がある。
    $ cd ~/ansible
    $ ansible-playbook -i inventory/hosts test.yml
    
    PLAY [target] ***********************************************************************************************************************************************************************
    
    TASK [Gathering Facts] **************************************************************************************************************************************************************
    ok: [192.168.33.11]
    
    TASK [output message.] **************************************************************************************************************************************************************
    ok: [192.168.33.11] => {
        "msg": "Hello Ansible !"
    }
    
    TASK [output population downtown] ***************************************************************************************************************************************************
    ok: [192.168.33.11] => (item={'key': u'edogawa', 'value': {u'population': 68,2400}}) => {
        "item": {
            "key": "edogawa",
            "value": {
                "population": 68,2400
            }
        },
        "msg": "I was born edogawa, with a population 68,2400 people"
    }
    ok: [192.168.33.11] => (item={'key': u'katsushika', 'value': {u'population': 44,4400}}) => {
        "item": {
            "key": "katsushika",
            "value": {
                "population": 44,4400
            }
        },
        "msg": "I was born katsushika, with a population 44,4400 people"
    }
    
    PLAY RECAP **************************************************************************************************************************************************************************
    192.168.33.11              : ok=3    changed=0    unreachable=0    failed=0
    

ちょっと解説

output message.というtaskではdebugモジュールを使って、変数messageを出力しているだけですが、ディクショナリ形式で書いたtokyoの使い方ですが、このタスクはtokyo変数の値をwith_dictで要素の数だけループして取り出しながらdebugモジュールでメッセージを出力していきます。
ループ毎に取り出された要素はitemという定義済み変数に格納され、処理中に使うことができます。

↓こんな感じに要素が格納されている

(
  item={
         'key': u'edogawa', 
         'value': {
                    u'population': 68,2400
                  }
       }
 )

このときtokyo直下にある都市名はitem.keyで取得でき、都市名の下に持たせている人口数はitem.value.populationで取得されます。
今回だとループ毎にそれぞれ下記のような値が取得できる

  1. 一回目のループではitem.key == "edogawa"item.value.population == 68,2400
  2. 二回目のループではitem.key == "katsushika"item.value.population == 44,4400

終わりに

  • 超初歩的なハンズオンだが、少なくても変数を使わなければ2ファイルで実装できてしまう.....!!
.
├── group_vars
│   └── target.yml
├── inventory
│   └── hosts
└── test.yml

今回はただ、対象サーバで文字列を出力するだけのタスクになってしまいましたが、実際はyumやshell等のモジュールで色んなもののインストールとかをtaskに落とし込んで、コマンド1つで全部やってくれるのでとても楽です。
是非、他のモジュールを見てローカル環境で試してみてください!


あと、ちょっと近いうちに実践に近いものを書く予定です
roleとかtagsとか..暗号・復号化とか...

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.