内容へ移動
メモとかメモのようなものとか(By ルーキーの中のひと)
ユーザ用ツール
ログイン
サイト用ツール
検索
ツール
文書の表示
以前のリビジョン
ODT 出力
バックリンク
最近の変更
メディアマネージャー
サイトマップ
ログイン
>
最近の変更
メディアマネージャー
サイトマップ
トレース:
serverapps:configmgmt:ansible:ansibletips
この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。
====== AnsibleのTips ====== ===== DryRun時にスキップ ===== スキップしたいTASKに以下の条件を付与する when: not ansible_check_mode ===== json形式のstdoutを利用する ===== json形式で値を返すコマンドを利用した場合に結果をregisterで記録すると、テキストとしてエスケープして記憶されてしまう <code yaml> - name: get any json respoce register: responce local_action: shell /path/to/command option </code> <code> TASK: [debug var=responce] ****************************************************** ok: [localhost] => { "responce": { "changed": true, "cmd": "/path/to/command option", "delta": "0:00:05.268682", "end": "20xx-mm-dd hh:mm:ss.xxxxxx", "rc": 0, "start": "20xx-mm-dd hh:mm:ss.xxxxxx", "stderr": "", "stdout": ""{\n \"key\": [\n {\n \"key2\": \"value1\", \n \"key3\": \"value2",.......... "stdout_lines": [ "{", " \"_meta\": {", " \"key\": {", " \"key2\": value1, ", " \"key3\": \"value2\", .......... .......... </code> 以下のようにするとデータとして保持できる <code yaml> - name: get any json respoce register: responce local_action: shell /path/to/command option - name: set facts set_fact: responce_json: "{{ responce.stdout|from_json }}" </code> <code> TASK: [debug var=responce_json] ****************************************************** ok: [localhost] => { "responce_json": { "key": { "key2": value1, "key3": "value2", .......... .......... </code> ===== Log設定 ===== 設定ファイル((ansible.cfg))に記述 [defaults] log_path=/path/to/logfile ===== プレイブックの実行対象となるホスト ===== プレイブックの実行対象となるホスト名の配列は play_hosts で得られる コマンドラインで確認するには $ ansible-playbook exsample-book.yml --list-host ===== ファイルの有無を確認 ===== <code yaml> # task - find: path=/path/to/folder register: checked_dir - fail: msg='this directory is not empty. file exists' when: checked_dir.matched > 0 - debug: msg: 'this directory is empty.' </code> ===== ファイルの存在確認 ===== <code yaml> # task - stat: path=/path/to/anyfile register: checked_file - name: skip if file is found. fail: msg='file not found' when: checked_file.stat.md5 is not defined ## OR - name: skip if file is found. fail: msg='file not found' when: not checked_file.stat.exists </code> with_itemsで複数のチェックを行うと若干変わるので注意 <code yaml> # task - stat: path=/path/to/anyfile register: is_exist with_items: - anyfile0 - anyfile1 - name: skip if anyfile0 is found. fail: msg='anyfile0 not found' when: is_exist.results[0].stat.md5 is not defined - name: skip if anyfile1 is found. fail: msg='anyfile1 not found' when: is_exist.results[1].stat.md5 is not defined </code> ===== ファイルの比較 ===== <code yaml> - stat: path=/path/to/anyfile1 register: is_exist1 - stat: path=/path/to/anyfile2 register: is_exist2 - debug: msg="compare" when: (is_exist1.stat.md5 == is_exist2.stat.md5) </code> ===== ディレクトリ作成 ===== <code yaml> - name: make directory file: path=/path/to/making/dir state=directory owner=root group=root mode=0755 </code> ===== Ansible Vault ===== 秘密鍵のようなそのまま置いておきたくない情報を暗号化する。 ===== WinRMでHTTPSアクセスするとエラー ===== windowsにアクセスすると以下のようなエラーが出る。 FAILED => 500 WinRMTransport. [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581) 原因はPython 2.7.9以降で入った<del>BUG</del>自己署名証明書に対しての[[https://www.python.org/dev/peps/pep-0476/|仕様変更]]。Ansible以外でも各所で悲鳴が上がってるが仕様なので治ることはないと思う。 以下のようなコールバックルーチンを使う <code python fix-ssl.py> import ssl if hasattr(ssl, '_create_default_https_context') and hasattr(ssl, '_create_unverified_context'): ssl._create_default_https_context = ssl._create_unverified_context class CallbackModule(object): pass </code> これで以下のようにすればOK ANSIBLE_LOAD_CALLBACK_PLUGINS=1 ansible windows -i [inventory] -m win_ping OR env ANSIBLE_LOAD_CALLBACK_PLUGINS=1 ansible windows -i [inventory] -m win_ping ANSIBLE_LOAD_CALLBACK_PLUGINS設定はansible.cfgの**bin_ansible_callbacks**でも設定できる。\\ プラグインロードのDefaultは以下の通り callback_plugins = ~/.ansible/plugins/callback_plugins/:/usr/share/ansible_plugins/callback_plugins こちらもansible.cfgで設定可能 ===== WinRMでAD認証するとエラー ===== windowsにアクセスすると以下のようなエラーが出る。\\ GSSError: (('Unspecified GSS failure. Minor code may provide more information', 851968) ActiveDirectoryを利用しているとき、Inventoryのansible_ssh_passが使用されていない kinit user@REALM これでとりあえず動くけど… **【追記】2015.11.05** どうやら、**kerberos認証の場合はキャッシュを使わないと動かない**模様。\\ いろいろ試したが、そもそもユーザ名が渡っておらず、ユーザ名に@がある場合にkerberosキャッシュを使っているみたい。\\ ドキュメントを読むとユーザ名に「@」がある場合にAD認証(kerberos)をすると書いてあるので、以下の設定でアクセス ユーザ名:'@' パスワード:'' ちゃんとつながりましたとさ...orz PowerSehllがsshサポートするので、2.0からsshに移行するみたいなので中途半端なままなのか? ===== 参考 ===== * [[http://qiita.com/myaaaaa_chan/items/f3473ae27f8e1b2abcac|Ansibleちょっとしたメモ]] * [[http://sharknet.us/2013/12/13/276/|How to Create Xen VMs Using Ansible]] * [[http://blog.keshi.org/hogememo/2015/12/07/exploiting-ansible-jinja2|Ansible の Jinja2 を活用する]] * [[https://gist.github.com/justinhennessy/28e82c2ec05f9081786a|Parsing JSON with Ansible ...]]
serverapps/configmgmt/ansible/ansibletips.txt
· 最終更新: 2020/01/28 11:33 by
hayashi
ページ用ツール
文書の表示
以前のリビジョン
バックリンク
ODT 出力
文書の先頭へ