GAGA LIFE.

インフラエンジニアブログ

スポンサーリンク

Oracle 学習用書籍

概要

Oracleデータベースを利用する際してはマニュアル/MOSの情報を参照しますが、
その他の情報としてOracleデータベースを勉強する上で個人的に役に立った書籍を挙げてみました。
キャリアとしては、Oracleの製品サポート⇒DBA⇒DBコンサルですが、どの立場だった時によく参照したか等も記載します。
あくまで私個人が実務で役に立ったもののみでOracle Master取得向けではありませんし、
Oracleデータベースの利用者すべてに役立つとも思えないので参考情報としてお使いください。

一覧

Name Category Description Link
絵で見てわかるOracleの仕組み Architecture サポート駆け出し時代に勉強のために購入。この本でよりOracleに興味を持ったと。H/WやOSの動作とOracleの関係性も分かる。※最近新装版が出た
絵で見てわかるOracleの仕組み 新装版

絵で見てわかるOracleの仕組み 新装版

  • 作者: 小田圭二,杉田敦史,山本裕美子,辻井由佳,寺村涼
  • 出版社/メーカー: 翔泳社
  • 発売日: 2019/03/11
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る
Oracleの基本 ~データベース入門から設計/運用の初歩まで Administration 入門ややり直し教材として良い。自分ではほとんど読み返さないが新人DBAの方に薦めている。
Oracleの基本 ~データベース入門から設計/運用の初歩まで

Oracleの基本 ~データベース入門から設計/運用の初歩まで

  • 作者: 渡部亮太,相川潔,日比野峻佑,岡野平八郎,宮川大地,株式会社コーソル
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/09/22
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (1件) を見る
プロとしてのOracle運用管理入門 Oracle現場主義 Administration DBA時代に時々参照。機能個々の知識としてはあったが体系的に学べて良かった。駆け出しDBAにオススメ
プロとしてのOracle運用管理入門 Oracle現場主義

プロとしてのOracle運用管理入門 Oracle現場主義

プロとしてのOracleアーキテクチャ入門 [第2版](12c、11g、10g 対応) 図解と実例解説で学ぶ、データベースの仕組み (Oracle現場主義) Architecture 各機能の動作原理が図解入りで分かる。アーキテクチャが理解しやすい。
Oracleの現場を効率化する100の技 Administration DBA時代にトラブルに備えて読んだ。コンサルの方のノウハウが起債されていて内容が実践的なので実務で役に立った。
Oracleの現場を効率化する100の技

Oracleの現場を効率化する100の技

  • 作者: 鈴木健吾,玉置雄大,塩原浩太,小林修,大森慎司,内村友亮
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/05/26
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (2件) を見る
新・門外不出のOracle現場ワザ ~エキスパートが明かす運用・管理の極意 Administration DBA時代に購入。DB運用における効率性・トラブル時の問題点の切り分け等に役立つ。
新・門外不出のOracle現場ワザ ?エキスパートが明かす運用・管理の極意

新・門外不出のOracle現場ワザ ?エキスパートが明かす運用・管理の極意

  • 作者: 五十嵐建平,大塚信男,小田圭二,村方仁,谷敦雄,宮崎博之,神田達成
  • 出版社/メーカー: 翔泳社
  • 発売日: 2013/08/07
  • メディア: Kindle版
  • この商品を含むブログを見る
絵で見てわかるシステム構築のためのOracle設計 DB Selection Design DBA時代に新規DBを構築する際にこちらに記載された情報を参考にした。高可用性/耐障害性/高パフォーマンスについて理解できた。
絵で見てわかるシステム構築のためのOracle設計 (DB Selection)

絵で見てわかるシステム構築のためのOracle設計 (DB Selection)

  • 作者: 加藤健,前島裕史,岡田憲昌,有滝永,草薙康裕,小田圭二
  • 出版社/メーカー: 翔泳社
  • 発売日: 2012/02/21
  • メディア: 単行本(ソフトカバー)
  • 購入: 10人 クリック: 146回
  • この商品を含むブログ (2件) を見る
絵で見てわかるOS/ストレージ/ネットワーク ~データベースはこう使っている Architecture サポートに入ったばかりの時に購入。OracleがどのようにしてOS/ストレージ/ネットワークと関係して動いているかが分かりやすい。
絵で見てわかるOS/ストレージ/ネットワーク~データベースはこう使っている (DB Magazine Selection)

