あゝ、めんどくさい

めんどくさがり屋のIT勉強録

構成管理にAnsibleを使ってみた

構成管理ツール? そんな面倒なもん使わなくてもfabricでちょちょいですよ。

「でも、シェルスクリプトってエラーとかに弱いだろ? fabric上でいちいちtry/exceptを書いていくの? 非効率じゃん」

何の話かというと、各環境の再現性を持たせるためにインストールは自動化しましょうという話。Python上でシェルスクリプトを実行するfabricというのを使ってたんだが、それじゃ中途半端だと言われてる。んじゃ、どうすりゃいいの?

「Ansibleって知ってる? yamlでこういう状態にしてって書くと、その通りにするためのセッティングが走ってくれる。Python 2.5以上が必要だからCentOS 5系(なんでそんなのがまだあるの?)のホストに対する構成管理は無理だけど、最近のCentOSなら楽にセットアップできる」

yaml? その時点で凹むんですけど。

1.構成するファイルは最低2種類

pipでansibleを入れてさっそく試してみた。最低限必要なファイルは2種類。

さっき「こうあってほしい状態を書く」と言っていたyamlファイル。それからどのホストにどういう形でログインするかを書くインベントリファイル。そうそう忘れてたがfabricと同様SSHでログインして実行する。

自分のホームディレクトリにこんな形で展開してみた。

HOME
 ⎿ansible
   ⎿install_ipa-client
     ├run.yaml
     ⎿hosts

hostsにはansible実行時に、対象となるホストとログインに必要な情報を書いておく。複数書いておけば複数を対象に実行される。

[hiroys@utils install_ipa-client]$ vi hosts
[ipaclient]
dev2.example.jp
dev3.example.jp

[ipaclient:vars]
ansible_ssh_user=root
ansible_ssh_pass=********

SSHのユーザを選べるのは俺的にはツボ。fabricだと自分と同じIDでログインしてsudoするという形になっていたからだ。

yamlの方だが、playbookといって「こうあってほしい」というタスクを並べていく形になる。yamlを上から順に読んでいく形になるが、実行条件も設定できるので挙動を振り分けたいときに便利だ。

ipa-clientを新規サーバに入れる前提で書いてみた。

- name: install ipa-client
  gather_facts: True
  tasks:

    - name: rewrite dns server
      when: ansible_distribution_major_version == "7"
      command: nmcli c mod ens192 ipv4.dns 172.16.10.100
    - name: restart NetworkManager
      when: ansible_distribution_major_version == "7"
      command: systemctl restart NetworkManager

    - name: rewrite dns server
      when: ansible_distribution_major_version == "6"
      lineinfile: dest=/etc/sysconfig/network-scripts/ifcfg-eth0 regrex="^DNS1=.*" line="DNS1=172.16.10.100"
    - name: restart network
      when: ansible_distribution_major_version == "6"
      service: name=network state=restarted

    - name: yum install ipa-client
      yum: name=ipa-client state=present

    - name: download get-pip.py
      command: curl -O https://bootstrap.pypa.io/get-pip.py
    - name: install pip
      command: python ./get-pip.py
    - name: pip upgrade
      command: pip install --upgrade pip
    - name: install pexpect
      command: pip install pexpect

    - name: setup ipa-client-install
      expect:
        command: ipa-client-install
        responses:
          'Continue to configure the system with these values' : 'yes'
          'User authorized to enroll computers' : 'admin'
          'Password for admin' : '********'
    - name: mkhomedir
      command: authconfig --enablemkhomedir --update

nameやwhenやcommand、expectと書いてあるのがモジュールと呼ばれるもので、それぞれの挙動はこのモジュールが肩代わりしてくれる。シェルコマンドばかり書いているのでは、fabricとあまり変わりない気がしてくるが。。。expectが使えるのは魅力である。

2.実行する。

実際には知らせる場合はコマンドで次のように打つ。

[hiroys@utils install_ipa-client]$ ansible-playbook ipaclient -i hosts run.yml

fabricを使っていた場合と比べて手間はだいぶ省けているように思える。yamlの取り扱いが面倒なのがやや玉に瑕だが。。。