Ansibleにて、よく使用するモジュール

ansibleには操作を行うためのモジュールが多く存在します。
その中でよく使用するモジュールとそのオプションの一部をまとめました。

※ここに書かれているものはansibleで使われているものの一部です。詳しく知りたい場合は[こちら](http://docs.ansible.com/ansible/latest/index.html)に載っていますので、ご覧ください。
#Ansibleとは
Ansibleは "構成管理ツール" と呼ばれるツールです。
Chef, Puppet などと並んで必ず出てくるツールの1つかと思います。
#モジュール
##yum
yumパッケージマネージャによるパッケージやグループのインストール、アップグレード、削除、一覧表示を実行する。
###オプション
|頻度|パラメータ|必須|デフォルト値|選択肢|説明|
|:-:|:-:|:-:|:-:|:-:|:--|
||conf_file|no|-|-|対象ホストで /etc/yum.conf以外のファイルを使用する場合に指定する|
||disable_gpg_check|no|no|yes<br>no|パッケージの署名チェックを無効にする|
||disablerepo|no|-|-|無効にするリポジトリを指定する。複数の場合はカンマ区切りで記述する|
||enablerepo|no|-|-|有効にするリポジトリを指定する。複数の場合はカンマ区切りで記述する|
|※|name|yes|-|-|パッケージ名を指定する.『state=latest』かつ『name=*』を指定した場合は『yum -y update』を実行する.URLやローカルパスの指定も可能|
|※|state|no|present|present<br>latest<br>absent|present:インストール済みならそのまま<br>latest:新しいのがあればupgrade<br>absent:パッケージ削除|
**例**

```yml:playbook
- yum: name=httpd state=latest

- yum: name={{item}} state=present
  with_items:
    - 'httpd'
    - 'nginx'

- yum: name=/usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present
```
##copy
copyモジュールはローカルにあるファイルをリモートにコピーする。
###オプション
|頻度|パラメータ|必須|デフォルト値|選択肢|説明|
|:-:|:-:|:-:|:-:|:-:|:--|
|※|src|no|-|-|ローカルにあるコピーするファイルのパス.絶対パス、相対パスでの指定が可能。ディレクトリの場合は、再帰的にコピーされる.パスが『/』で終わる場合、そのディレクトリ内のファイルがコピーされる.パスが『/』で終わっていない場合は、ディレクトリ自体がコピーされる|
|※|dest|yes|-|-|コピー先の絶対パスの指定."src"で指定されたのがディレクトリの場合、"dest"もディレクトリにしなければならない|
||backup|no|no|yes<br>no|コピー前に元ファイルのバックアップをタイムスタンプ情報を付加して取得する|
||follow|no|no|yes<br>no|既にファイルが存在する場合置き換えない|
||force|no|yes|yes<br>no|yes:コピー先のファイルは置き換えられる<br>no:コピー先にファイルが存在しない場合のみファイルがコピーされる|
|※|group|no|-|-|chownコマンドで設定できる所有者グループの設定|
|※|mode|no|-|-|chmodコマンドで設定できる権限設定。8進数の指定とシンボリックモードでの指定が可能|
|※|owner|no|-|-|chownコマンドで設定できる所有者ユーザの設定|
**例**

```yml:playbook
- copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644

- copy: src=/mine/ntp.conf dest=/etc/ntp.conf owner=root group=root mode=644 backup=yes
```
##shell
shellモジュールは、シェル(/bin/sh)を実行する。
###オプション
|頻度|パラメータ|必須|デフォルト値|選択肢|説明|
|:-:|:-:|:-:|:-:|:-:|:--|
|※|chdir|no|-|-|コマンドを実行する前にcdコマンドでディレクトリを移動する|
||creates|no|-|-|指定したファイル名が既に存在する場合、コマンドを実行しない|
||executable|no|-|-|実行するシェルを絶対パスで指定する|
||removes|no|-|-|指定したファイル名が存在しない場合、コマンドを実行しない|
**例**

```yml:playbook
- shell: /somedir/somescript.sh

- shell: somescript.sh >> somelog.txt chdir=somedir/

- shell: somescript.sh >> somelog.txt
  args:
    chdir: somedir/
    creates: somelog.txt
```
##command
リモートでコマンドを実行する。
shell コマンドを実行したい場合に使用。 <, >, | を使用する場合は、shell を使うことを推奨。
###オプション
|頻度|パラメータ|必須|デフォルト値|選択肢|説明|
|:-:|:-:|:-:|:-:|:-:|:--|
|※|chdir|no|-|-|コマンドの実行前に 指定ディレクトリへcdする|
||creates|no|-|-|指定のファイル名が存在するなら、commandの実行をスキップする|
||removes|no|-|-|指定のファイル名が存在しないなら、commandの実行をスキップする|
**例**

```yml:playbook
- command: /sbin/shutdown -t now

- command: /usr/bin/make_database.sh arg1 arg2 creates=/path/to/database

- command: /usr/bin/make_database.sh arg1 arg2
  args:
    chdir: somedir/
    creates: /path/to/database
```
##commandとshellモジュールの違い
commandモジュールはシェルを介して実行されないため、 環境変数($HOMEなど)や、 “<”, “>”, “|”, “;” などのパイプやリダイレクトは使えません。ユーザ環境変数や、パイプ・リダイレクトを使った処理を行いたい場合は shell モジュールを利用してください。
shellモジュールは、指定したコマンドをシェル(/bin/sh)を介して実行します。実行環境に依存した環境変数や、パイプ・リダイレクトを使った処理を実行できます。これは悪い点もあり、もし実行時に playbookないで変数を使っていて、その変数が意図しない者の場合、そのまま対象ノードに対して実行されてしまうので危険です。
2つのモジュールをつかってplaybookを書く場合 コマンド実行による冪等性の保証が困難です。playbookを書く際には他のモジュールを調べた上で、どうしても他のモジュールでは記述できないときにだけ、このshell commandモジュールを使えばよいかと思います。
##script
scriptモジュールは、ローカルのシェルスクリプトをリモート上で実行する。
###オプション
|頻度|パラメータ|必須|デフォルト値|選択肢|説明|
|:-:|:-:|:-:|:-:|:-:|:--|
||creates|no|-|-|指定したファイル名が既に存在する場合、シェルスクリプトを実行しない|
|※|free_form|yes|-|-|実行するシェルスクリプトのローカルパスの指定.free_formというオプション名はつけず、パスを書き始めれば良い|
||removes|no|-|-|指定したファイル名が存在しない場合、シェルスクリプトを実行しない|
**例**

```yml:playbook
- script: /some/local/script.sh --some-arguments 1234

- script: /some/local/create_file.sh --some-arguments 1234 creates=/the/created/file.txt

- script: /some/local/remove_file.sh --some-arguments 1234 removes=/the/removed/file.txt
```
##file
ファイル、シンボリックリンク、ディレクトリの属性設定・削除を行う。
###オプション
|頻度|パラメータ|必須|デフォルト値|選択肢|説明|
|:-:|:-:|:-:|:-:|:-:|:--|
|※|path|yes|-|-|ファイルパスの指定|
|※|group|no|-|-|chownコマンドで設定できる所有者グループの設定|
|※|mode|no|-|-|chmodコマンドで設定できる権限設定.8進数の指定とシンボリックモードでの指定が可能|
|※|owner|no|-|-|chownコマンドで設定できる所有者ユーザの設定|
||follow|no|no|yes<br>no|既にファイルが存在する場合置き換えない|
|※|src|no|-|-|実体ファイルのパスを指定(state=linkの場合のみ).相対パスは設定できない|
|※|state|no|file|file<br>link<br>directory<br>hard<br>touch<br>absent|file: ファイルが既に存在する場合に指定.もし存在しない場合、copyモジュールやtemplateモジュールを使用する<br>link: シンボリックリンクの場合に指定<br>directory: ディレクトリの場合に指定.存在しない場合サブディレクトリとして作成される.権限は上位から継承される<br>hard: ハードリンクの場合の指定<br>touch: pathで指定したファイルが存在しない場合、空ファイルを作成する<br>absent: ディレクトリやファイル、シンボリックリンクの削除|
**例**

```yml:playbook
- file: path=/etc/foo.conf owner=foo group=foo mode=0644

- file: src=/file/to/link/to dest=/path/to/symlink owner=foo group=foo state=link

- file: src=/tmp/{{ item.path }} dest={{ item.dest }} state=link
  with_items:
    - { path: 'x', dest: 'y' }
    - { path: 'z', dest: 'k' }
```
##lineinfile
lineinfileモジュールは、ファイルを検索して、行が存在するかどうかを確認する。
また、ファイル内の1行だけを変更したい場合に、有効です。
###オプション
|頻度|パラメータ|必須|デフォルト値|選択肢|説明|
|:-:|:-:|:-:|:-:|:-:|:--|
|※|path|yes|-|-|書き換える対象のファイルのパス|
|※|regexp|no|-|-|書き換えたい行にマッチする正規表現|
|※|line|no|-|-|書き換えたい内容|
||backup|no|-|yes<br>no|バックアップファイルを作成する|
||backrefs|no|-|yes<br>no|正規表現内のバックスラッシュが使えるようにする|
||state|no|present|present<br>absent|present:テキストファイル内に対象の行を書き込む<br>absent:テキストファイル内で対象の行を削除|
**例**

```yml:playbook
- lineinfile:
    path=/etc/selinux/config
    regexp='^SELINUX='
    line='SELINUX=enforcing'

- lineinfile:
    dest=/home/vagrant/lineinfile/text.txt
    state=absent
    regexp='absent line'

- lineinfile:
    path='/path/to/file'
    state=present
    backrefs=yes
    regexp='{{ item.regexp }}'
    line='{{ item.line }}'
  with_items:
  - regexp: '^#?\s*ServerTokens'
    line: 'ServerTokens Prod'
  - regexp: '^#?\s*ServerSignature'
    line: 'ServerSignature Off'
```
##replace
replaceモジュールは、ファイル内の対象パターンのすべてのインスタンスを置き換える。
###オプション
|頻度|パラメータ|必須|デフォルト値|選択肢|説明|
|:-:|:-:|:-:|:-:|:-:|:--|
|※|path|yes|-|-|書き換える対象のファイルのパス|
|※|regexp|yes|-|-|書き換えたい部分にマッチする正規表現|
||replace|no|-|-|書き換えたい内容|
||backup|no|-|yes<br>no|バックアップファイルを作成する|
||before|no|-|-|指定すると、置換/削除前の行が表示される|
||after|no|-|-|指定すると、置換/削除後の行が表示される|
**例**

```yml:playbook
- replace:
    dest='/path/to/file'
    regexp='AllowOverride None'
    replace='AllowOverride All'

- replace:
    path: /etc/hosts
    regexp: '(\s+)old\.host\.name(\s+.*)?$'
    replace: '\1new.host.name\2'
    after: 'Start after line.*'
    before: 'Start before line.*'
    backup: yes
```
##blockinfile
blockinfileモジュールは、複数行のテキストを挿入/更新/削除する
###オプション
|頻度|パラメータ|必須|デフォルト値|選択肢|説明|
|:-:|:-:|:-:|:-:|:-:|:--|
|※|path|yes|-|-|書き換える対象のファイルのパス|
||insertafter|no|-|-|指定された正規表現の最後の一致の後に挿入される|
||content|no|-|-|挿入する内容|
||block|no|-|-|テキストファイル内部に挿入するテキスト|
||create|no|-|yes<br>no|ファイルが存在しない場合は作成する|
||backup|no|-|yes<br>no|バックアップファイルを作成する|
||state|no|present|present<br>absent|present:テキストファイル内に対象の行を書き込む<br>absent:テキストファイル内で対象の行を削除|
**例**

```yml:playbook
- blockinfile:
    path: /tmp/hello
    insertafter: '^hello world$'
    content: hello ansible

- blockinfile:
    path: /etc/ssh/sshd_config
    block: |
      Match User ansible-agent
      PasswordAuthentication no
```
##user
ユーザーアカウントとユーザー属性を管理する。
###オプション
|頻度|パラメータ|必須|デフォルト値|選択肢|説明|
|:-:|:-:|:-:|:-:|:-:|:--|
|※|name|yes|-|-|作成・変更・削除するユーザアカウントの名前|
|※|password|no|-|-|パスワードを設定する|
|※|group|no|-|-|メイングループの名前を指定する|
||append|no|no|yes<br>no|サブグループに追加する|
||groups|no|-|-|サブグループをカンマ区切りで指定する.『groups=』(空文字列)を指定するとサブグループを削除する|
||home|no|-|-|ユーザアカウントのホームディレクトリを指定する|
||createhome|no|yes|yes<br>no|ユーザアカウントが作成されたかホームディレクトリが存在しない時にホームディレクトリを作成する|
|※|state|no|present|present<br>absent|present:ユーザアカウントを作成する<br>absent:ユーザアカウントを削除する|
||generate_ssh_key|no|no|yes<br>no|SSH鍵を生成する。既存のSSH鍵は上書きされない。|
||ssh_key_bits|no|2048|-|SSH鍵のbit数を指定する。|
||ssh_key_comment|no|ansible-generated|-|SSH鍵のコメントを設定する。|
||ssh_key_file|no|$HOME/.ssh/id_rsa|-|SSH鍵のファイル名の指定する。|
||ssh_key_passphrase|no|-|-|SSH鍵のパスワードを設定する。パスワードが設定されない場合、SSH鍵はパスワードを持たない。|
||ssh_key_type|no|rsa|-|SSH鍵のタイプを指定する。利用可能なSSH鍵のタイプは、ホスト上での実装に依存する。|
||shell|no|-|-|ユーザシェルを設定する。|
||system|no|no|yes<br>no|『yes』を指定するとユーザアカウントはシステムアカウントになる。この設定は既存ユーザアカウントの変更はできない。|
||uid|no|-|-|ユーザアカウントのUIDを設定する。|
||update_password|no|always|always<br>on_create|always:必ずパスワードを更新する。<br>on_create:新しく作成された時にパスワードを設定する。|
**例**

```yml:playbook
- user: name=tarou

- user:
    name=monogusa
    uid=1001
    group=monogusa
    groups=wheel
    home=/home/monogusa
    shell=/bin/bash

- user: name=jsmith generate_ssh_key=yes ssh_key_bits=2048
```
##group
グループの作成、編集、削除を行う。
###オプション
|頻度|パラメータ|必須|デフォルト値|選択肢|説明|
|:-:|:-:|:-:|:-:|:-:|:--|
|※|name|yes|-|-|グループ名を指定。|
||gid|no|-|-|GIDを指定。|
||state|no|present|present<br>absent|present: 無ければ作成<br>absent: あれば削除|
**例**

```yml:playbook
- group: name=test

- group:
    name=test
    gid=1001
    state=present
```
##service
serviceモジュールは、serviceコマンドを実行する。
###オプション
|頻度|パラメータ|必須|デフォルト値|選択肢|説明|
|:-:|:-:|:-:|:-:|:-:|:--|
|※|name|yes|-|-|サービスの名前。|
|※|enabled|no|-|yes<br>no|マシン起動時に自動起動させるか。|
||arguments(args)|no|-|-|引数の指定。|
||pattern|no|-|-|サービスがstatusコマンドに応答しない場合、ステータス結果のスタンドとして ps コマンドの出力にある部分文字列を探す。 文字列が見つかった場合、サービスは実行中であるとみなす。|
|※|state|no|-|started<br>stopped<br>restarted<br>reloaded|started: サービスを開始する。<br>stopped: サービスを停止する。<br>restarted: サービスを再起動する。<br>reloaded: サービスを再読み込みする。|
**例**

```yml:playbook
- service: name=httpd state=started

- service:
    name=httpd
    state=stopped

- service: name=foo pattern=/usr/bin/foo state=started

- service: name=network state=restarted args=eth0
```

#参考
[はじめてAnsibleを使う人が知っておきたい7つのモジュール](https://www.infiniteloop.co.jp/blog/2013/08/ansible/)
[Ansibleでファイルの行を書き換える3つの方法](https://qiita.com/cognitom/items/57de72b739642041dcd5)
[AnsibleでWindows Server 2012を構成する](https://qiita.com/tksarah/items/5f5916ec9236f24ff2a8#win_ping)
[Ansibleでよく使うモジュール](http://monogusa.wiki.fc2.com/wiki/Ansible%E3%81%A7%E3%82%88%E3%81%8F%E4%BD%BF%E3%81%86%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)
[ansible commandとshellモジュールの違い](http://kakts-tec.hatenablog.com/entry/2017/04/24/004904)