Skip to the content.

ansible

特徴

インストール

# CentOS7にて動作確認済
yum install epel-release
yum install ansible --enablerepo=epel-testing

# amazon-linuxにて動作確認済
amazon-linux-extras install epel
yum install -y ansible

# Ubuntu 18.04, 20.04にて動作確認済
apt update
apt install -y ansible

構成ファイル

# ログの出力先を設定
log_path = /var/log/ansible.log
# ログの出力時に改行する
stdout_callback = yaml

インベントリ

ホスト

$ cat /etc/hosts

192.168.0.0 controller
192.168.0.1 server1
192.168.0.2 server2
[aws]
10.0.0.0 ansible_ssh_user=USERNAME ansible_ssh_private_key_file=~/.ssh/SAMPLE.pem

インベントリの登録注意点

ansibleはsshで接続するため、認識していないホストは鍵確認で入力待ちになってしまうが、以下のいずれかの方法で無視できる

ANSIBLE_HOST_KEY_CHECKING=False ansible all -m ping
[defaults]
inventory = hosts
host_key_checking = False
ansible_user=root
ansible_become=True
ansible_become_pass=password
ansible_port=2222
ansible インベントリ -m setup

# hostsファイルなどに登録していないときにIPアドレスを指定して確認する場合
ansible -m setup -i '192.168.1.xxx,' all --private-key=SSHキーパス
ansible グループ名 --list-hosts
ansible ~.*1 --list-hosts # 正規表現で指定も可能
ansible-inventory -i インベントリ --list --yaml

ansibleコマンド

ansible 10.0.0.0 -m ping -i hosts --private-key ~/.ssh/SAMPLE.pem -u ec2-user

# 以下は /etc/ansible/hosts にインベントリを登録していれば上記と同じ動作
ansible 10.0.0.0 -m ping -i hosts
ansible aws -m ping -i hosts

# インベントリファイル内の特定の値(サブセット名)を抽出して指定する
ansible 10.0.0.0 -m ping -i hosts -l サブセット名

playbook

ansible-playbook --syntax-check YAML_FILE_NAME.yml
ansible-playbook SAMPLE.yml --step
ansible-playbook SAMPLE.yml --check
ansible-playbook SAMPLE.yml -C      # 省略版
# shell,commandモジュールでは強制skipとなるため、該当の箇所は check_mode: no を利用する
time ansible-playbook SAMPLE.yml
# 基本実行の形
ansible-playbook -i inventoryファイルのパス playbook.ymlファイルのパス

# インベントリファイルを指定せず、直接ホストを指定する場合はカンマをつける
ansible-playbook -i ホスト名, playbook.ymlファイルのパス

# 下記のインベントリファイルの指定のサブセットのみ実行する
ansible-playbook -i inventoryファイルのパス -l サブセット名 playbook.ymlファイルのパス
[サブセット1]
192.168.111.101
[サブセット2]
192.168.111.102
[サブセット3]
192.168.111.103
[サブセット4:children]
web
log

# 並列実行する台数を指定する(デフォルトは5)
ansible-playbook -i inventoryファイルのパス --forks=1 playbook.ymlファイルのパス # 1台ずつ実行
ansible-playbook -i inventoryファイルのパス -f 2 playbook.ymlファイルのパス      # 2台ずつ実行  オプション省略版
# 指定したタグのみ実行
ansible-playbook -i inventoryファイルのパス playbook.ymlファイルのパス  --tags=タグ名
ansible-playbook -i inventoryファイルのパス playbook.ymlファイルのパス  -t "タグ名1,タグ名2"  # 省略版
# 指定したタグをスキップして実行
ansible-playbook -i inventoryファイルのパス playbook.ymlファイルのパス  --skip-tags="タグ名1,タグ名"

# どのタグやタスクが実行されるか表示する
ansible-playbook -i inventoryファイルのパス playbook.ymlファイルのパス  --list-tags   # 実行タグを表示
ansible-playbook -i inventoryファイルのパス playbook.ymlファイルのパス  --list-tasks  # 実行タスクを表示

プレイブックキーワード

handler

  tasks:
    - name: Configure a MOTD (message of the day)
      copy:
        content: ""
        dest: /etc/motd
      notify: MOTD changed # 呼び出すhandlerの名称を記載

  handlers: # 該当のtaskで変更箇所があった場合に実行してくれる
    - name: MOTD changed
      debug:
        msg: The MOTD was changed

ロール

# ロールのテンプレート構成を作成
ansible-galaxy init ロール名

よく使うモジュール

- name: Install ruby
  yum:
    name: ""
    state: ""
    enablerepo: ""
  with_items: ""
  # with_items: "" # ちなみに変数の型が同じなら複数の変数を組み合わせ可能
  tags: php
# 変数の参考値
yum_install:
  - {
      name: "php",
      state: "latest"
    }
  - {
      name: "ruby",
      state: "latest"
    }
  - {
      name: "python3",
      state: "latest"
    }
yum_install_plus:
  - {
      name: "mysql",
      state: "latest"
    }

モジュール公式一覧

オプション名 説明  必須 デフォルト値
msg 定義された文を表示する × Hello world!
var 変数名をデバッグする(msg引数とお互いに排他的であり、msgと同時に使用できない) ×  
 - name: Show contents
   debug:
     var: contents

ignore_errosをyesにすると、そのタスクでエラーが発生しても無視して次のタスクに進むことができる。shellモジュールやcommandモジュールに使用する場合が多いかも

- name: 必ず失敗するタスク
  command: /bin/false
  ignore_errors: yes

- debug:
    msg: '直前タスクの失敗の場合でも次に進みます'

ログ出力

[defaults]
# ログの出力先を設定
log_path = /var/log/ansible.log
# ログの出力時に改行し、見やすくする
stdout_callback = yaml

リンター

ansible-lintでバグ解析可能

* インストール

pip install ansible-lint

* 使い方

ansible-lint 対象ファイル
ansible-lint  -p 対象ファイル # 1行表示