トップページ > コンテンツ > ネットワーク関連メモ > ネットワーク運用編 > ansible入門

ansibleとは

予め準備しておいた設定ファイル等を元に、
複数サーバに対して、ミドルウェアのインストールや設定等を行うことが
できる構成管理ツール。

使用上の前提条件

  1. 実行元サーバにansibleがインストールされていること。
    (設定先[構築対象サーバ]にインストールされている必要は無い)
  2. 実行元サーバから設定先[構築対象サーバ]にssh接続できること
    こちらをみると、実際のansibleの動きを理解しやすい。

コマンド実行方法

ansibleのコマンド実行方法は大きく分けて、以下の2種類存在する。

1.ansibleコマンド(アドホックコマンド)

構成設定を記述したファイルを用意するレベルではなく、複数サーバに単発コマンドを実行させたい場合に利用。

ansible -b -i インベントリファイル インベントリファイルの絞込条件(allなら全部。all:!ホスト名とすると一部ホストを除く) -m モジュール名 -a "モジュールに引き渡すコマンド等"

※代表的オプション
-b ルート権限で実行するの意味
-i IPアドレスを指定する時は、xxx.xxx.xxx.xxx, allとすると良い。
-C 実行前にcheckできる。
-k ssh時にパスワードが必要な場合に引数として渡すことができる。
-v デバッグ内容を表示できる
-m ansibleが用意している様々なモジュールを呼び出すことができる。一番多く使うモジュールはshellで、-m shell -a "ls"のようにすることで複数サーバに対して、コマンド実行できる。setupとするとリモート先の情報を色々収集できる。モジュール一覧はこちら参照のこと。
-a 本オプションの後ろのコマンド指令はansible-playbookで言う所のmain.ymlに相当する記述を記載する。
main.ymlはjson形式で属性値1:設定値のように記載するが、
アドホックコマンドでは-a '属性値1="設定値1" 属性値2="設定値2"'のように記載する。

2.ansible-playbookコマンド

通常はこちらを利用する。

ansible-playbook playbookファイル -i インベントリファイル -l "インベントリファイルの絞込条件"  -u 実行ユーザ名

※代表的オプション
-i IPアドレスを指定する時は、-i xxx.xxx.xxx.xxx,とすると良い。
-C 実行前に空実行することで挙動をチェックできる。
コマンド系は本オプションをつけると実行しなくなる。仮に状態変化でないコマンド等で本オプション時もコマンド実行させたい場合は、check_mode: noをmain.yml等に記載すると良い
-D ansible実行前後のファイル差分を表示する
--list-task ansibleコマンドによって実行されるタスクを確認できる
-u ansible実行元から実行先のサーバにsshするためのユーザを指定する
-k ssh時にパスワードが必要な場合に入力することができる
-K ansible実行先のユーザでsudoする際にパスワードを必要とする際に入力させる
-c localをつけると、ローカル環境で実行できる
-l 絞込条件で一部ホストを除く全てとする場合は、all:\!ホスト名ように書くと良い。
-e xxxx=yyyyの形で変数を渡すことができる
--step ステップ実行できる

ansible-playbookコマンド実行に必要となるファイル構成

どんな構成にするかはベストプラクティスと称して、
色々な例がネットに転がっているので、そちらを参照したい。
ここでは一例について述べる。

 |-playbookファイル  yml形式で記述する。
 |                    処理の大本を記載するファイルとなる。
 |-hosts              インベントリファイルを格納する
 |-group_vars         tasks¥main.ymlとかで使用する変数群(グループ関連)を宣言する<<group名>>.ymlの置き場
 |-host_vars          tasks¥main.ymlとかで使用する変数群(ホスト関連)を宣言する
 |-files              playbook実行時に使用する設定ファイル類等
 |-roles
     |-処理の名前等
        |-tasks
           |-main.yml 処理内容を記述する。

■playbookファイルの書き方

ここに詳細処理内容であるtasks記述をガリガリ書くことができるが、
通常は再利用性等も考慮し、roles¥名前¥tasks配下のmain.ymlを呼び出して、処理を任せることの方も多い。

- name: 一連の動作をまとめた名前
  hosts:
   - インベントリファイルの[]内で指定するホスト名。全ての場合はall。
  gather_facts: no #ターゲットノードの情報収集をするかを指定
  remote_user: ユーザ名 #ssh時に使用するユーザを指定する
  become: yes #become_userで指定したユーザで処理させる(become_userを省略した場合はroot)
  become_user: ユーザ名
  roles:
   - role: 処理の名前等(<=ディレクトリ構成参照)
  vars_files:
   - 変数一覧を記載したvarsファイル名を指定。
     例えば、host_vars/{{ansible_hostname}}.ymlとすると、
     各ホスト名のファイルを参照しにいく。

※playbookの構文チェックをする際は、ansibleコマンドに--syntax-checkをつける。


※playbookで指定できるアトリビュート一覧は以下が分かりやすい。
https://qiita.com/yunano/items/8494e785390360011a88

■hosts直下のインベントリファイルの書き方

ansibleではインベントリファイルという複数サーバを一覧情報としてまとめたファイルを作成する。
コマンド実行時にインベントリファイルを指定することで、そこに書かれたサーバ群に対して一度に設定を行うことができる。

[グループ名]
XXX.XXX.XXX.XXX   #IPアドレスを記載
YYY.YYY.YYY.YYY   #IPアドレスを記載
hoge.sample.co.jp #ホスト名でもOK /etc/hosts等でホスト名の名前解決は必要。

