1) Ansible 変数の導入
PlayBook セクションでは、PlayBook を Linux のシェルと比較しました。
次に、Ansible の特殊な言語として、変数の定義や制御構造の使用などの機能が必要になります
。
このセクションでは、主に変数の定義と使用法について説明します。
2) 変数の命名規則
変数名は文字、アンダースコア、数字で構成され、文字で始める必要があります。
次の変数には正しい形式で名前が付けられています。
good_a
ok_b
以下は間違った変数名です。
_aaa
2_bb
予約キーワードは変数名として使用できません。
add, append, as_integer_ratio, bit_length,
capitalize, center, clear,
conjugate, copy, count, decode, denominator,
difference,
difference_update, discard, encode, endswith,
expandtabs,
extend, find, format, fromhex, fromkeys, get,
has_key,
hex, imag, index, insert, isalnum, intersection,
intersection_update, isalpha, isdecimal, isdigit,
isdisjoint, is_integer, islower,
isnumeric, isspace, issubset, issuperset, istitle,
isupper,
items, iteritems, iterkeys, itervalues, join, keys,
ljust, lower,
lstrip, numerator, partition, pop, popitem, real,
remove,
replace, reverse, rfind, rindex, rjust, rpartition,
rsplit, rstrip,
setdefault, sort, split, splitlines, startswith,
strip, swapcase,
symmetric_difference, symmetric_difference_update,
title,
translate, union, update, upper, values, viewitems,
viewkeys,
viewvalues, zfill
3) 変数型
変数の範囲に応じて、変数は次のように大別されます。
- グローバル変数
- スクリプト変数
- 資産変数
ただし、これは大まかな分割であり、Ansible のすべての変数をカバーするには十分ではありません。
1. グローバル変数
グローバル変数は、 ansible または ansible-playbook を使用するときに、
-e パラメーターを通じて手動で Ansible に渡される変数です。
ansible または ansible-playbook を使用すると、特定の形式の
使用方法を取得できます。
# ansible-playbook -h | grep var
-e EXTRA_VARS, --extra-vars EXTRA_VARS
set additional variables as key=value or YAML/JSON, if
# ansible -h |grep var
path for many features including roles/ group_vars/
-e EXTRA_VARS, --extra-vars EXTRA_VARS
set additional variables as key=value or YAML/JSON, if
例
通常の key=value 形式を渡します
ansible all -i localhost, -m debug -a "msg='my key is {
{ key }}'" -e "key=value"
YAML/JSON の形式を渡します (YAML か JSON かに注意してください。最終形式は辞書である必要があります)
Json 形式 ----
ansible all -i localhost, -m debug -a "msg='name is {
{ name }}, type is {
{ type }}'" -e @a.json
Yml形式 –
ansible all -i localhost, -m debug -a "msg='name is {
{ name }}, type is {
{ type }}'" -e @a.yml
2. スクリプト変数
ここでは、最も一般的に使用される 2 つの定義のみを紹介します。
a. PLAY 属性 vars によって定義されます。
---
- name: test play vars
hosts: all
vars:
user: yu
home: /home/yu
b. PLAY 属性 var_files によって定義
vars 属性を通じて多くの変数が定義されている場合、この Play は特に肥大化しているように感じられます。
この時点で、Play から変数を分離して、別の YAML ファイルを形成できます。
---
- name: test play vars
hosts: all
vars_files:
- vars/users.yml
c. Playbook で変数を使用する場合の注意事項
---
# 这⾥我们将上⾯的Playbook中引⽤变量的部分进⾏修改,去掉了双
引号。
- name: test play vars
hosts: all
vars:
user: lilei
home: /home/lilei
tasks:
- name: create the user {
{ user }}
user:
# 注意这⾥将 "{
{ user }}" 改成了 {
{ user }}
name: {
{ user }}
home: "{
{ home }}”
上記の Playbook を実行すると、次のエラーが発生します。
このエラーの主な理由は、PlayBook が YAML ファイル形式であり、Ansible が YAML ファイルを分析するときに辞書と誤認される可能性があることです。name: {
{ user }} は辞書の始まりです。したがって、Ansible による誤った解析を避けるために、変数の使用には二重引用符が追加されます。
3. 資産変数
資産変数は、ホスト変数とホスト グループ変数に分割され、それぞれ資産内の個々のホスト
とホスト グループに対応します。
3.1 ホスト変数
以下のアセットでは、サーバー 192.168.244.130 に対してのみ有効なホスト変数 lilei が定義されています。
次に、検証を隠蔽し、
最初に定義された変数値を取得します。
ansible 192.168.244.131 -i hostsandhostvars -m debug -a "msg='{
{user}} {
{port}}'"
実行結果が表示されます
が、ユーザー変数が 192.168.244.130 ホストに対して無効であるため、定義された変数値は取得されません。
ansible 192.168.244.130 -i hostsandhostvars -m debug -a "var=user"
3.2 ホストグループ変数
次のアセットでは、グループ変数 home が定義されています。これは、ホスト グループ Web サーバー内のすべてのサーバーに対して有効です。home が web_servers のグループ変数であることを
確認します。これは、このグループ内のすべてのサーバーに有効になります。
ansible webservers -i hostsandgroupvars -m debug -a "var=home"
3.3 ホスト変数とホストグループ変数
次に、ホスト変数とグループ変数が同じアセット内で同じ名前を持つ場合はどうなるかという質問について説明します。
アセット内でホスト変数とグループ変数ユーザーを定義すると、マシン 192.168.244.130 のホスト変数ユーザーの優先順位が高いことがわかります。
ansible webservers -i hosts_2 -m debug -a "var=user"
3.4 変数の継承
資産を引き継ぐことができるので、変数も当然引き継ぐことができます。
資産が継承されると、対応する変数も継承されます。
ansible allservers -i hosts_3 -m debug -a "var=user"
ansible dbservers -i hosts_3 -m debug -a "var=user"
ansible webservers -i hosts_3 -m debug -a "var=user"
3.5 インベントリ組み込み変数の説明
組み込み変数には通常、ansible_ という接頭辞が付けられます。
ansible_ssh_host
#将要连接的远程主机名与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port
#ssh端⼝号.如果不是默认的端⼝号,通过此变量设置.
ansible_ssh_user
#默认的 ssh ⽤户名
ansible_ssh_pass
#ssh 密码(这种⽅式并不安全,官⽅强烈建议使⽤ --askpass 或 SSH 密钥)
ansible_sudo_pass
#sudo 密码(这种⽅式并不安全,官⽅强烈建议使⽤ --asksudo-pass)
ansible_sudo_exe (new in version 1.8)
#sudo 命令路径(适⽤于1.8及以上版本)
ansible_ssh_private_key_file
#ssh 使⽤的私钥⽂件.适⽤于有多个密钥,⽽你不想使⽤ SSH代理的情况.
ansible_python_interpreter
#⽬标主机的 python 路径.适⽤于的情况: 系统中有多个Python, 或者命令路径不是"/usr/bin/python",⽐如 /usr/local/bin/python3
4. ファクト変数
ファクト変数は、上で紹介したグローバル変数、スクリプト変数、アセット変数には含まれません
。
ファクト変数では、変数名を手動で宣言して値を割り当てる必要はありません。
その宣言と割り当ては、Ansible のセットアップ モジュールによって完全に行われます。
管理対象サーバーのオペレーティング システムのバージョン、サーバーの IP アドレス、ホスト名、ディスク使用量、CPU 番号、メモリ サイズなどに関する個人情報を収集します。
PlayBook が実行されるたびに、PlayBook が実行される前にファクトを収集するプロセスが存在することがわかります。この処理は、管理対象サーバのFacts情報を収集する処理である。
4.1 ファクト変数の手動収集
ansible all -i localhost, -c local -m setup
実行結果はたくさんありますが、すべてを横取りすることはできません
4.2 フィルターの事実
先ほど手動で事実を収集した結果、事実情報が非常に膨大であることがわかりました。必要な情報を的を絞った方法で表示できますか?
Facts モジュールのフィルター パラメーターを使用して、必要な情報をフィルターできます。
サーバーのメモリステータス情報のみを取得します
ansible all -i localhost, -m setup -a "filter=*memory*" -c local
サーバーのディスクマウントステータスのみを取得します
ansible all -i localhost, -m setup -a "filter=*mount*" -c local
4.3 Playbook でのファクト変数の使用
デフォルトでは、PlayBook が実行されると、各管理対象サーバーのファクト情報が自動的に取得されます。
---
- name: a play example
hosts: all
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=present
- name: copy nginx.conf to remote server
copy: src=nginx.conf
dest=/etc/nginx/nginx.conf
- name: start nginx server
service:
name: nginx
enabled: true
state: started
このプレイブックに test_1.yml という名前を付けて実行します
ansible-playbook test_1.yml
ファクト変数は他の変数と同様に使用できます
---
- name: print facts variable
hosts: all
tasks:
- name: print facts variable
debug:
msg: "The default IPV4 address is {
{ ansible_default_ipv4.address }}"
プレイブックのファクト変数の取得をオフにします。
プレイブックの実行中にファクト変数がまったく使用されない場合は、この時点でファクト変数をオフにして、プレイブックの実行を高速化できます。
---
- name: a play example
hosts: webservers
# 关闭 facts 变量收集功能
gather_facts: no
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=present
- name: copy nginx.conf to remote server
copy: src=nginx.conf
dest=/etc/nginx/nginx.conf
- name: start nginx server
service:
name: nginx
enabled: true
state: started
test_2.yml という名前を付けて実行します。
ansible-playbook -i hosts test_2.yml
5. 変数を登録する
デバッグを容易にするためにタスクの実行結果を保存するためによく使用されます。
または、このタスクの結果を条件として使用して、他のタスクを実行するかどうかを決定します。
変数の登録は、register キーワードを通じて PlayBook に実装されます。
---
- name: install a package and print the result
hosts: webservers
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=present
register: install_result
- name: print result
debug: var=install_result
上記のコードにtest_3.ymlという名前を付けて実行します。
ansible-playbook test_3.yml
6. 可変優先度
現在、グローバル変数、スクリプト変数、アセット変数、ファクト変数、登録変数が導入されています。
このうち、Facts 変数は手動で宣言または代入する必要がなく、登録済み変数は代入せずにキーワード register を通じて宣言するだけで済みます。
ただし、グローバル変数、スクリプト変数、アセット変数は手動で宣言して割り当てる必要があります。
変数の優先順位に関する議論では、これら 3 種類の変数の分析にも焦点を当てます。
使用時にグローバル変数、スクリプト変数、アセット変数に同じ変数名を同時に宣言した場合、どれが優先されますか? 以下、実験形式で変数の優先度を検証していきます 環境準備:アセット
の
定義、アセット変数 user を定義します
(テスト マシンのパフォーマンスのため、テスト マシンの数は減らしました。読者は自分で増やすことができます)
Playbook を作成し、スクリプト変数 user も定義します
---
- name: test variable priority
hosts: all
remote_user: root
vars:
user: mysql
tasks:
- name: print the user value
debug: msg='the user value is {
{ user }}'
test_4.yml という名前を付けます。
検証テスト –
グローバル変数、スクリプト変数、アセット変数の同時使用
変数 user がグローバル変数、スクリプト変数、アセット変数に同時に定義されている場合、グローバル変数が最も優先されます。
ansible-playbook -i hosts test_4.yml -e "user=www"
スクリプト変数とアセット変数を同時に使用して
グローバル変数をキャンセルすると、スクリプト変数の優先順位がアセット変数の優先順位よりも高いことがわかります。
ansible-playbook -i hosts test_4.yml
アセット変数を使用する場合にのみ、
グローバル変数を使用せず、スクリプト変数をコメントアウトすると、最終的にアセット変数が有効になります。
---
- name: test variable priority
hosts: all
remote_user: root
#vars:
# user: mysql
tasks:
- name: print the user value
debug: msg='the user value is {
{ user }}'
ansible-playbook -i hosts test_4.yml
**変数の優先順位の結論**
変数がグローバル変数、スクリプト変数、アセット変数で同時に定義されている場合、グローバル変数の優先順位が最も高く、2 番目がスクリプト変数、最後がアセット変数になります。