変数
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_vars、host_varsディレクトリにグループ名/ホスト名のファイルを作成し設定を記述する。
/etc/ansible/group_vars/raleigh # ファイルの拡張子は '.yml'、 '.yaml'、 もしくは '.json'
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball
roleに紐づく変数の定義ファイルなどはちょっと違ったりしそう。main.ymlだったり。
下記も目を通しておきたい。
公式ドキュメント - Best Practices
繰り返し処理
loopかwith_*を使って繰り返し処理を実行することができる。
loopはAnsibleのバージョン2.5で追加された機能だそうです。
一部のモジュールではパラメータに直接リストを渡すことができるので、タスクをループさせるより効率が良いことがある。モジュールのマニュアルを読むこと。
単純なリストの繰り返し処理
- 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