故あってVPSをたくさん設定することになったので、
これは今流行りのchefとかpuppetとかでしょうとか思ったものの調べた結果
ansibleがベストだと思ったので、そのお話です。
●要件
・SSHが最初から起動してるVPSに一度もログインせずに全部まとめて設定したい
・できればめんどくさい勉強はしたくない
●chef でなく ansible
調べた感じ巷では例えば chef とか puppet とかは情報が多かったんですが、
そもそもクライアントをインスコしないといけないという時点でアウトでした。
あれはキッティングするレベルの人達が最初から入れておこうねとかそういうやつであって、
借りてきたものをあーだこーだするレベルの俺みたいなエンジニアには不要でした。
(自分はどうせ httpd,sshd,squidとcronの設定くらいでよかったってのもありますが。)
監視はポーリングレベルなら自分ですればいいし、snmp使うならちゃんとツール入れたほうがいいかと。
ってことで、
クライアントがいらない、yamlで書ける、ansibleを選択しました。
●インストール
基本的なインストールは yum でポイポイしてしまったので省略
sudo yum -y install ansible
ansible -v が通ったらもう後は動かすだけです。
●設定
ベストプラクティスとかありますが、参考にしつつちょっといじってます。
・基本的な考え
SEDとか使ってコンフィグ書き換えてるサンプルが多いですが、
サーバごとに違うもの以外の例えば、httpd.conf とか sshd_configとかは
正のファイルをsv1において、それをコピー配布してます。
どうしても書き換えが必要なネットワーク系とかのみSEDしてます。
(それすらも正のファイルをローカルにおいちゃう事も可能ですが。)
一応ここからはこんなイメージで進めます。
・ansibleを動かすサーバ: server
・vpsのIP: 11.22.33.44
・VPSはsshでログイン可能状態
設定する項目は
・apacheのインストールとhttpd.confの上書きと起動
・任意のシェル実行
の2つ
server側の作業フォルダの構成
ansible/ ├── ansible.cfg ←設定ファイル ├── init.yml ←実行ファイル ├── hosts/ | ├── hosts ←vps1のIP書くとこ | ├── templates/ | ├── httpd.conf ←完璧にしておいたコンフィグファイル | ├── echo.sh ←実行したいシェル | ├── roles/ ├── httpd/ | ├── tasks/ | ├── main.yml ←init.ymlから呼び出して実行する ├── shells/ ├── tasks/ ├── main.yml ←init.ymlから呼び出して実行する
後はもう書き書きするだけです。
./ansible.cfg
[defaults] ansible_ssh_args="-o ForwardAgent=yes" host_key_checking=false remote_tmp=/tmp
./init.yml
- hosts: vps roles: - httpd - shells
./hosts/hosts
[vps] 11.22.33.44 ansible_connection=ssh ansible_ssh_user=ユーザ名 ansible_ssh_pass=パスワード ansible_ssh_port=ポート番号
./roles/httpd/tasks/main.yml
- name: Install httpd yum: name: httpd state: installed - name: Copy HTTPD Setting copy: src: templates/httpd.conf dest: /etc/httpd/conf/httpd.conf owner: root group: root mode: 0644 - name: Install php yum: name={{ item }} state=present with_items: - php - php-mysql - php-mbstring - php-gd - name: Restart httpd service: name=httpd state=restarted - name: Enable httpd service: name=httpd state=running enabled=yes
さくらのvpsは最初ルートでSSHが通るので、
その設定でつなげるようにしています。
SSHを変える際はhttpdのやつを改良すればいいと思いますが、
その際ポートとかrootログインとか変更すると
当たり前ですがこの設定ではログインできなくなります。
また、init.ymlで
sshd,httpd,みたいな順番にしちゃうと、
taskごとにsshコネクションを張りなおしているみたいで
sshdで変更してhttpdの際にコネクションが張れない
みたいな事になりますので、sshd変更するのなら最後にしたほうがいいと思います。