3.4管理変数と事実
プレイブックの作成を簡素化するために、変数の代わりにプレイブックでいくつかの変数を使用する
3.4.1管理変数
ansible変数の概要
変数には、
作成されるユーザー、
インストールされるソフトウェアパッケージ、
再起動されるサービス、
削除されるファイル
、インターネットから取得されるドキュメントが含まれます。
名前付き変数
変数名は文字で始める必要があり、文字、数字、アンダースコアのみを含めることができます。
不正な
Webサーバーweb_server
westos.file remote_file
1file file1
変数を定義する
3つのスコープレベル
グローバルスコープ:コマンドラインまたはansible構成から設定された変数
Playスコープ:Playおよび関連構造で設定された変数
ホストスコープ:インベントリ、ファクト、ホストグループおよび個々のホストで設定によって収集または登録されたタスク変数
'同じ名前の変数が複数のレベルで定義されている場合、最も高いレベルの変数が優先され、狭いスコープが広いスコープよりも優先されます'
3.4.2
プレイブックの変数プレイブックの変数を定義する
1.一般的な方法:プレイブックの先頭のvarsブロックで:
2.外部ファイルにプレイブック変数を定義する
cat user.yml
3.4.2プレイブックでの変数の使用
変数名を中かっこで囲みます。
'注:変数が値を開始する最初の要素として使用される場合は、引用符を使用する必要があります。'
3.4.3ホスト変数とグループ変数
2つのカテゴリにホスト変数リストに直接適用
1.ホスト変数:特定のホストに適用される
変数の2セット:のグループでホストグループまたはホストグループ内のすべてのホストに適用される
変数のセットよりも優先ホスト変数が、ハンドブックはで定義されている変数は、両方よりも高くなっています。
ホスト変数とグループ変数を定義します。
方法1(古い、非推奨):
server1.example.comシングルユーザーansible_userホスト変数を
定義します:dbserversホストグループユーザーグループ変数を
定義します:ネストされたグループユーザー変数を定義します:
'このアプローチでは、マニフェストファイルの処理が難しくなり、同じファイル内でホストと変数が混在します情報、文法も時代遅れです '
方法2:ディレクトリを使用してホスト変数とグループ変数を設定する
ホストおよびホストグループ変数を定義するための推奨される方法は、マニフェストファイルまたはディレクトリと同じ作業ディレクトリにgroup_vars
およびhost_varsという 2つのディレクトリを作成することです。これらの2つのディレクトリには、グループ変数とホスト変数を定義するためのファイルが含まれています。
group_vars / serversのYAMLファイルを作成し、変数に値を設定します。user
:学生
は、ホスト変数を格納するために、host_varsディレクトリ内のホストと一致する名前のファイルも作成する必要があります。
したがって、プロジェクトディレクトリには
、ansible.cfg、group_vars、host_vars、inventory、 playbook.yml
#コマンドラインからの変数の上書きリスト変数は、プレイブックに設定された変数で上書きでき、両方ともコマンドラインパラメーターで上書きできます。
#配列を変数
Accessメソッドとして使用します。
users.lilei.first_name
users.hanmeimei.home_dir
変数はPython辞書として定義され、代替構文を使用できます。
users['lilei']['first_name']
users['hanmeimei']['home_dir']
#登録された変数を
使用してコマンド出力をキャプチャする管理者はregisterステートメントを使用してコマンド出力をキャプチャできます
---
- name: install
hosts: web
tasks:
- name: install http
yum:
name: httpd
state: installed
register: install_result
- debug: var=install_result
...
効果:
動作のプロセスはデバッグで確認できるため、プロセスを確認できます。
###変数を管理するための演習
プレイブックを作成し、Apacheをインストールして起動し、アクセスできるようにします。プレイブックはWebサーバーにクエリを実行し、設定および実行されていることを確認します。
変数名:
web_pkg#
インストールするWebサーバーパッケージfirewall_pkg #インストールするファイアウォールパッケージ
web_service #
管理する
Web サービスfirewall_service #管理するファイアウォールサービスpython_pkg #uriモジュール必要なパッケージ
ルール#サービスを開く
- name: config Apache
hosts: web
vars:
web_pkg: httpd
firewall_pkg: firewalld
web_service: httpd
firewall_service: firewalld
python_pkg: python3-PyMySQL
rule: http
tasks:
- name: Install Package
yum:
name:
- "{{ web_pkg }}"
- "{{ firewall_pkg }}"
- "{{ python_pkg }}"
state: latest
- name: the {{ firewall_service }} started and enabled #确保 firewalld 和 apache 开机启动
service:
name: "{{ firewall_service }}"
enabled: true
state: started
- name: the {{ web_service }} started and enabled
service:
name: "{{ web_service }}"
enabled: true
state: started
- name: config index.html #配置默认发布页面
copy:
content: "hello westos!"
dest: /var/www/html/index.html
- name: Firewall permit http #使防火墙允许 http
firewalld:
service: "{{ rule }}"
permanent: true
state: enabled
- name: Verify the Apache #验证 apache 服务
hosts: localhost
become: false #在本机测试,不必更改身份
tasks:
- name: Curl webserver
uri:
url: http://rhe82.com
status_code: 200
#実行:
3.4.4管理の機密性
目的:ansible-vaultを使用して機密変数を暗号化し、vaultで暗号化された変数ファイルのプレイブックを実行します。
Ansible-Vault
Vaultは、ホストを構成するために、パスワードやAPIキーなどの機密データへのアクセスを必要とする場合があります。
暗号化および復号化ツール:ansible-vaultコマンド
「ansible vaultは独自の暗号化機能を実装していませんが、外部のpythonツールセットを使用しています」
##暗号化されたファイルを作成する
方法:ansible-vault createファイル名に
はパスワードが必要であり、
現時点では表示できません。
##暗号化されたファイルを作成し、同時にパスワードを保存します。パスワードはwestosファイルに書き込む必要があります
##暗号化されたファイルを表示します
方法:ansible-vault view filename
##既存の暗号化ファイルを編集する
原則:ファイルを一時ファイルに復号化して編集します。保存するときに、コンテンツをコピーして一時ファイルを削除します
「編集コマンドは常にファイルを書き換えるため、ファイルを変更するときにのみ使用され、可能な限りビューを使用します」
##既存のファイルを暗号化する
方法:ansible-vault encrypt filename #filename 参数可以是多个
–output = filenameを使用して、暗号化されたファイルを新しい名前で保存できます。このパラメーターを使用する場合、入力ファイルは1つだけです。
##既存のファイルを解読する
方法:ansible-vault decrypt filename
##復号化中に名前を変更
–Output = filename
##暗号化されたファイルのパスワードを変更します
方法:ansible-vault rekey filename
「一度に複数のファイルパスワードを更新できます」#Vault
パスワードファイルを使用する場合は、-net-vault-password-file
[root @ workstation wsp]#ansible-vault rekey --new-vault-password-file = wsp
westos .yml
Vaultのパスワード:
リキー成功した
## - Vaultの脚本とansible
#暗号化された脚本を実行し、パスワードが指定されていない
#インタラクティブパスワードを
「対話型のコード提供するための-ask-ボールトパスを使用して、ansible 2.4の前に」
#することが可能シークレットをファイルに保存します(ファイルを保護するためのファイルシステムのアクセス許可に注意してください)
ansible-playbook --vault-password-file=password user.yml
3.4.5管理ファクト######
ファクトには、ホスト名、カーネルバージョン、ネットワークの言い訳、IPアドレスなどが含まれます。
## ansibleファクトの説明
#ホスト情報を表示
var:ansible_facts #システム変数名。定義する必要はありません。
ansible-playbook fact.yml
##ファクトを動的な値に置き換えます
---
- name: fact
hosts : all
tasks:
- name: Print Facts
debug:
var: ansible_facts
- hosts: all
tasks:
- name: Print IP and dn
debug:
msg:
the IPv4 address of {{ ansible_facts.fqdn }} #使用字典的方式查询值
is {{ ansible_facts.all_ipv4_addresses }}
## ansibleファクトを変数注入として
#セットアップモジュールを使用してすべてのファクト情報を表示
#ファクトコレクションをオフにして実行速度を向上
cat user.yml
#操作
時に何gather_factsこの1アップが行われていません。
##カスタムファクトの作成
#INI形式またはJSON形式を使用できます
##INI
[packages]
web_packages=httpd
da_packages=mariadb_server
[users]
user1=westos
user2=redhat
##JSON
{
"packages": {
"web_packages": "httpd",
"db_packages": "mariadb-server"
},
"users": {
"user1": "westos",
"user2": "redhat"
}
}
'カスタム形式ではymal形式を使用できません。ymal形式に最も近いjsonを使用することをお勧めします'
mkdir /etc/ansible/facts.d
vim /etc/ansible/facts.dcustom.fact #必须以.fact 结尾
"packages": {
"web_packages": "httpd",
"db_packages": "mariadb-server"
},
"users": {
"user1": "westos",
"user2": "redhat"
}
}
ansible localhost -m setup 查看我们定义的事实
「カスタムファクトはデフォルトファクトと同じように使用されます」
##マジック変数の使用
一般的に使用される4つの方法があります。
HOSTVARS | #管理対象ホストの変数が含まれます。これを使用して、別の管理対象ホストの変数の値を取得できます |
group_names | #現在管理されているホストが属するすべてのグループを一覧表示します |
グループ | #リスト内のすべてのグループとホストを一覧表示します |
inventory_hostname | #リストに構成されている現在管理されているホストのホスト名が含まれます |
#目的の1つ:デバッグモジュールを使用して、特定のホストのhostvarsの値を報告する
ansible localhost -m debug -a 'var=hostvars["servera.lab.example.com"]'
##事実の管理:演習1
[ルート@ワークステーションのデータファクト]#ansible rhel82.com -m setup #Display information
表示できます。
カスタム変数
vim westos.factを作成する
プレイブックを作成
vim facts.yml
---
- name: Install fact
hosts: web
vars:
remote_dir: /etc/ansible/facts.d
facts_file: westos.fact
tasks:
- name: Create directory
file:
state: directory
recurse: yes
path: "{{ remote_dir }}"
- name: copy file facts
copy:
src: "{{ facts_file }}"
dest: "{{ remote_dir }}"
...
実行:
ディレクトリが作成され、ファイルが渡されました。
メインプレイブックを書く
---
- name: INstall Apache
hosts: web
tasks:
- name: Install package
yum:
name: "{{ ansible_facts['ansible_local']['westos']['westos']['package'] }}"
state: latest
- name: statr apache
service:
name: "{{ ansible_facts['ansible_local']['westos']['westos']['service'] }}"
state: "{{ ansible_facts['ansible_local']['custom']['westos']['state'] }}"
enabled: "{{ ansible_facts['ansible_local']['custom']['westos']['enabled'] }}"
#httpaサービスがserveraで実行されていないことを確認します
ansible servera.lab.example.com -m command -a 'systemctl status httpd'
httpdサービスが82ホストにインストールされていないことがわかります。#
法律チェック
#実行