Ansible使って楽がしたい
つらくないですか︖
似た作業の繰り返し
10台以上ある、似た名前のサーバに対する
環境構築
デプロイメントの⼿動オペレーション
返りが遅いコマンドがあると並列に作業せざるを
えない
似たコマンドを何度も打てばミスも起きる
Agenda
1. Ansibleって何
2. Ansibleの使い⽅
3. Ansibleの構成
4. おまけ
Ansibleって何
Ansibleってなに
構成管理ツール
puppet, chefなど
infrastracture as code
Infrastructure as Code 再考 - Gosuke Miyashita
テキストでインフラを表現できる
冪等性とかの話はしない
冪等性がないアクションまで扱える範疇にある
去年Red Hatが買収
Red HatがAnsibleを買収した理由、同社クラウドマ
ネジメント戦略担当が説明 - Publickey
Ansible and Red Hat
Ansibleのいいところ
エージェントレス
ssh + pythonで動く
ansible {ipaddress} -u {ssh_user} --private-
key={path_to_key} -m {module}
chefは、対象サーバにchefクライアントのインスト
ールが必要
デメリットでもある
管理対象が⼤規模になるとchefの⽅がよいらしい
(参考)動作環境
$ python -V
Python 2.7.5
$ ansible --version
ansible 2.1.0.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
Ansibleのいいところ
タスクの定義がyaml
簡単に書ける
とはいいつつpythonがむき出しになってる所もあ
る
chefは独⾃DSL
Ansibleの使い⽅
インストール
yumだとepelリポジトリに⼊ってる
pipでもいけるらしい
⼀番単純な使い⽅
コマンドライン
ansible all -m command -a "uptime"
第⼀引数は、対象ホストの指定
allは全ホスト
-mでモジュールの指定
-aでモジュールに渡す引数
commandモジュールに"uptime"を渡している
「全ホストにuptimeコマンドを実⾏」という意味に
なる
モジュールって︖
Ansibleの構成
主な登場⼈物
モジュール
インベントリファイル
プレイブック
モジュールとは
対象ホスト上で実⾏するもの
sshを通してモジュールが送り込まれ、対象ホスト上
のpythonで実⾏される
組み込みで500以上の種類がある
$ ansible-doc -l | wc -l
569
Module Index — Ansible Documentation
インベントリファイルとは
対象サーバの情報をまとめたもの
ini拡張形式
デフォルトは、/etc/ansible/hosts
-i で個別のインベントリファイルを指定できる
ansible all -i ./stage -m command -a "uptime"
stage, prodなど環境ごとに⽤意するのがよい
インベントリファイル記述例
[service]
service1
service2
[site]
site1
site2
[]でグループの定義
sshクライアントが解決できるホスト名で書ける
ssh_configに定義してある名前
/etc/hostsに定義してある名前
ansible site -i ./stage -m command -a "uptime"
Playbookとは
コマンドラインでいちいち指定してたものをまとめてお
くもの
yamlで書く
Playbookの構成
targetセクション
どのホストを対象にするか
インベントリ内のグループを指定
varsセクション
Playbook中で使いたい変数を定義
任意
tasksセクション
実際に⾏うこと
モジュールの羅列
Playbookの実⾏
$ ansible-playbook -i stage some_actions.yml
ansibleコマンドとは別にansible-playbookコマンドが
ある
Playbook記述例: sshユーザの追加
targetセクションとvarsセクション
---
- hosts: ssh # インベントリのsshグループを対象にする
become: yes # rootにsuするかどうか
remote_user: deploy
vars:
users: # usersという名前で変数を定義
- name: hoge # dict型の配列
pass: hoge
pubkey: /tmp/hoge.pub
- name: fuga
pass: fuga
pubkey: /tmp/fuga.pub
Playbook記述例: ユーザの追加
tasksセクション_1
with_itemsで指定した変数をイテレートしている
イテレートした要素はitemという名前でアクセスで
きる
userモジュールを使ってリモートにlinuxユーザを追加
する
passwordは⾃分でハッシュ化しないといけない
pythonのライブラリの結果を使ってる
tasks:
- name: debug # nameはなくてもいい。説明を書くところ。
debug: msg="add user:{{item.name}} password:{{item.pass}}"
with_items: '{{users}}'
- name: add ssh user
user: name='{{item.name}}' password='{{item.pass |password_hash('sha512')}}'
with_items: '{{users}}'
Playbook記述例: ユーザの追加
tasksセクション_2
- name: add publickey
authorized_key:
user: '{{ item.name }}'
key: "{{ lookup('file', item.pubkey) }}"
with_items: '{{ users }}'
- name: enable sudo
lineinfile:
dest: /etc/sudoers
backup: yes
line: ' {{ item.name }} ALL=(ALL) ALL'
with_items: '{{ users }}'
authorized_keyモジュール
公開鍵の配送をしている
.sshディレクトリの作成や権限の設定は気にしないで
よい
lineinfileモジュール
ファイルへの書き込み
おまけ
ディレクトリのレイアウト
インベントリファイルやプレイブックの置き⽅
公式のベストプラクティスがある
Best Practices — Ansible Documentation
ある程度の規模を想定してるっぽいので、軽く使い
始めるには重い
Tips
dry-run
--checkオプションをつける
実際には実⾏しないけど、どういう変化が起きるか
チェックできる
対象サーバの/var/log/messagesには残る
verbose
-v, -vvv
ステップ実⾏
--step
タスク単位で⾏う
gdbっぽい
やってはいけないこと
awsインスタンスのsshd再起動
ミスると死ぬ
configいじってシンタクスエラー、再起動失敗
sshdのテストモードを挟めば助かったかもしれない
sshd -tで⽂法チェックできるっぽい
話さなかったこと
role
タスクを独⽴させて共有しやすくする仕組み
規模が⼤きくなったり、Playbook間で重複が⽬⽴っ
てきたら検討したい
あんまりよく分かってない
ansible-galaxy
3rd partyなroleの公開リポジトリ
ansible-tower
GUIでansibleを管理できるツール
ノード数の制限内なら無料
話さなかったこと
ansible-vault
変数をファイルに切り出すことができるが、パスワ
ードを平⽂のまま保存しておくのはイヤ
そういったファイルを暗号化しておく機能
暗号化ファイルをPlaybookから読むときは、暗号パ
スワードを指定したりする
ansible-console
repl
モジュールの動作や正規表現の確認したいときに使
う︖
ansible-consoleを使おう - Qiita
軽く触ってみての課題
ansibleの出⼒を⾒て、本当に成功しているか分からな
いことがある
実⾏後にserverspecでアサートすればいいかも
⾏の編集が難しい
sedで出来るけど怖い
元になるテンプレートをホスト側で保持して、新し
いものを丸ごとコピーするのが正解かも
これからどう使っていくか
スポット的な作業の場合
複数サーバ相⼿にするなら楽になれる
Playbook書くなら引き継げる
新しくサーバをたてる場合
プロビジョニングのこと
インベントリファイルをsvnで管理できれば、サーバ
設定管理のエクセルが不要になるかも
デプロイに使う場合
プロダクション環境にいきなり使うと失敗しうるの
で、同等の環境でリハーサルしたい
以上です

Ansible使いたい