読者です 読者をやめる 読者になる 読者になる

CentOS 7 - Ansible のはじめ方

サーバの初期構築が面倒になってきたので、今更 Ansible を使いはじめました。

使い方も非常にシンプルで簡単ですし、エージェントのインストールが不要なところも素敵です。

 

本投稿では、基本的なAnsibleの利用方法とPlaybookの書き方を紹介します。

 

はじめに

 

Ansibleとは、Pythonで記述された構成管理ツールです。他にも代表的な構成管理ツールとして、chef、puppetなどがあるそうです。

 

作業内容

1.Ansibleをインストールする

2.Ansibleコマンドを実行する

3.playbookを作成・実行する

 

作業環境
OS: CentOS 7.1
サーバ: ConoHa 1Gタイプ 2台※

※2台の役割は、Ansibleをインストールするサーバと管理対象のサーバです。

 

 

1.Ansibleをインストールする

 

Yumリポジトリを追加

Ansibleのインストールには、Yumの追加リポジトリであるEPELが必要です。

EPELは、Yumでインストールできます。

# yum install epel-release

 

 

Ansibleをインストール

EPELのインストール作業が終わったら、YumでAnsibleをインストールします。

# yum install ansible sshpass

ここでは、Ansibleと一緒に sshpass もインストールしておきましょう。

 

 

動作検証

Ansibleのバージョンを確認してみましょう。

# ansible --version
ansible 1.9.1

エラーもなく、バージョンが表示されればインストールは完了です。

 

 

2.Ansibleコマンドを実行する

 

ansible.cfgを編集

Ansibleでは、「/etc/ansible/ansible.cfg」に初期状態の設定がされている。

特に以下の部分を注意して確認しましょう。

# cat /etc/ansible/ansible.cfg
~略~
[defaults]

# some basic default values...

inventory      = /etc/ansible/hosts
#library        = /usr/share/my_modules/
remote_tmp     = $HOME/.ansible/tmp
pattern        = *
forks          = 5
poll_interval  = 15
sudo_user      = root
#ask_sudo_pass = True
#ask_pass      = True
transport      = smart
#remote_port    = 22
module_lang    = C

~略~

 

ansible.cfgの一部設定を編集します。

まず、編集前にバックアップを取得しましょう。

# cp -v /etc/ansible/ansible.cfg{,.old}
‘/etc/ansible/ansible.cfg’ -> ‘/etc/ansible/ansible.cfg.old’

 

つぎに先ほど、コメントアウトされていた、「#ask_pass」のコメントアウトを以下のコマンドで外します。

ask_passのコメントアウトを外すことにより、ansibleコマンドの実行時にSSHに必要なパスフレーズを問い合わせるようになります。

# sed -i "s/^\#ask\_pass/ask\_pass/g" /etc/ansible/ansible.cfg

 

加えて、SSHを行うために必要なユーザも指定しておきます。

vimなどで、ansible.cfgを直接編集し、「sudo_user」の上くらいに「remote_user」を追加してください。

~略~
[defaults]

# some basic default values...

inventory      = /etc/ansible/hosts
#library        = /usr/share/my_modules/
remote_tmp     = $HOME/.ansible/tmp
pattern        = *
forks          = 5
poll_interval  = 15
remote_user    = root
sudo_user      = root
#ask_sudo_pass = True
#ask_pass      = True
transport      = smart
#remote_port    = 22
module_lang    = C

~略~

私は、remote_userにrootを設定しました。SSHユーザがrootではない場合、皆さんの環境に合わせて変更してください。

 

 

管理対象サーバを登録

ansibleコマンドを使う前に、管理対象サーバの登録が必要です。登録は、「/etc/ansible/hosts」に行います。

# printf "[conoha]\n133.130.xxx.85\n" >> /etc/ansible/hosts
# tail -n 2 /etc/ansible/hosts
[conoha]
133.130.xxx.85

/etc/ansible/hostsの行末に設定が追加されていることを確認できました。

※管理対象サーバはIPアドレスまたは、正引きが可能なドメイン名で記述してください。

※「[conoha]」の部分は、グループ名だと思ってください。覚えやすい名前で登録してください。

 

ansibleコマンドを実行

ansibleコマンドの構成は以下の通りです。

# ansible [グループ名] -m [モジュール名] -a ["アクション"]

 

ansibleコマンドを実行してみましょう。

# ansible conoha -m command -a "echo $USER"
SSH password:
133.130.xxx.85 | success | rc=0 >>
root

内容を少し解説するとconohaグループに属しているサーバに対して、commandモジュールを使い「echo $USER」を実行させた結果が「root」と出力されています。

 他にも多くのモジュールがありますが例えば、setupモジュールを利用すれば管理対象サーバの情報を取得することも簡単にできます。

