Ansibleでよくつかうモジュール8選

104件のシェア(ちょっぴり話題の記事)

こんにちは、坂巻です。

みなさんAnsibleは利用されていますか?
ここ最近、Ansibleに触れる機会が増えたのですが、
使用しているモジュールはそんなに多くないことに気が付きました。

とはいえ、使用するモジュールを度々調べていたので、
よくつかうモジュールをマイリファレンスとしてまとめたいと思います。

今回はそんなエントリです。

取り上げたモジュールについては、
一般的なモジュールが多いと思いますので、リファレンスとして誰かの役に立てれば幸いです。

目次

  • はじめに
  • よくつかうモジュール
    • command
    • shell
    • file
    • copy
    • template
    • service
    • lineinfile
    • yum
  • さいごに
  • 参考・関連

はじめに

本エントリの前提は以下となります。

  • Ansible実行サーバをコントローラノード、管理対象サーバをターゲットノードと呼んでいます。
  • 文中の例に取り上げたタスクは、ロール内で使用することを前提に記載しています。
  • 文中の例にあるnameディレクティブは必須項目でありませんが、可読性、メンテナンス性を考慮して記載しました。
  • 文中のモジュールについては、順不同になります。

それでは紹介していきたいと思います。

よくつかうモジュール

command

ターゲットノードで任意のコマンドを実行します。
Ansibleの既存モジュールで実行できない場合等に、このモジュールを使用します。

ターゲットノードで/tmp/work/ec2-user/test.shを実行する例を記載します。

- name: Run Command
  command: /tmp/work/ec2-user/test.sh
  args:
    chdir: /tmp/work/ec2-user
  • chdir…コマンド実行前に指定されたディレクトリに移動。

chdir等のcommandモジュールに渡す引数はargsディレクティブ配下に記載します。

commandモジュールの注意点としては、シェルを通して実行しないため、環境変数、リダイレクトやパイプは使用できません。

また、コマンド成功時のステータスは常にchangedとなり、コマンドの実行結果が0以外は、failedとなります。

より詳細な仕様についてはcommandを確認するか、
コマンドラインよりansible-doc commandを実行して確認ください。

shell

ターゲットノードで任意のコマンドを実行します。
ターゲットノードで/tmp/work/ec2-user/test.shを実行する例を記載します。

- name: Run Command
  shell: /tmp/work/ec2-user/test.sh 2>&1 | tee /tmp/work/ec2-user/test.log
  args:
    chdir: /tmp/work/ec2-user
  • chdir…コマンド実行前に指定されたディレクトリに移動。

commandモジュール同様で、任意のコマンドを実行できますが、
commandモジュールとは違い、シェル(/bin/sh)を介して実行されます。  

The shell module takes the command name followed by a list of space-delimited arguments. It is almost exactly like the command module but runs the command through a shell (/bin/sh) on the remote node.

上記のように、リダイレクトやパイプが使用できることが特徴です。
commandモジュール同様、引数はargsディレクティブ配下に記載します。

より詳細な仕様についてはshellを確認するか、
コマンドラインよりansible-doc shellを実行して確認ください。

file

ファイルやディレクトリの作成や権限変更、削除の処理を行うことができます。
ターゲットノードで/tmp/work/ec2-userディレクトリを作成する例を記載します。

- name: Make Work Directory
  file:
    path: /tmp/work/ec2-user
    state: directory
    owner: ec2-user
    group: ec2-user
    mode: 0755
  • path…操作対象のファイルパス指定。
  • state…操作対象の種別(file、directory、link等)を指定。
  • owner…所有者ユーザの指定。
  • group…所有者グループの指定。
  • mode…権限の指定。

より詳細な仕様についてはfileを確認するか、
コマンドラインよりansible-doc fileを実行して確認ください。

copy

コントローラノードに存在するファイルを、ターゲットノードに送信することができます。
ターゲットノードにhttpd.confを送信する例を記載します。

- name: Copy Config File
  copy:
    src: httpd.conf
    dest: /etc/httpd/conf
    mode: 0644
    backup: yes
  • src…コントローラノードにある送信対象のファイルパス。パスが/で終わる場合は、そのディレクトリ内のファイルが送信され、パスが/で終わっていない場合は、ディレクトリ自体が送信されます。
  • dest…送信先であるターゲットノードの絶対パスを指定。
  • mode…権限の指定。
  • backup…ファイルの送信前にバックアップファイルを取得。

本エントリの冒頭で述べた通り、ロールの使用を前提しており、
ロール内のfilesディレクトリにhttpd.confを格納しているため、パスの指定は省略しています。

