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

Ansible を使ってみる (playbook編)

Ansible

前回コマンド編を書きました。

iwamocchan11.hatenadiary.jp

実際はいくつもモジュールを組み合わせて

使用すると思いますので playbook を書いてみます。

実行環境は以下の通りになります。

# cat /etc/centos-release
CentOS release 6.7 (Final)

# yum list ansible
ansible.noarch 1.9.2-1.el6 @epel

 playbook は YAML形式で書きます。

Rubyist Magazine - プログラマーのための YAML 入門 (初級編)

YAML シンタックス — Ansible Documentation

何はともあれ、書いてみるのが一番。 

 

前回コマンドで実行したものを playbook で書いてみます。

# ansible -i hosts all -m ping

今回は公開鍵認証にしています。

inventory ファイルはオプションで指定しないで、

/etc/ansible/hosts を書き換えています。

 

playbook はこんな感じになります。

gist0b35925604733d7d563d

 

 書き方を少し解説します。

---
- hosts: all
  remote_user: root 
  tasks: 
- name: pingしてみる
    ping:

※タブは使えないので注意!インデントや空白は全てスペースです!

 

「---」はここから定義を始めますという意味です。

 

実行先の情報と実行先の権限を指定したり、変数を定義します。

- と hosts、hosts: と all の間はスペースが絶対に必要です。

 

tasks: はここから先は実行する項目を書くよという意味です。

 

タスク(項目)ごとに - name: で実行する項目を指定してあげます。

項目ごとに「-」をつけてあげます。

hosts の行から一貫した作業になりますので、インデントして階層構造にしています。

実行してみます。(エラーが出た場合はページ下部を参照)

心配なのでいつも --check をつけてうまくいくか確認してから

実行するようにしています。 

# ansible-playbook ping.yml --check

では実際に実行してみます。

# ansible-playbook ping.yml

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.9.130]

TASK: [pingしてみる] ******************************************************
ok: [192.168.9.130]

PLAY RECAP ********************************************************************
192.168.9.130 : ok=2 changed=0 unreachable=0 failed=0

もうひとつ playbook を書いてみます。

今度は httpd をインストールして、サービス起動して、自動起動するようにします。

今回 httpd は vars で 変数に指定してあげて、{{p1}} で呼び出す形にしてみました。

gist7ab0967589dd446bbf87

使用したモジュール↓

yum - yum パッケージマネージャでパッケージを管理する — Ansible Documentation

command - Executes a command on a remote node — Ansible Documentation

service - サービスの管理を行う — Ansible Documentation

 

chkconfig  のところは「service: name=httpd enabled=yes」でもOK.

gist35d3a038e0db02ff2a30

 

実行結果

# ansible-playbook httpd.yml

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.9.130]

TASK: [yum install httpd] *****************************************************
ok: [192.168.9.130]

TASK: [service httpd start] ***************************************************
changed: [192.168.9.130]

TASK: [chkconfig httpd on] ****************************************************
changed: [192.168.9.130]

PLAY RECAP ********************************************************************
192.168.9.130 : ok=4 changed=2 unreachable=0 failed=0

コマンドベースからやりたいことを列挙していくようにすれば

あっという間に playbook の出来上がりです。

 

hosts を webserver にしてwebサーバにだけ適用するようにして、

dbserver を hosts に追加して「 p2: mysql 」にすれば、

用途の異なるサーバにそれぞれ指定したパッケージを適用することもできます。

 

十数台のサーバならまだしも、何百台とかになってくると簡単な作業でも

こういうツールがあると便利ですね。

 

--------

エラーが出た場合は以下を試してみてください。

エラー1:

# ansible-playbook ping.yml --check

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
fatal: [192.168.9.130] => SSH Error: Permission denied (publickey,gssapi-keyex,g pi-with-mic,password).
while connecting to 192.168.9.130:22
It is sometimes useful to re-run the command using -vvvv, which prints SSH debug tput to help diagnose the issue.

TASK: [pingしてみる] ******************************************************
FATAL: no hosts matched or all hosts have already failed -- aborting


PLAY RECAP ********************************************************************
to retry, use: --limit @/root/ping.retry

192.168.9.130 : ok=0 changed=0 unreachable=1 failed=0

解決策:

~/.ssh 配下の鍵を使おうとしているため、エラーになっています。

/etc/ansible/hosts にユーザと秘密鍵を指定してあげることで解決しました。

# cat /etc/ansible/hosts
[server]
192.168.9.130 ansible_ssh_user=root ansible_ssh_private_key_file=~/.ssh/test.key

余談ですが、下記のように書く方法もあります。

# cat /etc/ansible/hosts
[server]
192.168.9.130

[server:vars]
ansible_ssh_user=root
ansible_ssh_private_key_file=~/.ssh/test.key

[server:vars] で server グループの設定をまとめて書くことができます。

server グループにホストの追加があっても同じユーザと秘密鍵

使用するのであれば、IPを追記するだけで OK.

# cat /etc/ansible/hosts
[server]
192.168.9.130

192.168.9.131

192.168.9.132

[server:vars]
ansible_ssh_user=root
ansible_ssh_private_key_file=~/.ssh/test.key

参考にさせていただきました!ありがとうございました!

Ansible Tutorialで詰まった - 総天然色頁

 

エラー2:

これはこのエントリーに関係なく仕事で ansible を使っていた際にでたエラーです。

ちょっとはまりました。

# ansible-playbook -i inventory playbook.yml -k --check
SSH password: (password)
192.168.9.130 | FAILED => Using a SSH password instead of a key is not possible
because Host Key checking is enabled and sshpass does not support this.
Please add this host's fingerprint to your known_hosts file to manage this host.

解決策:

実行対象のサーバに sshして known_hosts に登録すると

エラーが出なくなりました。

 

参考にさせていただきました!ありがとうございました!

とあるSIerの憂鬱

--------

電子書籍を購入しました。

一気に playbook が書けるようになりました。オススメ。

www.amazon.co.jp

 紹介した playbook 置いておきますね↓

github.com