絵で見てわかるOS/ストレージ/ネットワーク~データベースはこう使っている (DB Magazine Selection)

絵で見てわかるシステムパフォーマンスの仕組み Performance DBA時代に稼働確認やDBチューニングをする機会が多かったため、全体的に勉強したいと考え購入。問題の種類と取得すべきOS情報が整理できた。
絵で見てわかるシステムパフォーマンスの仕組み

絵で見てわかるシステムパフォーマンスの仕組み

絵で見てわかるITインフラの仕組み Architecture DBA時代にシステム基盤全体を理解・俯瞰する必要があったため購入。実務に直結はしないがアプリ担当やプロマネと会話する際に説明が楽になった。
絵で見てわかるITインフラの仕組み (DB SELECTION)

絵で見てわかるITインフラの仕組み (DB SELECTION)

  • 作者: 山崎泰史,三縄慶子,畔勝洋平,佐藤貴彦,小田圭二
  • 出版社/メーカー: 翔泳社
  • 発売日: 2012/09/19
  • メディア: 単行本(ソフトカバー)
  • 購入: 11人 クリック: 204回
  • この商品を含むブログ (7件) を見る
SQL 第2版 ゼロからはじめるデータベース操作 SQL サポート時代は製品の機能に関する仕様・トラブルに対応し、性能問題はあまり関わらなかったため、DBAになった時にSQLをあらためて勉強しようと購入。平易だが分かりやすい。
SQL 第2版 ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)

SQL 第2版 ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)

達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ SQL ゼロからはじめるデータベース操作が面白かったので続けて購入。より理解が進んでSQLそのものを集合論として考えられるようになった。
達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ (CodeZine BOOKS)

達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ (CodeZine BOOKS)

達人に学ぶDB設計 徹底指南書 Design DBA時代にアプリの方からよくテーブル設計に関する質問を求められたので読んだ。一般的な論理設計が学べる。
達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

SQL実践入門──高速でわかりやすいクエリの書き方 Execution Plan SQLチューニングが楽しいと感じるようになった一冊。オプティマイザが怖くなくなった。
SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

プログラマのためのSQL 第4版 すべてを知り尽くしたいあなたに SQL 上記SQLの本の著者であるミック氏が翻訳したSQLの名著。タイトル通りSQLの全てを知りたい人はデスクの横に。
プログラマのためのSQL 第4版

プログラマのためのSQL 第4版

Oracleデータベースセキュリティ セキュアなデータベース構築・運用の原則 Security データベースのセキュリティについてはそれほど知見がなかったためDBA時代に購入。セキュリティに関する考えをまとめる時に参照。
Oracleデータベースセキュリティ セキュアなデータベース構築・運用の原則

Oracleデータベースセキュリティ セキュアなデータベース構築・運用の原則

  • 作者: Scott Gaetjen,David Knox,William Maroulis,小田圭二,森谷真樹,小野真樹子,大竹ブライアン,小西亮輔,福島寛貴,鳥山康太郎,天川卓也,重川隼飛,藤波しのぶ,土門大貴,河崎耕一郎,雲崎翔太郎,松本功
  • 出版社/メーカー: 翔泳社
  • 発売日: 2015/09/19
  • メディア: 大型本
  • この商品を含むブログ (1件) を見る
プロとしてのOracle PL/SQL入門 【第3版】(Oracle 12c、11g、10g対応) PL/SQL サポート時代に勉強のために購入。PL/SQLについて体系的に学べる。
プロとしてのOracle PL/SQL入門 【第3版】(Oracle 12c、11g、10g対応) (Oracle現場主義)

プロとしてのOracle PL/SQL入門 【第3版】(Oracle 12c、11g、10g対応) (Oracle現場主義)

データベースの限界性能を引き出す技術 ~NoSQLに飛びつく前に知っておきたい原理と最新テクニック Exadata DBA時代にDBチューニングの学び直しのために読んだ。なぜ処理が遅くなるのかを様々レイヤーから理解できる。
プロとしてのSQLチューニング入門 SQL Tuning SQLチューニングの基本的な部分を理解したいと思い購入。今となっては少し古い情報だがSQLチューニング時の情報取得は理解できた。
プロとしてのSQLチューニング入門

プロとしてのSQLチューニング入門

パフォーマンス改善と事前対策に役立つ Oracle SQLチューニング SQL Tuning 索引操作・結合方法等の学び直しのために購入。ブロックアクセス方法について図解があるため理解しやすい。
パフォーマンス改善と事前対策に役立つ Oracle SQLチューニングSQLチューニング (DB SELECTION)

