***本記事にはプロモーションが含まれています。***
前々回でAnsibleをインストールし、前回でVagrantで作ったゲストOSにSSHで接続できることがわかりました。Ansibleを使う環境は整ったので、Ansible単独でゲストOSをセットアップします。
手順はまず、Vagrantでサーバーを用意します。次に、Ansibleの設定をansible.cfgにして、扱うサーバーの設定を書いたhostsという名前のインベントリファイルを用意して動作確認をします。それが出来たら、Playbookを作成して実行してみます。
なお、Windows上のAnsibleの設定ではこちらのCygwinの情報を参考にしました。
Vagrantfileファイル
用意したサーバーは、次のようなVagrantfileで作りました。
Vagrantfile
VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = "ubuntu/xenial64" config.vm.define 'ubuntu01' do |host| host.vm.hostname = 'ubuntu01' host.vm.network "private_network", ip: "192.168.33.10" end config.vm.provision 'shell', inline: <<-SCRIPT # aptのソースファイルを書き換え sed -i s%archive.ubuntu.com/ubuntu%ftp.jaist.ac.jp/pub/Linux/ubuntu/%g /etc/apt/sources.list apt-get update apt-get -y install python aptitude SCRIPT end
ゲストOSには、ubuntu/xenial64を選びました。ubuntu01という名前にして、IPアドレスは、192.168.33.10にしました。
ubuntu/xenial64にはPythonがインストールされていません。Ansibleは、PythonのコードをゲストOSに送り込んで実行します。そのため、あらかじめPythonをインストールしていおきます。ダウウンロードの時間を短縮するために、aptのソースファイルを編集してあります。
ansible.cfgファイル
次に、Ansibleの設定をするansible.cfgを作ります。vagrant ssh-configの結果をもとに次のようなファイルを作りました。
ansible.cfg
[defaults] inventory = hosts remote_user = ubuntu host_key_checking = False private_key_file = C:/msys32/home/kazu/ansible/intro/.vagrant/machines/ubuntu01/virtualbox/private_key [ssh_connection] # for Cygwin, MSYS2 control_path = /tmp
インベントリファイル名は、hostsにします。remote_userとprivate_key_fileは、vagrant ssh-configで表示されるユーザー名UserとプライベートキーIdentityFileの場所を設定します。
host_key_checking = Falseは、ゲストOSを作ったり壊したりしたときに公開鍵が変わってしまうのですが、それをチェックしないという意味です。
MSYS2やCygwinでansibleを動かすときのポイントは、control_path = /tmpをansible.cfgに設定することです。これがないとエラーになります。
こんなエラーが出ます。
ubuntu01 | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: mm_send_fd: sendmsg(2): Connection reset by peer\r\nmux_client_request_session: send fds failed\r\n", "unreachable": true }
hostsファイル
次に、hostsという名前のインベントリファイルを作ります。
hosts
[webservers] ubuntu01 ansible_host=192.168.33.10
webserversというグループに、ubuntu01という名前のサーバーを作り、そのIPアドレスは192.168.33.10です。これは、Vagrantと合わせます。
Ansibleで使うhostsファイルのホスト名(この場合はubuntu01)は、Vagrantで使うVagrantfileのhost.vm.nameで指定する名前とは無関係です。もっとも、同じにしておいた方が間違わなくて済むのでいいです。
動作確認
ファイルが出来たら、ansibleに続けて、すべてのマシン(all)にpingを打ってサーバーからの返事を見ます。-m pingというのはpingモジュールを使ってpingを打つという意味です。
ansible all -m ping
こういう返事が返ってくれば成功です。
ubuntu01 | SUCCESS => { "changed": false, "ping": "pong" }
Playbookの実行
あとは、Playbookを作って実行するだけです。
Playbookは、インデントが重要なのでタブが入っているとエラーになります。気をつけましょう。
ここでは、site.ymlという名前のPlaybookを作りました。
hostsに実行するサーバー名を指定して、userにログインするユーザー名を入れます。tasksとして、Apache2をインストールします。nameには、このタスクのコメントをいれ、aptというモジュールを使ってapache2をインストールされた状態にします。このとき、スーパーユーザーで行います。
site.yml
--- - hosts: ubuntu01 user: ubuntu tasks: - name: install Apache2 apt: name=apache2 state=installed become: true
ansible-playbookの次にsite.ymlを指定して実行してみます。
ansible-playbook site.yml
これで、Apache2がインストールできたら成功です。
実際に、http://192.168.33.10/ にブラウザでアクセスするとApacheの画面が見れると思います。
Ansibleの使い方は、Ansible構成管理入門を参考にさせてもらいました。ありがとうございます。