【初心者用】Ansibleを超簡単に軽く触ってみる。ファイルのコピーから条件分岐まで。

Ansible ツール

Ansible初心者の私が超簡単に動作確認した内容をまとめます。

Ansibleの概念をなんとなく理解し、インストールしたら、動作確認をして感覚をつかんでいきましょう。

インストールはこちら → DockerでAnsibleをインストールして動かす(Windows、MacOS共通)

Ansibleの概要はこちら → 【図解】Ansibleの用語、概念をシンプルに説明します

Ansibleの公式ドキュメントを参考に触っていきます。

参考にするのはこちら → Getting Started — Ansible Documentation

ドキュメントは丁寧に作られているぶん量が多いので、できるだけ簡単に試せるように書いていきます。

コントロールノードと管理対象ノードの準備

Ansibleのコントロールノードと管理対象ノードを用意しましょう。

コントロールノードから管理対象ノードにssh接続できるようにしておきます。

この記事ではDockerで作ったCentOSのコンテナをコントロールノードとして使っています。

管理対象ノードはレンタルサーバーを想定しています。

コアサーバーの例ですがssh接続例は以下です。

コアサーバーにSSH接続する方法

コアサーバーに公開鍵認証でSSH接続する方法

他のレンタルサーバー等で応用できる所もあると思います。

インベントリを用意する

管理対象ノードをインベントリに追加します。

コントロールノードのマシン内に/etc/ansible/hostsを作成し、管理対象ノードのIPアドレスまたはFQDNを追記して保存します。

以下のようにIPアドレスだけを書いて保存すれば最低限の準備はOKです。(全部伏字ですが…)

IPアドレスの他に、~/.ssh/configに設定したホスト名でも大丈夫です。

sshキーの指定など省略できるので、 私は今回~/.ssh/configの設定を使う事にしました。

ssh以外の接続方法

この記事では詳しく扱いませんが、ssh以外の接続方法にも対応しています。

ローカル環境やDockerにアクセスする方法が用意されています。

公式ドキュメントの「Non-SSH connection types」の項目を参考にしてください。

How to build your inventory — Ansible Documentation

管理対象ノードへの疎通確認(pingモジュール)

インベントリで指定した管理対象ノードにssh接続できるか確認します。

以下のようなコマンドを実行します。

pingの値にpongが返ってくれば疎通できたという事になります。

ansibleコマンドのパラメタの意味は以下です。

オプション意味
all(または*)全てのホストを対象にする
-m pingpingモジュールを実行する

pingモジュールのドキュメントは以下です。

ping – Try to connect to host, verify a usable python and return pong on success — Ansible Documentation

アドホックコマンドを試す

プレイブックを使わず、単一のコマンドで管理対象ノードを操作することができます。

上で試したansible all -m pingもアドホックコマンドです。

動作確認にはちょうどいいので、ping以外も少し試してみます。

ファイルのコピー

ファイルをコピーするには以下のようにします。

全てのホストの/tmpディレクトリにファイルがコピーされます。

-aの後にモジュールの引数リストを指定する形になっています。

ファイルの削除

以下のコマンドでファイルを削除できます。

ディレクトリを指定した場合は、再帰的に削除します。

パッケージのインストール

管理対象ノードでパッケージのインストールもできます。

なんとなく雰囲気つかめたでしょうか。

他にもAnsibleではモジュールを使って様々な操作が可能となっています。

プレイブックを使う

最後にプレイブックを使ってみます。

アドホックコマンドでも出来た様々な操作を、YAML形式のファイルに定義することで順番に実行する事ができます。

プレイブックでファイルをコピーする

もっとも簡単なプレイブックを書いてみます。

以下のような内容のファイルを作り、sample-playbook.ymlという名前で保存します。

hosts: allでインベントリ内の全てのホストを対象にしています。

tasksの下に実行したタスクを記述していきます。

nameは任意のタスク名を指定します。実行時のログにこの名前が表示されます。

copyはAnsibleのcopyモジュールを指定しています。

srcdestはcopyモジュールの引数です。

このプレイブックを実行するのは以下のコマンドです。

ansible-playbookコマンドにプレイブックのパスを渡すだけです。

実行すると以下のようなログが表示されて、管理対象ノードにファイルがコピーされます。

条件分岐でファイルが存在したらタスクを実行しないようにする

Play book内で変数を定義し、タスクを実行するかどうか分岐させる事ができます。

以下の内容でファイルを作成し、sample2-playbook.ymlとして保存します。

sample-playbook.yml と比べると、「check file exists」というタスクと、「when: not st.stat.exists」という行が追加されています。

まずは実行してみます。

[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の簡単な動作確認は以上になります。

インベントリで複数のホストを管理したり、プレイブックでホストを切り替えたり、他にも多くの機能があります。

多すぎて把握できないので、自分のやりたい事に合わせて調べながら使っていくと良いかと思います。

以上です。

コメント/ピンバック

タイトルとURLをコピーしました