ansible
特徴
- 冪等生 »> 「ある操作を何度実行しても常に結果が同じになる」性質のこと
cp fileA /tmp
を実行したいときの例- 冪等生なしの場合
- そのまま
cp fileA /tmp
を実行し、もし/tmp/fileA
が実行前にあったら再コピーして、無駄な処理が増える
- そのまま
- 冪等生ありの場合
- fileAがない時だけ、
cp fileA /tmp
実行するイメージ
- fileAがない時だけ、
- 冪等生なしの場合
インストール
# 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
構成ファイル
- 主に
ansible.cfg
で構成内容を設定するがどのansible.cfg
を採用されるかは優先度がある - 上(1)が優先度低く、下(4)に行くにつれて優先度が高くなる
etc/ansible/ansible.cfg
# よくシステムでインストールされた際にデフォルトで作成される~/.ansible.cfg
# ユーザーのホームディレクトリ./ansible.cfg
# カレントディレクトリANSIBLE_CONFIG
# 環境変数で指定された構成ファイル 例export ANSIBLE_CONFIG=/home/test/my_ansible.cfg
# ログの出力先を設定
log_path = /var/log/ansible.log
# ログの出力時に改行する
stdout_callback = yaml
インベントリ
ホスト
/etc/hosts
へ登録済の内容はインベントリファイルでも指定可能
$ cat /etc/hosts
192.168.0.0 controller
192.168.0.1 server1
192.168.0.2 server2
/etc/ansible/hosts
に対象のサーバを登録することで省略化、グループ化が可能
[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
- hostsファイルに以下のように記載
[defaults]
inventory = hosts
host_key_checking = False
ansible_user=root
ansible_become=True
ansible_become_pass=password
ansible_port=2222
- ansibleで取得する変数を確認可能
ansible インベントリ -m setup
# hostsファイルなどに登録していないときにIPアドレスを指定して確認する場合
ansible -m setup -i '192.168.1.xxx,' all --private-key=SSHキーパス
- グループのホスト名を一覧表示する
ansible グループ名 --list-hosts
ansible ~.*1 --list-hosts # 正規表現で指定も可能
- インベントリの構成をyaml形式で一覧表示
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
- yml文法に間違いないかチェックする
ansible-playbook --syntax-check YAML_FILE_NAME.yml
- デバッグ実行
ansible-playbook SAMPLE.yml --step
- dry-run実行(実際には実行しない)
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
- 変更があった場合、タスクの最後に1回だけ実行される。変更がない場合は実行されない
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
ロール
- 構成
- defaults/: ロールのデフォルト設定を格納するフォルダ
- files/: ロールで使用するファイルを格納するフォルダ
- handlers/: ロールで使用するハンドラを格納するフォルダ
- meta/: ロールに関するメタデータを格納するフォルダ
- tasks/: ロールで実行するタスクを格納するフォルダ
- templates/: ロールで使用するテンプレートを格納するフォルダ
- vars/: ロールで使用する変数を格納するフォルダ
- tests/: ロールのテストを格納するフォルダ
# ロールのテンプレート構成を作成
ansible-galaxy init ロール名
よく使うモジュール
- ターゲットセクションで定義するモジュール
- gather_facts → デフォルトでyes。実行時間など図れるがその分処理時間がプラスされるため、不要であれば
false
で設定 - become → 実行ユーザーを定義
- connection
- gather_facts → デフォルトでyes。実行時間など図れるがその分処理時間がプラスされるため、不要であれば
- when
- 条件分岐 -> 例
when: ansible_architecture == 'x86_64'
- 条件分岐 -> 例
- block
try except
のようにエラー処理
- ansible_distribution → 実行中のホストのOSのディストリビューションを示す変数(Amazon,Ubuntu,CentOSなど)
- with_items
- リストで値を保持し、以下のように ``で展開が可能
- 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
- get_url
- unarchive
- lineinfile → マッチした行を置換する(1行のみ)
- copy
- file
- shell → シェルを実行 ※冪等製が保たれないので非推奨
- script → 対象のスクリプトを実行
- service
- user
- pause
- set_fact → 変数の設置
- setup → ansibleコマンドで自動的に呼ばれる
- local_action
- ignore_errors
ignore_errosをyesにすると、そのタスクでエラーが発生しても無視して次のタスクに進むことができる。shellモジュールやcommandモジュールに使用する場合が多いかも
- name: 必ず失敗するタスク
command: /bin/false
ignore_errors: yes
- debug:
msg: '直前タスクの失敗の場合でも次に進みます'
ログ出力
- ansible実行時のログ出力先の指定と出力形式を指定して改行を見やすくする
ansible.cfg
というファイルをansible実行するルートディレクトリに配置する- 環境毎に設定を変更したい場合は
ansible.cfg
を各ディレクトリに配置可能
[defaults]
# ログの出力先を設定
log_path = /var/log/ansible.log
# ログの出力時に改行し、見やすくする
stdout_callback = yaml
リンター
ansible-lintでバグ解析可能
* インストール
pip install ansible-lint
* 使い方
ansible-lint 対象ファイル
ansible-lint -p 対象ファイル # 1行表示