パフォーマンス改善と事前対策に役立つ Oracle SQLチューニングSQLチューニング (DB SELECTION)

SQLパフォーマンス詳解 SQL 索引の使用方法について深いレベルで記載されている。以前はなかったが最近Amazonで購入可能になった。
SQLパフォーマンス詳解

SQLパフォーマンス詳解

データベースパフォーマンスアップの教科書 基本原理編 Performance データへのアクセス効率を高めるためのテクニック・ノウハウが詰まっている。基本原理から載っているで読み応えがあった。
データベースパフォーマンスアップの教科書 基本原理編

データベースパフォーマンスアップの教科書 基本原理編

SQLアンチパターン SQL SQLとDB設計を一通り勉強した後に購入。SQL開発の現場でよくある失敗を例示し、回避策を教えてくれる。
SQLアンチパターン

SQLアンチパターン

Cost-Based Oracle Fundamentals Execution Plan DBA時代に購入。個人的にオプティマイザの動作やSQLチューニングにとても興味を持たせてくれた一冊。何度も読んだし、実際に試すと理解も早い。
Cost-Based Oracle Fundamentals (Expert's Voice in Oracle)

Cost-Based Oracle Fundamentals (Expert's Voice in Oracle)

オラクルマスター教科書 ORACLE MASTER Expert パフォーマンス・チューニング編 Performance 資格対策本だがパフォーマンス・チューニングに関してマニュアルと別観点で色々な機能が載ってる。マニュアルより読み易い。
オラクルマスター教科書 ORACLE MASTER Expert パフォーマンス・チューニング編(試験番号:1Z0-054)

オラクルマスター教科書 ORACLE MASTER Expert パフォーマンス・チューニング編(試験番号:1Z0-054)

  • 作者: 株式会社システム・テクノロジー・アイ林優子、代田佳子
  • 出版社/メーカー: 翔泳社
  • 発売日: 2011/02/18
  • メディア: 単行本(ソフトカバー)
  • クリック: 23回
  • この商品を含むブログを見る
Oracle Core: Essential Internals for DBAs and Developers Architecture サポート時代に購入。ダンプやデバッグの取得方法や解析ポイントが載ってる。マニア向けだけど熱狂して読んだ記憶がある。
Oracle Core: Essential Internals for DBAs and Developers (Expert's Voice in Databases)

Oracle Core: Essential Internals for DBAs and Developers (Expert's Voice in Databases)

Pro Oracle SQL (Expert's Voice in Oracle) Execution Plan SQLと実行計画について実例付きで説明してくれる。
Pro Oracle SQL (Expert's Voice in Oracle)

Pro Oracle SQL (Expert's Voice in Oracle)

  • 作者: Karen Morton,Kerry Osborne,Robyn Sands,Riyaj Shamsudeen,Jared Still
  • 出版社/メーカー: Apress
  • 発売日: 2013/10/29
  • メディア: ペーパーバック
  • この商品を含むブログを見る
Oracle SQL Performance Tuning and Optimization SQL Tuning SQLのパフォーマンスチューニングに関する書籍。オプティマイザの動作についても記載されており、例示も豊富で面白い。
Expert Oracle Database Architecture Architecture DBA時代に購入。日本語の本で概要は理解できたので深堀りのために読んだ。ところどころマニア向け。
Expert Oracle Database Architecture

Expert Oracle Database Architecture

Expert Oracle Exadata Exadata Exadataに初めて携わることになった時に予習のために購入。Exadataの特徴はこの一冊で把握し、実務ではマニュアルやMOSを利用した。
Expert Oracle Exadata

Expert Oracle Exadata

  • 作者: Martin Bach,Kristofferson Arao,Andy Colvin,Frits Hoogland,Kerry Osborne,Randy Johnson,Tanel Poder
  • 出版社/メーカー: Apress
  • 発売日: 2015/08/13
  • メディア: ペーパーバック
  • この商品を含むブログを見る
Oracle Exadata Expert's Handbook Exadata Exadataから一旦距離を置いていた時間があったため学び直しのため購入。上記より上級者向け。
Oracle Exadata Expert's Handbook (English Edition)

Oracle Exadata Expert's Handbook (English Edition)

  • 作者: Tariq Farooq,Charles Kim,Nitin Vengurlekar,Sridhar Avantsa,Guy Harrison,Syed Jaffar Hussain
  • 出版社/メーカー: Addison-Wesley Professional
  • 発売日: 2015/06/12
  • メディア: Kindle版
  • この商品を含むブログを見る
Oracle SQL Tuning with Oracle SQLTXPLAIN SQL Tuning SQLチューニングをする際の取得情報と解析方法が学べる。
Oracle SQL Tuning with Oracle SQLTXPLAIN: Oracle Database 12c Edition (English Edition)

Oracle SQL Tuning with Oracle SQLTXPLAIN: Oracle Database 12c Edition (English Edition)

Oracle Database 12c Performance Tuning Recipes Performance 従来からのSQLチューニングに加え、12cで実装された情報採取・チューニング方法・機能が把握できた。
Oracle Database 12c Performance Tuning Recipes: A Problem-Solution Approach (Expert's Voice in Oracle)

Oracle Database 12c Performance Tuning Recipes: A Problem-Solution Approach (Expert's Voice in Oracle)

Troubleshooting Oracle Performance Performance Oracleのトラブルシューティングに特化した書籍。障害パターンによって取得すべき情報と対応ポイントが分かる。
Troubleshooting Oracle Performance

Troubleshooting Oracle Performance

Oracle Database Problem Solving and Troubleshooting Handbook Performance DBチューニング~SQLチューニングまでカバーされた問題解決のアプローチの書籍。ケース分けされてて読み易い。
Oracle Database Problem Solving and Troubleshooting Handbook (English Edition)

Oracle Database Problem Solving and Troubleshooting Handbook (English Edition)

  • 作者: Tariq Farooq,Mike Ault,Paulo Portugal,Mohamed Houri,Syed Jaffar Hussain,Jim Czuprynski,Guy Harrison
  • 出版社/メーカー: Addison-Wesley Professional
  • 発売日: 2016/04/04
  • メディア: Kindle版
  • この商品を含むブログを見る

straceコマンドついて

概要

straceについての備忘録です。
個人的に利用頻度は高くないですが、時々実行しようとすると忘れていることが多いので まとめておきます。

straceについて

straceは実行中のプログラムが呼んだシステムコールを表示してくれるツールです。
straceの結果から、どのシステムコールで待っているのか・OSの何の関数で待機しているかが確認可能です。
アプリケーションプログラムが内部でどの部分で待機しているかは確認できません。

インストール(CentOS)

CentOS

yum install strace

ubuntu

apt-get install strace

オプション(使用頻度が高いもの)

Options Description
s 表示する最大文字列サイズを指定(デフォルトは32)。システムコールなどで読み書きした内容を全て確認したい場合は大きくする。
tt 行頭にタイムスタンプを出力(マイクロ秒)
T 行末にシステムコールに費やした時間(※)を表示。※各システムコールの開始と終了の間の時間差を記録
ff 子プロセスのシステムコールもトレース。-oが有効な場合プロセス(スレッド)毎に別ファイルに出力
o 指定したファイル名に出力。-ffとの併用で ファイル名. に出力
p プロセスIDを指定
e どのイベントをトレースするか、またはどのようにトレースするかを変更する修飾表現
c システムコールごとに統計情報(時間/呼び出し/エラーのカウント)を表示
r システムコールが要した時間を出力

-f オプションの場合、別プロセスのトレース結果が同一ファイルに出力される。
別ファイルにしたい場合は、-ff オプションにすれば良い。

基本的な使用方法

$ strace [command]

実行例

  • 実行コマンドのトレース「$ strace <実行コマンド>」
$ strace ls
  • ファイルのトレース「$ strace <./ファイル名>」
$ strace ./hello >/dev/null
  • 確認するシステムコールを限定する「$ strace -e trace=<システムコール名(,システムコール名)>」
$ strace -e trace=open,read,write,close ./hello data >/dev/null
  • PIDを指定してstrace 「$ strace -p
$ strace -p 1111
  • トレース結果をファイル出力「$ strace -o <出力ファイル>」
$ strace -o strace-output.txt ls
  • システムコールが要した時間を出力「$ strace -r」
$ strace -r ls
  • トレース結果の統計情報を出力「$ strace -c」
$ strace -c ls
  • 実行時刻(秒単位)の表示(-t)「$ strace -t」
$ strace -t -p 2298
  • 実行時刻(マイクロ秒単位)の表示(-tt)「$ strace -t」
$ strace -tt -p 2298
  • 実行時間の表示方法(-T)「$ strace -T」
$ strace -T -p 2298
  • 特定のシステムコールを実行結果から除外「$ strace -e 'trace=!<除外対象のシステムコール>'」※複数可
$ strace -e 'trace=!write' -p 1347
  • 表示する文字列数を調整する(-s)「$ strace -s <数値>」
$ strace -s 100 -p 4159
  • 実行結果をプロセス毎にわける方法(-ff)「$ strace -ff」
$ strace -ff -p 3311,3312,3313,3314,3315,3316 -o strace.log

実用的な使用方法

  • システムコールの詳細確認
$ strace -Ttt -ff -s 1500000 -o <ログ出力先ファイル名> -p <PID>
$ strace -Ttt -ff -s 1500000 -o <ログ出力先ファイル名> <コマンド>
$ strace -Ttt -ff -s 1500000 -o /home/oracle/work/strace_ls.log ls
dump strace_ls.log.15881
[oracle@consrsec work]$ head strace_ls.log.15881 
02:37:42.710875 execve("/usr/bin/ls", ["ls"], [/* 55 vars */]) = 0 <0.000175>
02:37:42.711208 brk(0)                  = 0x7bb000 <0.000007>
02:37:42.711253 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1bd8854000 <0.000009>
02:37:42.711289 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) <0.000010>
02:37:42.711332 open("/u01/app/oracle/product/18.0.0/dbhome_1/lib/tls/x86_64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000013>
02:37:42.711378 stat("/u01/app/oracle/product/18.0.0/dbhome_1/lib/tls/x86_64", 0x7ffca63648b0) = -1 ENOENT (No such file or directory) <0.000009>
02:37:42.711402 open("/u01/app/oracle/product/18.0.0/dbhome_1/lib/tls/libselinux.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
02:37:42.711425 stat("/u01/app/oracle/product/18.0.0/dbhome_1/lib/tls", 0x7ffca63648b0) = -1 ENOENT (No such file or directory) <0.000017>
02:37:42.711458 open("/u01/app/oracle/product/18.0.0/dbhome_1/lib/x86_64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
02:37:42.711480 stat("/u01/app/oracle/product/18.0.0/dbhome_1/lib/x86_64", 0x7ffca63648b0) = -1 ENOENT (No such file or directory) <0.000007>
  • システムコールの種類別に集計(時間・回数)
$ strace -fc -o <ログ出力先ファイル名> -p <PID>
$ strace -fc -o <ログ出力先ファイル名> <コマンド>
$ strace fc -o /home/oracle/work/strace_ls.log ls
execve("/usr/bin/fc", ["fc", "-o", "/home/oracle/work/strace.log", "ls"], [/* 55 vars */]) = 0
brk(0)                                  = 0x1fe7000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc2bb9c1000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/u01/app/oracle/product/18.0.0/dbhome_1/lib/tls/x86_64/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/u01/app/oracle/product/18.0.0/dbhome_1/lib/tls/x86_64", 0x7ffe3891ae20) = -1 ENOENT (No such file or directory)
open("/u01/app/oracle/product/18.0.0/dbhome_1/lib/tls/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/u01/app/oracle/product/18.0.0/dbhome_1/lib/tls", 0x7ffe3891ae20) = -1 ENOENT (No such file or directory)
open("/u01/app/oracle/product/18.0.0/dbhome_1/lib/x86_64/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/u01/app/oracle/product/18.0.0/dbhome_1/lib/x86_64", 0x7ffe3891ae20) = -1 ENOENT (No such file or directory)
open("/u01/app/oracle/product/18.0.0/dbhome_1/lib/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/u01/app/oracle/product/18.0.0/dbhome_1/lib", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=113542, ...}) = 0
mmap(NULL, 113542, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc2bb9a5000
close(3)                                = 0
open("/lib64/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\316\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=174576, ...}) = 0
mmap(NULL, 2268928, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc2bb577000
mprotect(0x7fc2bb59c000, 2097152, PROT_NONE) = 0
mmap(0x7fc2bb79c000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7fc2bb79c000
close(3)                                = 0

見方

Column Examples Description
1 02:37:42.710875 システムコール実行開始時刻(時:分:秒.マイクロ秒)
2 execve("/usr/bin/ls", ["ls"], [/ 55 vars /]) = 0 システムコール
3 <0.000175> システムコール実行に要した時間(秒.マイクロ秒)

システムコールのマニュアル確認方法

man 2 <システムコール名>

  • open
$ man 2 open
  • write
$ man 2 write

参考資料

Ansible インベントリ

概要

インベントリの定義や基礎的な使用方法についてメモします。
インベントリは以下のいずれかでターゲットノードの接続情報を定義します。
- INI形式
- YAML形式
デフォルトのインベントリは、「/etc/ansible/hosts」が利用されます。
カスタマイズしたインベントリを利用する場合は、ansibleコマンド、
もしくはansible-playbookコマンド実行時にインベントリパスを明示的に指定(オプション「-i」)します。

ホストのグループ化

同様の設定を実行するサーバー群をグルーピングしておくことによって、グループ化されたターゲットノードに対して、同一の処理を実施可能です。
- グループ定義:"[]"でグループ名を囲む
- その下にIPアドレス・ホスト名を列挙
- グループには階層を付けることが可能
- 上位グループは"[グループ:children]"を表記後下位グループを記述する
上記により、個々のグループに処理を実施せずとも複数のグループ全体に処理を実施することも可能になります。
なお、各ターゲットノードは暗黙的に[all]グループに属します。

インベントリグループの例

例) group_inventory.ini

[web_servers]    ## Group Name
192.168.3.[8.10] ## Target Node

[oracle]
oracle122
oracle181

[mysql]
mysql-[a:d]      ## mysql-a, mysql-b, mysql-c, mysql-d

[db_servers:children]  ## oracle,mysqlの上位グループ
oracle
mysql

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

インベントリ変数:各ノードやグループに対する固有の変数定義が可能。
以下のような状況の場合にはインベントリ変数の利用を考えます。
- 環境によって接続ユーザーや接続方法が異なる場合
- 特定のホストに対して固有の環境情報を指定したい場合
指定対象によって、以下の通り名称が分かれます。

Name Description
Host Variables ターゲットノード固有に適用される変数。インベントリではターゲットノードの後ろに定義する
Group Variables グループ全体に適用される変数。インベントリでは"[グループ名:vars]"というセクションを作成し、その下に変数を列挙する

インベントリ変数の例

var_inventory.ini

[web_servers]
192.168.3.[8:10]

[oracle]
oracle122 ansible_host=192.168.3.100  ##[ホスト変数]oracle122のSSH接続IP
oracle181 ansible_host=192.168.3.101  ##[ホスト変数]oracle181のSSH接続IP

[mysql]
mysql-[a:d]

[db_servers:children]
oracle
mysql

[web_server:vars]
http_port=8080    ##[グループ変数]"http_port"の設定

[all:vars]
ansible_port=1022 ##[グループ変数]すべてのサーバーのSSH接続ポート
ansible_user=ansible  ##[グループ変数]SSH接続ユーザー

ホスト変数/グループ変数には、以下が存在します。
- ユーザー定義変数:ユーザーが固有に設定可能 - 接続変数(Behaviral Inventory Parameters):ターゲットノードへの接続を制御する

接続変数

Category Variables Default Description
ターゲットノード接続 ansible_connection smart Connectionプラグインを利用したターゲットノードへの接続方法を設定する。SSHを利用しない、[local]や「docker」接続に変更可能
SSH接続 ansible_host - ターゲットノードの名前やエイリアス名を設定する
SSH接続 ansible_port 22 ターゲットノードのSSHポートを設定する
SSH接続 ansible_user コマンド実行ユーザー SSH接続するユーザー名を設定する
SSH接続 ansible_ssh_pass - SSHパスワード認証のパスフレーズを設定する
Private設定 ansible_become false 特権実行を行うかどうかを設定する
Private設定 ansiblebecome_user - タスクを実行する特権ユーザーを設定する
Private設定 ansible_become_pass - 特権ユーザーになるためのパスフレーズを設定する
ターゲットノード環境 ansible_shell_type sh ターゲットノードのShellのタイプを選択する
ターゲットノード環境 ansible_python_interpreter /usr/bin/python ターゲットノードのPythonのパスを指定する

インベントリ変数のファイル分割

インベントリの中で定義していたホスト変数やグループ変数はYAMLファイルに分割可能です。
これにより、INI形式で起債されたインベントリにはターゲットノードを起債し、ターゲットノードごとの変数はYAMLファイルにまとめることが可能です。
動的に読み込みを行うためには指定のディレクトリ構造とファイルの命名規則に則って定義する必要があります。

インベントリ変数のディレクトリ構造

Name Description
グループ変数 group_varsというディレクトリ配下に「group_vars/<グループ名>.yml」または「group_vars/<グループ名>/XXX.yml」という名前でYAMLを配置
ホスト変数 host_varsというディレクトリ配下に「group_vars/<ホスト>.yml」または「group_vars/<ホスト名/XXX.yml>」という名前でYAMLファイルを配置

インベントリの例

inventory.ini

[web_servers]   ## グループ名
192.168.3.[1-3] ## 192.168.3.1 ~ 192.168.3.3

[db_servers]    ## グループ名
mysql-[a-c]     ## mysql-a, mysql-b, mysql-c

Ansible playbookコマンド実行

概要

プレイブックコマンドを利用したコマンドを確認します。

設定

基本となるインベントリとプレイブックを作成していきます。
その際、ターゲットノードをインベントリに指定します。
・やりたいこと
- ターゲットにディレクトリ作成
- コントロールのhostsファイルをコピー・転送

$ pwd
/home/ansible/PATH_TO/effective_ansible/sec2/inventory
$ cat test02_inventory.ini 
[test_servers]
192.168.3.9
192.168.3.8
$ cd ..
$ cat 
inventory/         test_playbook.yml  
$ cat test_playbook.yml 
---
- hosts: test_servers
  tasks:
  - name: create directory
    file:
       path: /home/ansible/tmp
       state: directory
       owner: ansible
       mode: 0755

  - name: copy file
    copy:
       src: /etc/hosts
       dest: /home/ansible/tmp/hosts
       owner: ansible
       mode: 0644

※IPアドレスは環境に合わせて適宜設定。
今回は192.168.3.9:コントロールノード、192.168.3.8:ターゲットノード

ansible-playbookコマンド実行

  • コントロールノード
$ ansible-playbook -i ./sec2/inventory/test02_inventory.ini ./sec2/test_playbook.yml 

PLAY [test_servers] ************************************************************************************

TASK [Gathering Facts] *********************************************************************************

TASK [create directory] ********************************************************************************
changed: [192.168.3.9]
changed: [192.168.3.8]

TASK [copy file] ***************************************************************************************
changed: [192.168.3.9]
changed: [192.168.3.8]

PLAY RECAP *********************************************************************************************
192.168.3.8                : ok=3    changed=2    unreachable=0    failed=0
192.168.3.9                : ok=3    changed=2    unreachable=0    failed=0
  • ターゲットノード
$ ls -la tmp/hosts 
-rw-r--r--. 1 ansible ansible 179  120 19:03 tmp/hosts

Ansible実行結果

Results Status Description
ok 成功 既に定義された状態になっているため、処理を実行しなかった
changed 成功 タスクで指定したステータスと異なっていたため、変更を実施した
skip 成功 タスクの実行条件に合っていなかったため、処理を実行しなかった
unreachable 失敗 ターゲットノードに接続できなかった
failed 失敗 タスク実行の結果、何らかのエラーが発生し、定義された状態にならなかった

ansibleコマンド実行

概要

環境とコントロール/ターゲットを整備したので、動作確認のためにコマンドを実行してみます。

コマンド実行

ここでは、playbookを使用せず、モジュールを直接指定するansibleコマンドを使用します。
まず、接続可能ターゲットの情報を記載したインベントを作成。
動作確認としてターゲットノードを用意しないでコントロールノードそのものをターゲットノードに指定しています。
./sec2/inventory/test01_inventory.ini

1 [test_servers]
2 localhost

動作確認

ping

$ cd PATH_TO/effective_ansible/sec2/
$ ansible -i inventory/test01_inventory.ini test_servers -m ping
localhost | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

「localhost | SUCCESS」の表示で接続成功を確認できます。 「"changed": false」は、実行コマンドで何の変更もなされていないためです。

file

「-a」:作成ファイル指定

$ cd PATH_TO/effective_ansible/sec2/
$ ansible -i inventory/test01_inventory.ini test_servers -m file -a 'path=/home/ansible/test.txt state=touch mode=0644'
localhost | SUCCESS => {
    "changed": true, 
    "dest": "/home/ansible/test.txt", 
    "gid": 1002, 
    "group": "ansible", 
    "mode": "0644", 
    "owner": "ansible", 
    "secontext": "unconfined_u:object_r:user_home_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 1002
}
$ ls -la /home/ansible/test.txt 
-rw-r--r--. 1 ansible ansible 0  114 18:43 /home/ansible/test.txt

「"changed": true」で変更を確認でき、test.txtの空ファイル作成ができていることが確認できます。

Ansible ansible.cfgのパラメータ

設定パラメータ デフォルト値 内容
forks 5 ターゲットノードの並列処理を行うプロセス数を設定する。値が大きいほど、並列に早い処理が可能だが、値が大きすぎる場合、CPUやN/W負荷となる
log_path - ansible実行コマンドログの配置場所を設定する。Ansible実行ユーザーがログファイルへのアクセス権限を持っているか要確認
host_key_checking True ターゲットノードにSSH接続する際の公開鍵のフィンガープリントチェックを行う
gathering implicit ターゲットノードの詳細情報取得に関する設定を行う
・implicit
キャッシュが無視され、常に情報収集が実施される
・explicit
キャッシュを利用し、情報収集が実施されない
・smart
新規に接続した時のみ情報収集を行い、キャッシュがある場合は情報収集を実施しない
gather_subset all ターゲットノードの詳細情報取得を制限できる
・all
全ての情報を収集する
・network
最小限の情報とN/W情報を収集する
・hardware
ハードウェア情報を収集する
・virtual
最小限の情報と仮想マシンに関する情報を収集する
transport smart ターゲットノードへの接続方法の設定を行う
・smart
OpenSSHがControlPersist機能対応時は「OpenSSH」接続を行い、未対応であれば、Pythonモジュールの「paramiko」を利用して接続を実施する
・paramiko
Pythonのssh機能で、アクションのたびに各ホストに再接続を行う
・local
SSHを利用せず、直接ローカルホストに接続を行う

Ansible事前準備

概要

Ansibleで動作確認する前の事前準備

事前準備

  • Ansibleユーザー作成
  • SSH公開鍵認証の設定
  • 作業ディレクトリの作成
  • ansible.cfg設定

Ansibleユーザー作成

Ansibleユーザー(一般ユーザー)を作成。必要に応じて特権を付与
※ここではユーザーansibleを作成

# useradd ansible

SSH公開鍵認証の設定

SSHを使用してターゲットノードに接続を実施しますが、公開鍵認証方式を利用します。
コントロールノードがターゲットノードに接続するため、コントロールノード側で秘密鍵と公開鍵を作成し、
ターゲットノード側に公開鍵を登録します。

ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ansible/.ssh/id_rsa): 
Created directory '/home/ansible/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/ansible/.ssh/id_rsa.
Your public key has been saved in /home/ansible/.ssh/id_rsa.pub.
$ ssh-copy-id -o StrictHostKeyChecking=no -i $HOME/.ssh/id_rsa.pub localhost
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ansible/.ssh/id_rsa.pub"
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
ansible@localhost's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh -o 'StrictHostKeyChecking=no' 'localhost'"
and check to make sure that only the key(s) you wanted were added.
$ ssh-copy-id -o StrictHostKeyChecking=no -i $HOME/.ssh/id_rsa.pub [ターゲットノード]

作業ディレクトリの作成

コントロールノード

$ mkdir -vp PATH_TO/effective_ansible/sec2/inventory/
mkdir: ディレクトリ `PATH_TO' を作成しました
mkdir: ディレクトリ `PATH_TO/effective_ansible' を作成しました
mkdir: ディレクトリ `PATH_TO/effective_ansible/sec2' を作成しました
mkdir: ディレクトリ `PATH_TO/effective_ansible/sec2/inventory/' を作成しました

ansible.cfg設定

Ansibleの設定ファイルであるansible.cfgは、配置場所によって読み込まれる優先順位が異なるようです。
以下の順序でansible.cfgを検索します。
1.環境変数(ANSIBLE_CONFIG=/usr/local/ansible/conf/ansible.cfg)
2.カレントディレクトリに存在する設定(./ansible.cfg)
3.ホームディレクトリに存在する設定($HOME/.ansible.cfg)
4./etc/ansible/ansible.cfg
- OSパッケージマネージャからのインストール:/etc/ansible/配下にデフォルトで配備
- pipやソースコードからのインストール:設定ファイルは存在しない
基本的にはホームディレクトリ($HOME/.ansible.cfg)に配置するのが良いようです。
$HOME/.ansible.cfg

[default]
# some basic default values...

forks = 15
log_path = $HOME/.ansible/ansible.log
host_key_config = False
gathering = smart

スポンサーリンク