LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

Ansible

Last updated at Posted at 2017-12-15

Ansible

準備

Ansible

$ sudo apt install ansible

or

$ brew install ansible

仮想マシン

  • Linux の VM を二台以上起動しておく
  • 今回は Azure で Ubuntu 18.04 で作った
  • 練習の時だけ起動するので、速めのプランでやった方がいい (時間が短いのでそんなに大した値段にならない)

はじめる

hosts ファイルを作る

コントロールするサーバーを列挙しておく。

hosts
52.191.141.92
52.191.139.213

グループ化もできる。

hosts
[servers]
52.191.141.92
52.191.139.213

/usr/bin/python3 を使う場合は以下のように書く。

hosts
[servers]
52.191.141.92
52.191.139.213

[servers:vars]
ansible_python_interpreter=/usr/bin/python3

ansible コマンド

$ ansible -i hosts -m ping 52.191.141.92
52.191.141.92 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

ping module は動作確認用。

複数マシンに対して同時に実行するには , で区切る。

$ ansible -i hosts -m ping 52.191.141.92,52.191.139.213
52.191.141.92 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
52.191.139.213 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

グループも指定できる。

$ ansible -i hosts -m ping servers
52.191.141.92 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
52.191.139.213 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

全部っていう指定も。

ansible -i hosts -m ping all
52.191.141.92 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
52.191.139.213 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

shell module を使うとシェル経由でコマンドを実行できる。

$ ansible -i hosts -m shell -a 'whoami' servers
52.191.141.92 | SUCCESS | rc=0 >>
masakura

52.191.139.213 | SUCCESS | rc=0 >>
masakura

サーバーの管理は root にならないとできないので、sudo を使う。--become 引数を使う。

$ ansible -i hosts -m shell -a 'whoami' --become servers
52.191.141.92 | SUCCESS | rc=0 >>
root

52.191.139.213 | SUCCESS | rc=0 >>
root

sudo のパスワードを要求されるケースでは、--ask-become-pass をつける。

$ ansible -i hosts -m shell -a 'whoami' --become --ask-become-pass servers
SUDO password: 
52.191.141.92 | SUCCESS | rc=0 >>
root

52.191.139.213 | SUCCESS | rc=0 >>
root

ファイルを作成するには copy module を使う。

$ ansible -i hosts -m copy -a 'dest=/etc/hoge.txt content="Hello, world!"' --become --ask-become-pass servers
SUDO password: 
52.191.141.92 | SUCCESS => {
    "changed": true, 
    "checksum": "943a702d06f34599aee1f8da8ef9f7296031d699", 
    "dest": "/etc/hoge.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "6cd3556deb0da54bca060b4c39479839", 
    "mode": "0644", 
    "owner": "root", 
    "size": 13, 
    "src": "/home/masakura/.ansible/tmp/ansible-tmp-1513321377.47-174888276599364/source", 
    "state": "file", 
    "uid": 0
}
52.191.139.213 | SUCCESS => {
    "changed": true, 
    "checksum": "943a702d06f34599aee1f8da8ef9f7296031d699", 
    "dest": "/etc/hoge.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "6cd3556deb0da54bca060b4c39479839", 
    "mode": "0644", 
    "owner": "root", 
    "size": 13, 
    "src": "/home/masakura/.ansible/tmp/ansible-tmp-1513321377.47-77663751945532/source", 
    "state": "file", 
    "uid": 0
}

"changed": true に注意。

もう一度実行する

$ ansible -i hosts -m copy -a 'dest=/etc/hoge.txt content="Hello, world!"' --become --ask-become-pass servers
SUDO password: 
52.191.141.92 | SUCCESS => {
    "changed": false, 
    "checksum": "943a702d06f34599aee1f8da8ef9f7296031d699", 
    "dest": "/etc/hoge.txt", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "path": "/etc/hoge.txt", 
    "size": 13, 
    "state": "file", 
    "uid": 0
}
52.191.139.213 | SUCCESS => {
    "changed": false, 
    "checksum": "943a702d06f34599aee1f8da8ef9f7296031d699", 
    "dest": "/etc/hoge.txt", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "path": "/etc/hoge.txt", 
    "size": 13, 
    "state": "file", 
    "uid": 0
}

"changed": falsefalse になってる。

殆どのモジュールは不要であれば実行されない。今回の場合、ファイルの内容やパーミッションが変化しないので何もされなかった。

ansible-playbook コマンド

Playbook というファイルを作ることで何度も同じことができます。以下を Playbook 化してみます。

$ ansible -i hosts -m copy -a 'dest=/etc/hoge.txt content="Hello, world!"' --become --ask-become-pass servers

こんな感じです。

servers.yml
- hosts: servers
  become: yes
  tasks:
    - copy: dest=/etc/hoge.txt content="Hello, world!"

ちょっとわかりにくいと思うので JSON で書き直した例です。(こちらでも動きます)

servers.yaml
[
  {
    "hosts": "servers",
    "become": true,
    "tasks": [
      {
        "copy": "dest=/etc/hoge.txt content=\"Hello, world!\""
      }
    ]
  }
]

実行します。

$ ansible-playbook -i hosts --ask-become-pass servers.yml
SUDO password:

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [52.191.141.92]
ok: [52.191.139.213]

TASK [copy] ********************************************************************
changed: [52.191.141.92]
changed: [52.191.139.213]

PLAY RECAP *********************************************************************
52.191.141.92              : ok=2    changed=1    unreachable=0    failed=0
52.191.139.213             : ok=2    changed=1    unreachable=0    failed=0

もう一度実行すると、changedok に変わります。

$ ansible-playbook -i hosts --ask-become-pass servers.yml
SUDO password:

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [52.191.141.92]
ok: [52.191.139.213]

TASK [copy] ********************************************************************
ok: [52.191.141.92]
ok: [52.191.139.213]

PLAY RECAP *********************************************************************
52.191.141.92              : ok=2    changed=0    unreachable=0    failed=0
52.191.139.213             : ok=2    changed=0    unreachable=0    failed=0

tasks の書き方はバリエーションがありますので紹介します。

引数も含めて一行で書けますが、一般的にはあまり使われないと思います。長くなると読みにくいです。

  tasks:
    - copy: dest=/etc/hoge.txt content="Hello, world!"

こう書いた方がいいでしょう。

  tasks:
    - copy:
        dest: /etc/hoge.txt
        content: Hello, world!

もちろん、tasks は複数書けます。

  tasks:
    - copy:
        dest: /etc/a.txt
        content: A
    - copy:
        dest: /etc/b.txt
        content: B

role を使う

このまま続けていくと YAML が肥大化します。メンテナンス性が悪化するので、ロールに分割します。分割の設計をどうするかは置いておいて、とりあえずロールを作ります。

$ mkdir -p roles/test/tasks
roles/test/tasks/main.yml
---
- name: create hoge.txt
  copy: dest=/etc/hoge.txt content="Hello, world!"

もちろん以下のように書くこともできますし、こちらの方がおすすめです。

roles/test/tasks/main.yml
---
- name: create hoge.txt
  copy:
    dest: /etc/hoge.txt
    content: Hello, world!

servers.yml ファイルをこう書き換えます。

servers.yml
- hosts: servers
  become: yes
  roles:
    - test

同じように実行できます。

$ ansible-playbook -i hosts --ask-become-pass servers.yml
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