Ansible初心者の私が超簡単に動作確認した内容をまとめます。
Ansibleの概念をなんとなく理解し、インストールしたら、動作確認をして感覚をつかんでいきましょう。
インストールはこちら → DockerでAnsibleをインストールして動かす(Windows、MacOS共通)
Ansibleの概要はこちら → 【図解】Ansibleの用語、概念をシンプルに説明します
Ansibleの公式ドキュメントを参考に触っていきます。
参考にするのはこちら → Getting Started — Ansible Documentation
ドキュメントは丁寧に作られているぶん量が多いので、できるだけ簡単に試せるように書いていきます。
コントロールノードと管理対象ノードの準備
Ansibleのコントロールノードと管理対象ノードを用意しましょう。
コントロールノードから管理対象ノードにssh接続できるようにしておきます。
この記事ではDockerで作ったCentOSのコンテナをコントロールノードとして使っています。
管理対象ノードはレンタルサーバーを想定しています。
コアサーバーの例ですがssh接続例は以下です。
他のレンタルサーバー等で応用できる所もあると思います。
インベントリを用意する
管理対象ノードをインベントリに追加します。
コントロールノードのマシン内に/etc/ansible/hosts
を作成し、管理対象ノードのIPアドレスまたはFQDNを追記して保存します。
以下のようにIPアドレスだけを書いて保存すれば最低限の準備はOKです。(全部伏字ですが…)
xxx.xxx.xxx.xxx
IPアドレスの他に、~/.ssh/config
に設定したホスト名でも大丈夫です。
sshキーの指定など省略できるので、 私は今回~/.ssh/config
の設定を使う事にしました。
ssh以外の接続方法
この記事では詳しく扱いませんが、ssh以外の接続方法にも対応しています。
ローカル環境やDockerにアクセスする方法が用意されています。
公式ドキュメントの「Non-SSH connection types」の項目を参考にしてください。
How to build your inventory — Ansible Documentation
管理対象ノードへの疎通確認(pingモジュール)
インベントリで指定した管理対象ノードにssh接続できるか確認します。
以下のようなコマンドを実行します。
# ansible all -m ping
ホスト名 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
ping
の値にpong
が返ってくれば疎通できたという事になります。
ansibleコマンドのパラメタの意味は以下です。
オプション | 意味 |
all(または*) | 全てのホストを対象にする |
-m ping | pingモジュールを実行する |
pingモジュールのドキュメントは以下です。
アドホックコマンドを試す
プレイブックを使わず、単一のコマンドで管理対象ノードを操作することができます。
上で試したansible all -m ping
もアドホックコマンドです。
動作確認にはちょうどいいので、ping
以外も少し試してみます。
ファイルのコピー
ファイルをコピーするには以下のようにします。
# ansible all -m copy -a "src=ソースのパス dest=/tmp/"
全てのホストの/tmp
ディレクトリにファイルがコピーされます。
-a
の後にモジュールの引数リストを指定する形になっています。
ファイルの削除
以下のコマンドでファイルを削除できます。
ディレクトリを指定した場合は、再帰的に削除します。
# ansible all -m file -a "dest=削除対象のパス state=absent"
パッケージのインストール
管理対象ノードでパッケージのインストールもできます。
# ansible all -m yum -a "name=acme state=present"
なんとなく雰囲気つかめたでしょうか。
他にもAnsibleではモジュールを使って様々な操作が可能となっています。
プレイブックを使う
最後にプレイブックを使ってみます。
アドホックコマンドでも出来た様々な操作を、YAML形式のファイルに定義することで順番に実行する事ができます。
プレイブックでファイルをコピーする
もっとも簡単なプレイブックを書いてみます。
以下のような内容のファイルを作り、sample-playbook.ymlという名前で保存します。
---
- hosts: all
tasks:
- name: copy file
copy:
src: /ansible_test.txt
dest: /tmp/
hosts: all
でインベントリ内の全てのホストを対象にしています。
tasks
の下に実行したタスクを記述していきます。
name
は任意のタスク名を指定します。実行時のログにこの名前が表示されます。
copy
はAnsibleのcopyモジュールを指定しています。
src
とdest
はcopyモジュールの引数です。
このプレイブックを実行するのは以下のコマンドです。
# ansible-playbook sample-playbook.yml
ansible-playbook
コマンドにプレイブックのパスを渡すだけです。
実行すると以下のようなログが表示されて、管理対象ノードにファイルがコピーされます。
# ansible-playbook sample-playbook.yml
PLAY [all] *******************************************
TASK [Gathering Facts] *******************************
ok: [ホスト名]
TASK [copy file] *************************************
changed: [ホスト名]
PLAY RECAP *******************************************
ホスト名 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
条件分岐でファイルが存在したらタスクを実行しないようにする
Play book内で変数を定義し、タスクを実行するかどうか分岐させる事ができます。
以下の内容でファイルを作成し、sample2-playbook.ymlとして保存します。
---
- hosts: all
tasks:
- name: check file exists
stat:
path: /tmp/ansible_test.txt
register: st
- name: copy file
copy:
src: /ansible_test.txt
dest: /tmp/
when: not st.stat.exists
sample-playbook.yml と比べると、「check file exists」というタスクと、「when: not st.stat.exists」という行が追加されています。
まずは実行してみます。
# ansible-playbook sample2-playbook.yml
PLAY [all] *******************************************
TASK [Gathering Facts] *******************************
ok: [ホスト名]
TASK [check file exists] *****************************
ok: [ホスト名]
TASK [copy file] *************************************
skipping: [ホスト名]
PLAY RECAP *******************************************
ホスト名 : ok=2 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
[copy file]のタスクが「skipping」となっています。
sample-playbook.ymlを実行したときに管理対象ノードにファイルをコピーしていたので、管理対象ノードにはすでにファイルが存在しています。
ファイルが存在しているので、条件分岐によりタスクがスキップされた状態です。
追加した行について説明します。
まず「name: check file exists」で新しいタスクを追加しています。
「stat」は管理対象ノードのファイルの状態を取得するモジュールです。
「path: /tmp/ansible_test.txt」はstatモジュールの引数です。状態を取得したいファイルのパスを渡しています。
「register: st」でタスクの結果を「st」という変数に格納しています。「register: 変数名」で任意の変数名を指定できます。
register構文に関するドキュメントは以下です。
Conditionals — Ansible Documentation
「when: not st.stat.exists」で「ファイルが無かったらタスクを実行する」という制御を表しています。
「copy file」のタスクを実行するかどうかを決めています。
「st」にはregisterで保存したstatモジュールの実行結果が格納されています。
「st.stat.exists」とする事で格納していた値を取り出すことができます。
ファイルが存在していた場合trueが取得できます。
「not st.stat.exists」としているので、「ファイルが存在しなかったら」という条件になっています。
whenに関するドキュメントは以下です。
Conditionals — Ansible Documentation
Ansibleの簡単な動作確認は以上になります。
インベントリで複数のホストを管理したり、プレイブックでホストを切り替えたり、他にも多くの機能があります。
多すぎて把握できないので、自分のやりたい事に合わせて調べながら使っていくと良いかと思います。
以上です。
コメント/ピンバック