[グループ名2]
ZZZ.ZZZ.ZZZ.ZZZ

[グループ名:vars] #group_varsと同様に、ホストグループに変数定義できる。
変数名=値

■group_vars、host_vars直下のymlファイルの書き方

以下のように羅列することで変数定義できる。
変数名: 値
変数名: 値

■tasks直下のmain.ymlの書き方

playbookファイルからrole指定で呼び出されることになるmain.ymlの書き方について記載。

基本的には
-name       : 処理内容につける名前
-モジュール名: 
 モジュールのパラメータ名1: 値
 モジュールのパラメータ名2: 値

または

 -name       : 処理内容につける名前
 -モジュール名: モジュールのパラメータ名1=値 モジュールのパラメータ名2=値
のように指定する形で記述する。

このモジュールにおいて、ansibleは数多くの処理手段を提供しているので、
例えばユーザ追加や設定ファイルの移動等を処理させる記述を行うことが出来る。

モジュール一覧については、下記を参考にされたし。
https://docs.ansible.com/ansible/latest/modules/modules_by_category.html
ここでは、代表的な例のみ抜粋して紹介する。

機能 モジュール名 記載例 備考
パッケージインストール yum - name: 動作名称
yum: name=パッケージ名 state=latest
CentOS系の場合
apt - name: 動作名称
apt: name=パッケージ名 state=latest
Ubuntu系の場合
ファイルコピー(ローカルからリモート) copy - name: 動作名称
copy: src=<filesフォルダに置いたファイル> dest=<置き先> group=実行グループ owner=実行オーナー mode=0644
ファイルをそのままコピー
template - name: 動作の名前をつける
template: src=<templateフォルダに置いたファイル> dest=<置き先>
サーバごとに設定値を変えてコピーしたい時に使用する。
validate='コマンド %s'をつけると%sに置き先のファイルが入るので、設定ファイルが正しいかを検証できる(例:sudoersファイル等で活用)
ファイルコピー(リモートからローカル) fetch - name:動作名称
fetch: src=<対象ファイル> dest=<置き先>
ファイル生成 file - name:動作の名前をつける。
file:
path: 生成したいファイルのパス
state: 処理の種類
owner: 所有者
group: グループ
mode: パーミッション
ファイル編集 lineinfile - name: 動作の名前をつける
lineinfile:dest=<対象ファイル> line=<???>
insertbeforeとinsertafterで対象行前後に挿入できる。また、regexpと書くと、置換が優先される。
replace - name: 動作の名前をつける
replace:
dest: 対象ノードのファイル置き先
regexp: 正規表現
replace: 置換後文字列
blockinfile - name: 動作の名前をつける
blockinfile:
dest: 対象ノードのファイルの置き先
insertafter 正規表現
block: |
1行目
2行目
marker:""を使うと、#BEGIN xxxxのような文字列が入るのを抑止できる。
サービスの設定 service - name: 動作の名前をつける
service: state=restarted enabled=no
stateが現在のサービスへの指令。enableがPC起動時のサービス自動起動設定
cronの設定 cron - name:cronの名前をつける
minute=分 hour=時間 job=cronに登録するjob
コマンド実行 shell - name: 動作の名前をつける
shell: 実行したいコマンド
register: 実行結果を格納する変数
格納した変数の結果は{{実行結果を格納する変数.XXX}}のような形でアクセスできる。
実行結果の標準出力のみを利用しデバッグする場合は以下のようにする。
- debug:var=変数名.stdout_linesまたは- debug:
msg: "{{変数名.stdout_lines}}"
command - name: 動作の名前をつける
command: コマンド内容
script - name: 動作の名前をつける
script:ローカルに置いたスクリプトファイルのパス
ファイル操作系 find - name: 動作の名前をつける
find:
paths: 捜索したいパス
patterns: パターン条件
register: 結果用変数
ユーザ系 user - name: 動作の名前をつける
user:
name: ユーザ名
authorized_keyのセット authorized_key -name: 動作の名前をつける。
user: ユーザ名
state: present
key: "{{ lookup('file', '公開鍵のパス') }}"
ローカルで実行 local_action - name: 動作の名前をつける
local_action: モジュール名 オプション
変数をセットする set_fact - set_fact
変数名: 値
エラーは無視して次の処理継続 ignore_errors - name:任意の名前
任意のモジュール
ignore_errors: yes
特定の条件のみ実行 when - name: 動作の名前をつける
XXXX: 任意の処理
when: ansible_distribution == 'CentOS'
・ansible_distributionを使うには、playbook側でgather_facts: yesとしておく必要がある。
・inventoryのグループ名等でも条件分岐できる。
例:('グループ名' in group_names) or ('グループ名' in group_names)
・ファイルが存在する時等を分岐条件とする場合は、statモジュールが利用できる。
特定の条件の時failedを発生 failed_when failed_when:"some string" not in result.stdout
changedを発生させない changed_when changed_when:False
ループ処理をさせる with_items - name: 動作の名前をつける
処理内容 {{item.xxx}} <-変数名として使える
with_items:
- {xxx:内容1,yyy:内容2}}
- {xxx:内容3,yyy:内容4}}
with_itemsからloopに変わったようだ
ディレクトリ配下をまとめて処理する with_fileglob with_fileglob:
-"/dir/*"
タグをつけたい場合 tags tasks:
tags:
- 名前
キー入力待ち pause - pause: prompt="入力待ちで表示する内容"
最終更新:2021年04月10日 13:44