11
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ansible入門 その2 Playbook

Posted at

この記事はAnsible入門 その1 インストール〜コマンド実行の続きです。

前回はansibleがリモートマシン(というかvagrant環境)に接続できるところまでやりました。

今回はPlaybookを使ってリモートマシン側で色々と自動的にインストールしてくれたりする部分をやっていきたいと思います。

## Playbookの書き方

PlaybookはYAMLファイルです。YAMLについてよく知らないという方は、こちらの記事などをご覧になると良いと思います。XMLとかJSONみたいなやつです。

今回はyumでvimとgitをインストールしたいと思ったのでそのやり方を考えてみます。

1.vimとgitをインストールする

こちらの記事を参考にさせていただき以下のようなplaybook.ymlファイルを作成しました。

- hosts: all
  become: yes
  user: vagrant
  tasks:
      - name: install via yum
        yum: name={{ item }} state=installed
        with_items:
            - vim
            - git

そして、playbook.ymlファイルのあるディレクトリで

$ ansible-playbook playbook.yml

とコマンドを打つとvimとgitがインストールされるはずです。

ansible-playbookコマンドが登場しましたが、ansibleコマンドとの違いはこちらの記事にまとまっています。ansibleを使う場合はplaybookを使うことが多分ほとんどだと思います。

hostsにホスト名、becomeにsudoするかどうか、userにユーザー名を設定します。
tasksにはansibleでリモートマシンに実行させたいことを書いていきます。
tasks内のnameには好きな名前つけていいみたいです。

2.使用可能なオプションとか文法を確認する

さっきのplaybookの中に、yum: name={{ item }} state=installedという箇所がありました。
このnameやstateというオプションは何なのかというと、yumの場合はここにまとまっています。

ここに出てくるyumとかの実行するコマンドに相当するやつはモジュールと呼ぶらしいのですが、どういうモジュールが用意されているかはこのページに一覧があります。

{{ item }}という文法が気になりますが、これはその次の行のwith_items:という配列の要素が突っ込まれるということみたいです。

{{ }}で囲んであるのは変数で、YAML内で宣言した値を使えるみたいです。

- hosts: all
  become: yes
  user: vagrant
  vars: 
    hoge: !unsafe 'fuga'
  tasks:
    - name: debug test
      debug: msg="{{ hoge }}"

コマンドラインから変数を渡すこともできます。
$ ansible-playbook playbook.yml --extra-vars "hoge=fuga"

これの結果は以下のようになります。

PLAY [all] *******************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************
ok: [vagrant@192.168.33.10]

TASK [debug test] ************************************************************************************************************************************************************
ok: [vagrant@192.168.33.10] => {
    "msg": "fuga"
}

PLAY RECAP *******************************************************************************************************************************************************************
vagrant@192.168.33.10      : ok=2    changed=0    unreachable=0    failed=0

変数についてはこちらにドキュメントがあります。

with_items: はループを扱える文法です。

- hosts: all
  become: yes
  user: vagrant
  tasks:
    - name: debug test
      debug: msg={{ item }}
      with_items:
          - hoge
          - fuga
          - piyo

これの結果は以下のようになります。

$ ansible-playbook loop.yml

PLAY [all] *******************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************
ok: [vagrant@192.168.33.10]

TASK [debug test] ************************************************************************************************************************************************************
ok: [vagrant@192.168.33.10] => (item=hoge) => {
    "changed": false,
    "item": "hoge",
    "msg": "hoge"
}
ok: [vagrant@192.168.33.10] => (item=fuga) => {
    "changed": false,
    "item": "fuga",
    "msg": "fuga"
}
ok: [vagrant@192.168.33.10] => (item=piyo) => {
    "changed": false,
    "item": "piyo",
    "msg": "piyo"
}

PLAY RECAP *******************************************************************************************************************************************************************
vagrant@192.168.33.10      : ok=2    changed=0    unreachable=0    failed=0

連想配列も使えます。

- hosts: all
  become: yes
  user: vagrant
  tasks:
    - name: debug test
      debug: "msg=hoge: {{ item.hoge }}, fuga: {{ item.fuga }}, piyo: {{ item.piyo }}"
      with_items:
          - { hoge: 'foo',    fuga: 'bar',    piyo: 'baz'   }
          - { hoge: 'qux',    fuga: 'quux',   piyo: 'corge' }
          - { hoge: 'grault', fuga: 'garply', piyo: 'waldo' }

結果

PLAY [all] ***********************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************
ok: [vagrant@192.168.33.10]

TASK [debug test] ****************************************************************************************************
ok: [vagrant@192.168.33.10] => (item={u'fuga': u'bar', u'piyo': u'baz', u'hoge': u'foo'}) => {
    "changed": false,
    "item": {
        "fuga": "bar",
        "hoge": "foo",
        "piyo": "baz"
    },
    "msg": "hoge:"
}
ok: [vagrant@192.168.33.10] => (item={u'fuga': u'quux', u'piyo': u'corge', u'hoge': u'qux'}) => {
    "changed": false,
    "item": {
        "fuga": "quux",
        "hoge": "qux",
        "piyo": "corge"
    },
    "msg": "hoge:"
}
ok: [vagrant@192.168.33.10] => (item={u'fuga': u'garply', u'piyo': u'waldo', u'hoge': u'grault'}) => {
    "changed": false,
    "item": {
        "fuga": "garply",
        "hoge": "grault",
        "piyo": "waldo"
    },
    "msg": "hoge:"
}

PLAY RECAP ***********************************************************************************************************
vagrant@192.168.33.10      : ok=2    changed=0    unreachable=0    failed=0

ついでなので条件分岐もみてみます。

例文


- hosts: all
  become: yes
  user: vagrant
  tasks:
      - name: condition
        debug:
            msg: "{{ item.message }}"
        when: (item.print == 'true')
        with_items: 
            - { message: 'hello', print: 'true'  }
            - { message: 'world', print: 'false' }

結果


$ ansible-playbook condition.yml

PLAY [all] **************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************
ok: [vagrant@192.168.33.10]

TASK [condition] ********************************************************************************************************************************************
ok: [vagrant@192.168.33.10] => (item={u'print': u'true', u'message': u'hello'}) => {
    "changed": false,
    "item": {
        "message": "hello",
        "print": "true"
    },
    "msg": "hello"
}
skipping: [vagrant@192.168.33.10] => (item={u'print': u'false', u'message': u'world'})

PLAY RECAP **************************************************************************************************************************************************
vagrant@192.168.33.10      : ok=2    changed=0    unreachable=0    failed=0

item.printが'true'のときだけメッセージが出力されているのがわかります。

つまり、taskの中のwhenの値がyesかnoかによって実行させるかさせないかを決めることができます。

サーバーの状態によってコマンドを実行したりしなかったりできそうです。

その3に続く。。はず。。

11
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?