Ansibleについて調べたことの雑多なまとめ


変数

公式ドキュメント - Using Variables

iniファイル形式でもYAML形式でも記述できるらしい。これはインベントリファイルのことか...?

# ini形式
[atlanta]
host1
host2

[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
# YAML形式
atlanta:
  hosts:
    host1:
    host2:
  vars:
    ntp_server: ntp.atlanta.example.com
    proxy: proxy.atlanta.example.com

ホスト変数とグループ変数

インベントリに変数を定義するだけでなく、ホスト変数やグループ変数を定義することができる。
その場合はYAML形式を使用する必要がある模様。
/etc/ansible/ディレクトリ配下、カレントディレクトリ配下のgroup_varshost_varsディレクトリにグループ名/ホスト名のファイルを作成し設定を記述する。

/etc/ansible/group_vars/raleigh # ファイルの拡張子は '.yml'、 '.yaml'、 もしくは '.json'
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball

roleに紐づく変数の定義ファイルなどはちょっと違ったりしそう。main.ymlだったり。
下記も目を通しておきたい。
公式ドキュメント - Best Practices

繰り返し処理

loopwith_*を使って繰り返し処理を実行することができる。
loopはAnsibleのバージョン2.5で追加された機能だそうです。
一部のモジュールではパラメータに直接リストを渡すことができるので、タスクをループさせるより効率が良いことがある。モジュールのマニュアルを読むこと。

公式ドキュメント - Loops

単純なリストの繰り返し処理

- name: add several users
  user:
    name: "{{ item }}"
    state: present
    groups: "wheel"
  loop: # with_items:
     - testuser1
     - testuser2

ハッシュリストの繰り返し処理

- name: add several users
  user:
    name: "{{ item.name }}"
    state: present
    groups: "{{ item.groups }}"
  loop: # with_items:
    - { name: 'testuser1', groups: 'wheel' }
    - { name: 'testuser2', groups: 'root' }

変数を参照する場合

事前に定義した変数を使用して繰り返し処理を行う場合、loopに変数を指定する。
変数は"{{ }}"で括らないと変数が参照できない。
注意したほうがいいのは変数名で、暗黙的に宣言されている変数があるので、それとかち合ってる場合はうまく動かなくてハマる。。。groupsとか。
公式ドキュメントの特殊変数を確認しよう。。。

vars:
  users:
    - { name: 'testuser1', groups: 'wheel' }
    - { name: 'testuser2', groups: 'root' }

- name: add several users
  user:
    name: "{{ item.name }}"
    state: present
    groups: "{{ item.groups }}"
  loop: "{{ users }}"

タスクを管理者ユーザで実行する

rootでSSH接続できない場合、管理者権限でタスクを実行するにはbecomeを使います。

公式ドキュメント - Understanding privilege escalation: become

Playbookに記載する場合は下記のような形で記載する。

---
- hosts: all
  become: yes
  become_user: root
  become_method: su
  become_flags: '-s /bin/sh'

または変数を設定する。
変数は適用範囲に応じて適切なファイルに指定しておけばいいと思う。

---
# group_vars/all.yml
ansible_become: yes
ansible_become_method: su
ansible_become_password: somepassword

become_passwordはパスワードハッシュは指定できないみたい。
機微なデータを保護したい場合はAnsible Vaultを使う感じ。

実行

DRY-RUN

--checkオプションつけて実行する。
--diffオプションもあるが何が違うのか...

構文チェック

--syntax-checkオプションつけて実行する。

タスク一覧の確認

--list-tasksオプションつけて実行する。

特定のタスクから実行する

ansible-playbookコマンドを--start-at-taskオプション付きで実行する。
ステップ実行するには--stepオプションをつける。

ansible-playbook -i hosts -l hostname site.yml --start-at-task="some task name" --step