wiki:devops/Ansible

Ansibleのメモ

踏み台経由でのAnsibleの実行

外から直接繋がっていないホストをSSHのプロキシサーバ経由で環境構築を行う。下記のような構成を想定する。

Ansible Client   10.0.2.8
     | 
Proxy Server     10.0.2.7
     |
Target Server    192.168.1.7

インベントリファイルは次のような内容を想定。

inventry

[target]
192.168.1.7

認証鍵の作成

ターゲットホストに乗り込むための認証鍵を作成する。

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/okamototk/.ssh/id_rsa): Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/okamototk/.ssh/id_rsa.
Your public key has been saved in /home/okamototk/.ssh/id_rsa.pub.
The key fingerprint is:
0d:62:14:09:20:9a:48:79:2b:2a:c2:b9:71:e8:d1:21 okamototk@mypc
The key's randomart image is:
+---[RSA 2048]----+
|..o...oo         |
|++ . ..          |
|+ . . o .        |
| E o . . o       |
|o * .   S .      |
|+* o             |
|+ =              |
| o               |
|                 |
+-----------------+

認証鍵のコピー

作成された~/.ssh/id_rsa.pubをTargeサーバの.ssh/authorized_keysにコピーする。

SSH設定ファイルを作成

プロキシ経由でSSH接続するための接続設定ファイルを作成する。

sshconfig

Host *
     IdentityFile /root/.ssh/id_rsa
     ProxyCommand ssh -W %h:%p -w 120 root@10.0.2.7

下記のコマンドでAnsible ClientからTargetホストにSSH接続できるか確認。

$ ssh -F sshconfig root@192.168.1.7

Ansible実行

上記の設定ファイルをANSIBLE_SSH_ARGSで指定して、ansibleを実行するだけ

$ export ANSIBLE_SSH_ARGS=' -F  sshconfig'
$ ansible-playbook -i inventy site.yml

エラー時の処理

コマンドの実行結果により、条件を分岐する例と、メッセージがエラーのときにタスクを失敗にする例。 ここでは、docker-engineパッケージがあるかどうかチェックし、存在しないときに、Dockerインストールスクリプトを実行する。 スクリプトの出力メッセージにFailedが含まれれば、タスクを失敗とする。

- command: rpm -q docker-engine
  register: rpm_installed
  failed_when: rpm_installed.rc not in [0, 1]

- shell:  curl -sSL https://get.docker.com/ | sh
  when: rpm_installed.rc == 1
  register: install_result
  failed_when: "'Failed' in install_result.stderr"

バージョンによる分岐

バージョンをチェックし、古いバージョンの場合、パッチを当てる例

- shell: /opt/td-agent/embedded/bin/fluentd --version |awk '{print $2}'
  register: fluentd_version

- lineinfile: >
    dest=/opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-{{fluentd_version.stdout}}/lib/fluent/parser.rb
    line="          conf = Config::Element.new('default_regexp_conf', '', conf, []) unless conf.is_a?(Config::Element)"
    regexp="          conf = Config::Element\.new\('default_regexp_conf', '', conf, \[\]\)"
  when: fluentd_version.stdout | version_compare('0.12.12', '<=')

デバッグメモ

デバッグメッセージの出力

$ ansible-playbook -vvv ...

ログ出力

debugを使う

  - debug: msg="メッセージ:{{variable}}"

特定のホストだけ実行する

$ ansible-playbook --host-lists site.yml

でホスト一覧を確認し、

$ ansible-playbook --l ホスト名 site.yml

で実行。

特定のタスクから実行

$ ansible-playbook --start-at=タスク名

ステップ実行

1つずつタスクを実行する場合、

$ ansible-playbook --step ....