# ansible conoha -m setup
SSH password:
133.130.xxx.85 | success >> {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "133.130.xxx.85"
        ],
        "ansible_all_ipv6_addresses": [
            "fe80::1:85ff:fe82:3555"
        ],
        "ansible_architecture": "x86_64",
        "ansible_bios_date": "01/01/2011",
        "ansible_bios_version": "0.5.1",
        "ansible_cmdline": {
            "BOOT_IMAGE": "/vmlinuz-3.10.0-229.7.2.el7.x86_64",
            "LANG": "en_US.UTF-8",
            "console": "ttyS0,115200n8r",
            "crashkernel": "auto",
            "net.ifnames": "0",
            "quiet": true,
            "rd.lvm.lv": "centos/swap",
            "rhgb": true,
            "ro": true,
            "root": "/dev/mapper/centos-root",
            "systemd.debug": true
~略~

モジュールを全て覚えるのは大変ですが、頻繁に使用するcommand,shell,raw,scriptは覚えておくと便利です。

 

 

3.playbookを作成・実行する

 

簡単なplaybookを作成①

まずは、簡単なplaybookを作成します。playbookはYMLで記述する必要があります。

「simple.yml」は、Yumのアップデートをするだけの簡単なplaybookです。

# vim ~/simple1.yml
- hosts: conoha #グループ名
  gather_facts: False
  remote_user: root

  vars_prompt:
  - name: yum_update
    prompt: "Do you accept updates ?"
    private: no
    default: Y

  tasks:
    - name: Yum update packages
      yum: name=* state=latest
      when: yum_update == "Y"

では、実行してみましょう。

# ansible-playbook ~/simple1.yml
SSH password: ←管理対象サーバのrootユーザパスワードを入力
Do you accept updates ? [Y]: ←空Enter

PLAY [conoha] *****************************************************************

TASK: [Yum update packages] ***************************************************
ok: [133.130.xxx.85]

PLAY RECAP ********************************************************************
133.130.xxx.85              : ok=1    changed=0    unreachable=0    failed=0

これで、Yumアップデートができました。

 

 

簡単なplaybookを作成②

つぎは、Yumのアップデートに加えて複数のパッケージをインストールします。

複数のパッケージをインストールする場合は、「item」を使います。

# vim ~/simple2.yml
- hosts: conoha #グループ名
  gather_facts: False
  remote_user: root

  vars_prompt:
  - name: yum_update
    prompt: "Do you accept updates ?"
    private: no
    default: Y

  - name: yum_install
    prompt: "Do you install package ?"
    private: no
    default: Y

  tasks:
    - name: Yum update packages
      yum: name=* state=latest
      when: yum_update == "Y"

    - name: yum_install_packages
      yum: name={{ item }} state=latest
      with_items:
        - vim
        - wget
        - tree
        - libselinux-python
      when: yum_install == "Y"

では、実行してみましょう。

# ansible-playbook ~/simple2.yml
SSH password: ←管理対象サーバのrootユーザパスワードを入力
Do you accept updates ? [Y]: ←空Enter
Do you install package ? [Y]: ←空Enter

PLAY [conoha] *****************************************************************

TASK: [Yum update packages] ***************************************************
ok: [133.130.xxx.85]

TASK: [yum_install_packages] **************************************************
ok: [133.130.xxx.85] => (item=vim,wget,tree,libselinux-python)

PLAY RECAP ********************************************************************
133.130.xxx.85              : ok=2    changed=0    unreachable=0    failed=0

 

 

簡単なplaybookを作成③

Webサーバ(Apache httpd server)のインストールと起動をします。

「handlers」を使います。「handlers」は全てのタスクが完了後に実行されます。

# vim ~/simple3.yml
- hosts: conoha #グループ名
  gather_facts: False
  remote_user: root

  vars_prompt:
  - name: setup_httpd
    prompt: "Do you setup Webserver ?"
    private: no
    default: Y

  tasks:
    - name: Yum install httpd
      yum: name=httpd state=latest
      notify:
      - service_httpd_start
      when: setup_httpd == "Y"

  handlers:
    - name: service_httpd_start
      service: name=httpd state=started

では、実行してみましょう。

# ansible-playbook ~/simple3.yml
SSH password:
Do you setup Webserver ? [Y]:

PLAY [conoha] *****************************************************************

TASK: [Yum install httpd] *****************************************************
changed: [133.130.xxx.85]

NOTIFIED: [service_httpd_start] ***********************************************
changed: [133.130.xxx.85]

PLAY RECAP ********************************************************************
133.130.xxx.85              : ok=2    changed=2    unreachable=0    failed=0

 

 

playbookには、他にも色々便利な使い方があります。例えば、roleを使った方法など。

少し勉強すれば、すぐに感覚が掴めてくるのでないでしょうか。