【备忘录】整理Ansible的机制
本文旨在(或: 本文的目的是)
为了配合公司内的DevOps验证,学习Ansible的基础知识,并记录备忘录作为输出。
本文将解释Ansible清单、剧本和配置的概念。
存货
1. 库存是什么
- インベントリ:ターゲットノードをリストして記載するファイル。
2. 连接信息
-
- コントロールノード:インベントリとプレイブックを使用して、処理の指示を出す。
-
- ターゲットノード:コントロールノードの指示を受けて、処理を実施する。インベントリで、IPアドレスまたはホスト名を記載する事で定義する。
グループ:同一の処理を実施するターゲットノード群。インベントリで、”[ ]”でグループ名を囲み、その下にターゲットノードを記載する事で定義する。
インベントリ例
[web_servers]
apache-01
apache-02
[db_servers]
mysql-01
mysql-02
3. 连接变量
- ターゲットノードへの接続を制御するための変数。インベントリでは、ターゲットノードの後ろに記載する事で定義できる。主な接続変数は以下の通り。
接続変数名設定内容ansible_connectionターゲットノードへの接続方法。Linuxサーバに接続する場合は主に
ssh
、Windowsサーバに接続する場合は主にwinrm
の値を設定する。ansible_hostターゲットノードのホスト名及びエイリアス名。ansible_portターゲットノードのリモート接続ポート。デフォルトは22
。ansible_userターゲットノードへのリモート接続で使用するユーザー名。ansible_passwordターゲットノードへのリモート接続で使用するパスワード。- インベントリ例
[web_servers]
apache-01 ansible_connection=ssh ansible_host=192.168.6.161 ansible_user=root ansible_password=Password
apache-02 ansible_connection=winrm ansible_host=192.168.6.162 ansible_user=administrator ansible_password=Password
玩家手册
1. “Playbook”是什么意思?
-
- プレイブック:ターゲットノード側で実行したい処理の流れを記載するファイル。
-
- セクション:プレイブック内での処理のまとまり。
- ディレクティブ:セクション内で定義されるキー項目。
2. 主要部分/指令(指导方针)
- Targetセクション:ターゲットノードを特定する。プレイブックでは接続ディレクティブで定義する。主な接続ディレクティブは以下の通り。
ディレクティブ名設定内容hostsターゲットノードの接続パターン。基本的にはインベントリファイルで定義したターゲットノード及びインベントリグループを指定する。gather_factsターゲットノードでの情報取得の有無。
true
またはfalse
を指定する。- Tasksセクション:処理を実行するセクション。プレイブックではtasksディレクティブで定義する。また、tasksディレクティブではモジュール(Ansibleの処理用コンポーネント)を使用する事ができる。主なモジュールは以下の通り。
モジュール名設定内容command指定したコマンドを実施する。script指定したスクリプトを実施する。yum/apt
name
でパッケージ名を指定し、state
で状態を指定する事で、指定したパッケージの状態を定義する。主にパッケージの導入/削除に用いられる。servicename
でサービス名を指定し、state
で状態を指定する事で、指定したサービスの状態を定義する。主にサービスの起動/停止に用いられる。lineinfilepath
で指定されたファイル内でline
で指定された文を検索し、存在しない場合は該当する文の書き換えまたは追記を実施する。- Varsセクション:変数を設定する。プレイブックでは変数ディレクティブで定義する。主な変数ディレクティブは以下の通り。
ディレクティブ名設定内容vars基本的な変数を定義する。Jinja2(Python用のテンプレートエンジン)を利用し、”{{}}”の記号を用いて定義する場合が多い。var_files変数情報を管理しているファイルを定義する。
- プレイブック例①
hosts: web_servers
gather_facts: true
tasks:
- name: Execute command 'date'
command: date
- name: Execute script on server
script: test_script.sh
- name: Execute script on server
script: test_script.sh
- name: Install httpd service
yum:
name: httpd
state: installed
- name: Start httpd service
service:
name: httpd
state: started
- プレイブック例②
hosts: web_servers
vars:
dns_server: 8.8.8.8
tasks:
- name: Add DNS server to resolv.conf
lineinfile:
path: /etc/resolv.conf
line: 'nameserver {{ dns_server }}'
3. 特殊指令
-
- whenディレクティブ:タスクに条件を指定して実行する(条件分岐)。tasksセクションのディレクティブとして指定する。複数条件を論理積で指定したい場合はand、論理和で指定したい場合はorを用いて、条件同士をつなげる。
- プレイブック例
hosts: db_servers
tasks:
- name: Install Mysql on Debian
apt:
name: mysql
state: installed
when: ansible_os_family == "Debian"
- name: Install Mysql on RedHat
yum:
name: mysql
state: installed
when: ansible_os_family == "RedHat"
-
- loopディレクティブ:タスクを繰り返し実行する(反復処理)。tasksセクションのディレクティブとして指定し、その中に{{ item }}という変数名を用いて繰り返し実行したい値を定義する。(なお、Ansibleバージョン2.4以前はLookupプラグインwith_…の使用が推奨されていたが、バージョン2.5以降はloopディレクティブの使用が推奨されている。)
- プレイブック例
hosts: db_servers
tasks:
- name: Create users
user:
name: "{{ item }}"
state: presemt
loop:
- jeorge
- mary
- tom
4. 卷
-
- ロール:プレイブックを分割するためのコンポーネント。ロールを利用する場合は、Ansibleが認識できる特定のディレクトリを作成し、ディレクトリ配下にmain.ymlを配置する必要がある。また、以下のディレクトリは必ず配置する必要がある。
tasksディレクトリ:Tasksセクションの内容を定義したmain.ymlを配置するディレクトリ。
配置
1. “配置文件”是什么?
- コンフィグ:Ansibleの設定ファイル。Ansibleの処理におけるパラメーターを設定する。
2. 主要参数 (zhǔ shù)
パラメーター名設定内容log_pathAnsible実行コマンドログの配置場所を設定する。gatheringターゲットノードの詳細情報取得に関する設定を行う。
implicit
の場合、常に情報収集を行う。explicit
の場合、情報収集を行わない。smart
の場合、新規の接続の際に情報収集を行い、既存の接続の際には情報収集を行わない。デフォルトはimplicit
。forksターゲットノードの並列処理を行うプロセス数を設定する。デフォルトは5
。- コンフィグファイル例
[defaults]
log_path = /var/log/ansible.log
gatherig = implicit
forks = 5
3. 优先级
- コンフィグファイルは以下の順番で検索される。
優先順位ファイルパス①環境変数
ANSIBLE_CONFIG
で指定されたファイル②./ansible.cfg
(カレントディレクトリに存在するファイル)③~/.ansible.cfg
(ホームディレクトリに存在するファイル)④/etc/ansible/ansible.cfg
我的感受
这次只总结了Ansible的基本用法,因为可用的指令和模块非常多,总结起来很困难。
实际上,在使用Ansible时,大部分情况下会将playbook分解为角色来使用,所以希望通过使用Ansible进行验证,并加深对角色的理解,以掌握它们的使用。
参考资料
-
- 公式サイト:Ansible Documentation
Kode Kloud:Ansible Certification Preparation Course
書籍:Ansible実践ガイド