test
├── defaults
│   └── main.yml
├── files
│   └── httpd.conf
├── tasks
│   └── main.yml
└── templates
    └── httpd.conf

backupの指定により、タスク実行時にdestで指定したディレクトリにタイムスタンプを付与したバクアップファイルが作成されます。

-rw-r--r--. 1 root root 11738  4月 30 09:26 httpd.conf
-rw-r--r--. 1 root root 11753  1月  8 20:46 httpd.conf.5410.2018-04-30@09:26:22~

より詳細な仕様についてはcopyを確認するか、
コマンドラインよりansible-doc copyを実行して確認ください。

template

コントローラノードに存在するファイルを、ターゲットノードに送信することができます。
ターゲットノードにhttpd.confを送信する例を記載します。

- name: Copy(template) Config File
  template:
    src: httpd.conf
    dest: /etc/httpd/conf
    mode: 0644
    backup: yes
  • src…コントローラノードにある送信対象のファイルのパス。
  • dest…コピー先であるターゲットノードの絶対パスを指定。
  • mode…権限の指定。
  • backup…ファイルの送信前にバックアップファイルを取得。

copyモジュールとは違い、変数が使用できることが特徴です。

test/templates/httpd.conf

(略)
Listen {{ Listen_Port }}
(略)

test/defaults/main.yml

(略)
Listen_Port: 80
(略)

送信されたファイルを確認すると、変数が展開されファイルが送信されます。

/etc/httpd/conf/httpd.conf

(略)
Listen 80
(略)

より詳細な仕様についてはtemplateを確認するか、
コマンドラインより、ansible-doc templateを実行して確認ください。

service

ターゲットノード上のサービスの操作が行えます。
ターゲットノードでhttpdサービスの再起動する例を記載します。

- name: Restarte Service
  service:
    name: httpd
    state: restarted
  • name…サービスの名前を指定。
  • state…サービスの状態(started、stopped、restarted、reloaded)を指定。

より詳細な仕様についてはserviceを確認するか、
コマンドラインよりansible-doc serviceを実行して確認ください。

lineinfile

ターゲットノードにあるファイルを直接書き換えることができます。
/etc/httpd/conf/httpd.confの一部を書き換える例を記載します。

- name: Restarte Service
  lineinfile:
    dest: /etc/httpd/conf/httpd.conf
    regexp: ^DocumentRoot
    line: DocumentRoot "/var/www/html"
    backup: yes
  • dest…編集するファイルのパスを指定。
  • regexp…編集対象の行を探す正規表現を指定。
  • line…ファイルに挿入、置換する行を指定。
  • backup…ファイルの書き換え前にバックアップファイルを取得。

上記タスクの実行で/etc/httpd/conf/httpd.confは以下のように書き換えられます。

タスク実行前

(略)
DocumentRoot "/var/www/html"
(略)

タスク実行後

(略)
DocumentRoot "/var/www/ec2-user/html"
(略)

より詳細な仕様についてはlineinfileを確認するか、
コマンドラインよりansible-doc lineinfileを実行して確認ください。

yum

yumパッケージマネージャを使用して、パッケージをインストール、アップグレード、ダウングレード、削除、および一覧表示することができます。

- name: Installe Package
  yum:
    name: httpd
  when: ansible_distribution in ['RedHat','CentOS']
  • name…パッケージ名を指定。

より詳細な仕様についてはyumを確認するか、
コマンドラインよりansible-doc yumを実行して確認ください。

ここではwhenディレィクティブを使用して、
特定の条件のみでタスクが実行されるケースを記載しました。

ansible_distributionはAnsibleが自動で実行しているsetupモジュールにより設定された変数です。

上記ではansible_distributionが、RedHatまたはCentOSの場合のみタスクが実行されます。
なお、whenで指定した条件に合致しない場合、タスクはスキップとなります。

TASK [test : Installe Package] ******************************************************************************
skipping: [tset-bastion_server]

setupモジュールは、PlayBook実行時に自動で実行されますが、以下のように実行することも可能です。

ansible -m setup ホスト名

上記を実行すると、setupモジュールで取得した情報が出力されます。

さいごに

今回は個人的によく使うモジュールを記載しました。

使用できるモジュールは多数ありますので、
公式のAll modulesまたは、ansible-doc -lコマンドで確認してください。

本エントリで記載したモジュール数は少なめですが、リファレンスとして誰かの役に立てれば幸いです。

機会をみてよくつかうディレクティブもまとめてみたいと思います!!