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を使った方法など。
少し勉強すれば、すぐに感覚が掴めてくるのでないでしょうか。