Ansible-playbookの変数と参照
19858 ワード
1、Inventoryファイルでホストとホストグループ変数を定義する
AnsibleのデフォルトのInventoryファイルはINI形式です.直接テストを開始し、定義されたhostファイルを参照してください.
次に、playbookファイルを作成して変数の参照が正しいかどうかを検証します.内容は次のとおりです.
次のように、Playbookを実行します(絶対パスを指定せずにPlaybookファイルの下で実行します).
各ホストが自分のホスト変数keyを参照していることがわかります.次に、ホストグループ変数のテストを開始します.まず、各ホストの変数定義を注釈し、nginxグループにkeyとzero_というホストグループ変数を定義します.gg(ここで変数名を変更する場合はplaybookの変更に対応)は、以下のようになります.
Playbookファイルを実行するには:
ホストグループ変数は、グループ内のすべてのホストに対して有効であることがわかります.注意:ホストがホスト変数とホストグループ変数を同時に定義した場合、名前が同じで、ホスト変数が有効になり、ホストグループ変数は有効になりません.名前が異なる場合は、呼び出すことができます.
2、/etc/ansible/のファイルでホストとホストグループ変数を定義する
yumを使用してAnsibleをインストールするデフォルトのプロファイルは/etc/ansible/ディレクトリの下にあり、このディレクトリの下にフォルダhost_を作成できます.varsはホスト変数を定義しgroup_を作成するvarsはホストグループ変数を定義します(この場合yamlファイルは/etc/ansible/のサブディレクトリの下にありません).他のインストール方法を使用する場合は、playbookファイルの現在のディレクトリの下に2つのディレクトリを作成します.次のようになります.
それぞれgroup_vars、host_varsの下にホストグループ変数ファイルとホスト変数ファイルを作成します.内容は以下の通りです.
Playbookファイルを実行します.結果は次のとおりです.
上から検証することができて、ホスト変数とホストグループ変数が同時に存在して名前が同じで、ホスト変数だけが発効して、ホストグループ変数は発効しません;
次にgroup_を検証します.vars/の下のnginxグループのホストグループ変数は、次のとおりです.
ansible-playbookコマンドラインパラメータで変数を定義します.デフォルトではグローバル変数が渡されます.次のようになります.
この方式は同時に複数の変数を入力することを支持して、また指定のファイルの方式が変数を入力することを支持して、変数のファイルの内容は2種類のフォーマットを支持します:YAMLとJSON
YAML:
JSON:
4、playbookファイル内でvarsを使う
直接実行:
以上のように、playbookファイルで定義された変数はすべてのホストに有効であり、ホストグループ変数と理解できる.
5、playbookファイル内でvarsを使うfiles
vars_filesはデフォルトで現在のパスを検索します.ファイルが現在のディレクトリにない場合は、絶対パスを指定する必要があります.
6、register内の変数を使う
Ansible playbook内のtask間では互いにデータを伝達することもできます.例えば、私たちは2つのtasksを持っています.そのうち、2番目のtaskが実行されたかどうかは、1番目のtaskが実行された後の結果を判断する必要があります.このとき、task間でデータを伝達しなければなりません.1番目のtaskが実行された結果を2番目のtaskに伝達する必要があります.
Ansible task間転送データはregister方式を使用
ここで1番目のtaskがhostnameを実行した結果registerをinfoという変数に与え、2番目のtaskがこの結果をdebugテンプレートで印刷し、
次のようになります.
infoの結果はPython辞書データであり,実行時間状態変化出力などの情報が多く格納されている.辞書から、欲しい値を取り出す
registerを変更します.yamlファイルの内容、info['stdout']は標準的なPython言語の辞書で値を取る使い方で、playbookを実行します.以下に示します.
7、vars_の使用prompt転送
Ansibleはplaybookを実行する際、定義したパラメータにインタラクティブにパラメータ値を入力することをサポートし、playbookでvars_を定義するだけです.promptの変数名とインタラクティブなプロンプト内容でいいです.Ansibleは、SHA 512およびMD 5アルゴリズムを用いて暗号化するなど、入力された変数値を暗号化することができる.注意:変数値を暗号化する場合は、ansibleマシンにpasslib pythonライブラリをインストールします.
oneは非プライベート変数、twoはプライベート変数であり、privateの役割はインタラクティブモードで入力した変数値を表示するかどうかです.
ここでは,7でよく用いられる変数を定義する方法と,どのように参照するかをまとめた.皆さん、実践指正を歓迎します.ありがとうございます.
zero_gg:賢明で、大気が謙虚で...
AnsibleのデフォルトのInventoryファイルはINI形式です.直接テストを開始し、定義されたhostファイルを参照してください.
[root@zero01 inventory]# cat host_playbook
192.168.79.129 key=129
192.168.79.130 key=130
192.168.79.131 key=131
192.168.79.132 key=132
[nginx]
192.168.79.1[29:32]
[nginx:vars]
ansible_python_interpreter=/usr/bin/python2.6
次に、playbookファイルを作成して変数の参照が正しいかどうかを検証します.内容は次のとおりです.
[root@zero01 playbook]# cat variable.yaml
---
- hosts: all
gather_facts: False
tasks:
- name: diplay Host Variable from hostfile
debug: msg="The {{ inventory_hostname }} Value is {{ key }}"
次のように、Playbookを実行します(絶対パスを指定せずにPlaybookファイルの下で実行します).
[root@zero01 playbook]# ansible-playbook variable.yaml
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is 129"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is 130"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is 131"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is 132"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
各ホストが自分のホスト変数keyを参照していることがわかります.次に、ホストグループ変数のテストを開始します.まず、各ホストの変数定義を注釈し、nginxグループにkeyとzero_というホストグループ変数を定義します.gg(ここで変数名を変更する場合はplaybookの変更に対応)は、以下のようになります.
[root@zero01 inventory]# cat host_playbook
#192.168.79.129 key=129
#192.168.79.130 key=130
#192.168.79.131 key=131
#192.168.79.132 key=132
[nginx]
192.168.79.1[29:32]
[nginx:vars]
ansible_python_interpreter=/usr/bin/python2.6
key=zero_gg
Playbookファイルを実行するには:
[root@zero01 playbook]# ansible-playbook variable.yaml
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is zero_gg"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is zero_gg"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is zero_gg"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is zero_gg"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
ホストグループ変数は、グループ内のすべてのホストに対して有効であることがわかります.注意:ホストがホスト変数とホストグループ変数を同時に定義した場合、名前が同じで、ホスト変数が有効になり、ホストグループ変数は有効になりません.名前が異なる場合は、呼び出すことができます.
2、/etc/ansible/のファイルでホストとホストグループ変数を定義する
yumを使用してAnsibleをインストールするデフォルトのプロファイルは/etc/ansible/ディレクトリの下にあり、このディレクトリの下にフォルダhost_を作成できます.varsはホスト変数を定義しgroup_を作成するvarsはホストグループ変数を定義します(この場合yamlファイルは/etc/ansible/のサブディレクトリの下にありません).他のインストール方法を使用する場合は、playbookファイルの現在のディレクトリの下に2つのディレクトリを作成します.次のようになります.
[root@zero01 ansible]# tree
.
├── ansible.cfg
├── hosts
├── inventory
│ ├── host
│ └── host_playbook
├── playbook
│ ├── group_vars
│ │ └── nginx
│ ├── host_vars
│ │ ├── 192.168.79.129
│ │ ├── 192.168.79.130
│ │ ├── 192.168.79.131
│ │ └── 192.168.79.132
│ ├── nginx.yaml
│ ├── tasks
│ │ └── main.yaml
│ ├── variable.retry
│ └── variable.yaml
└── roles
[root@zero01 inventory]# cat host
192.168.79.129
192.168.79.130
192.168.79.131
192.168.79.132
[nginx]
192.168.79.1[29:32]
それぞれgroup_vars、host_varsの下にホストグループ変数ファイルとホスト変数ファイルを作成します.内容は以下の通りです.
[root@zero01 ansible]# cat group_vars/nginx
---
key: zero_gg
[root@zero01 ansible]# head host_vars/*
==> host_vars/192.168.79.129 <==
---
key: 192.168.79.129
==> host_vars/192.168.79.130 <==
---
key: 192.168.79.130
==> host_vars/192.168.79.131 <==
---
key: 192.168.79.131
==> host_vars/192.168.79.132 <==
---
key: 192.168.79.132
Playbookファイルを実行します.結果は次のとおりです.
[root@zero01 playbook]# ansible-playbook variable.yaml
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is 192.168.79.129"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is 192.168.79.130"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is 192.168.79.131"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is 192.168.79.132"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
上から検証することができて、ホスト変数とホストグループ変数が同時に存在して名前が同じで、ホスト変数だけが発効して、ホストグループ変数は発効しません;
次にgroup_を検証します.vars/の下のnginxグループのホストグループ変数は、次のとおりです.
[root@zero01 playbook]# rm -rf host_vars/*
[root@zero01 playbook]# ansible-playbook variable.yaml
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is zero_gg"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is zero_gg"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is zero_gg"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is zero_gg"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
3、ansible-playbookコマンドラインで転送ansible-playbookコマンドラインパラメータで変数を定義します.デフォルトではグローバル変数が渡されます.次のようになります.
[root@zero01 playbook]# ansible-playbook variable.yaml -e "key=ZERO"
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is ZERO"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is ZERO"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is ZERO"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is ZERO"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
この方式は同時に複数の変数を入力することを支持して、また指定のファイルの方式が変数を入力することを支持して、変数のファイルの内容は2種類のフォーマットを支持します:YAMLとJSON
YAML:
[root@zero01 tmp]# cat var.yaml
---
key: YAML
[root@zero01 playbook]# ansible-playbook variable.yaml -e "@/tmp/var.yaml"
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is YAML"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is YAML"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is YAML"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is YAML"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
JSON:
[root@zero01 tmp]# cat var.json
{"key": "JSON"}
[root@zero01 playbook]# ansible-playbook variable.yaml -e "@/tmp/var.json"
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is JSON"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is JSON"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is JSON"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is JSON"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
4、playbookファイル内でvarsを使う
[root@zero01 playbook]# vi variable.yaml
---
- hosts: all
gather_facts: False
vars:
key: Ansible
tasks:
- name: diplay Host Variable from hostfile
debug: msg="The {{ inventory_hostname }} Value is {{ key }}"
直接実行:
[root@zero01 playbook]# ansible-playbook variable.yaml
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is Ansible"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is Ansible"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is Ansible"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is Ansible"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
以上のように、playbookファイルで定義された変数はすべてのホストに有効であり、ホストグループ変数と理解できる.
5、playbookファイル内でvarsを使うfiles
[root@zero01 playbook]# cat variable.yaml
---
- hosts: all
gather_facts: False
vars_files:
- /tmp/var.yaml
tasks:
- name: diplay Host Variable from hostfile
debug: msg="The {{ inventory_hostname }} Value is {{ key }}"
vars_filesはデフォルトで現在のパスを検索します.ファイルが現在のディレクトリにない場合は、絶対パスを指定する必要があります.
[root@zero01 playbook]# ansible-playbook variable.yaml
PLAY [all] *******************************************************************************************************************
TASK [diplay Host Variable from hostfile] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The 192.168.79.129 Value is YAML"
}
ok: [192.168.79.130] => {
"msg": "The 192.168.79.130 Value is YAML"
}
ok: [192.168.79.131] => {
"msg": "The 192.168.79.131 Value is YAML"
}
ok: [192.168.79.132] => {
"msg": "The 192.168.79.132 Value is YAML"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.130 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.131 : ok=1 changed=0 unreachable=0 failed=0
192.168.79.132 : ok=1 changed=0 unreachable=0 failed=0
6、register内の変数を使う
Ansible playbook内のtask間では互いにデータを伝達することもできます.例えば、私たちは2つのtasksを持っています.そのうち、2番目のtaskが実行されたかどうかは、1番目のtaskが実行された後の結果を判断する必要があります.このとき、task間でデータを伝達しなければなりません.1番目のtaskが実行された結果を2番目のtaskに伝達する必要があります.
Ansible task間転送データはregister方式を使用
[root@zero01 playbook]# cat register.yaml
---
- hosts: all
gather_facts: False
tasks:
- name: register variable
shell: hostname
register: info
- name: display variable
debug: msg="The variable is {{ info }}"
ここで1番目のtaskがhostnameを実行した結果registerをinfoという変数に与え、2番目のtaskがこの結果をdebugテンプレートで印刷し、
次のようになります.
[root@zero01 playbook]# ansible-playbook register.yaml -l 192.168.79.129
PLAY [all] *******************************************************************************************************************
TASK [register variable] *******************************************************************************************************************
changed: [192.168.79.129]
TASK [display variable] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The variable is {'stderr_lines': [], u'changed': True, u'end': u'2017-12-23 17:46:05.777637', 'failed': False, u'stdout': u'zero02', u'cmd': u'hostname', u'rc': 0, u'start': u'2017-12-23 17:46:05.768962', u'stderr': u'', u'delta': u'0:00:00.008675', 'stdout_lines': [u'zero02']}"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=2 changed=1 unreachable=0 failed=0
infoの結果はPython辞書データであり,実行時間状態変化出力などの情報が多く格納されている.辞書から、欲しい値を取り出す
[root@zero01 playbook]# cat register.yaml
---
- hosts: all
gather_facts: False
tasks:
- name: register variable
shell: hostname
register: info
- name: display variable
debug: msg="The variable is {{ info['stdout'] }}"
registerを変更します.yamlファイルの内容、info['stdout']は標準的なPython言語の辞書で値を取る使い方で、playbookを実行します.以下に示します.
[root@zero01 playbook]# ansible-playbook register.yaml -l 192.168.79.129
PLAY [all] *******************************************************************************************************************
TASK [register variable] *******************************************************************************************************************
changed: [192.168.79.129]
TASK [display variable] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "The variable is zero02"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=2 changed=1 unreachable=0 failed=0
7、vars_の使用prompt転送
Ansibleはplaybookを実行する際、定義したパラメータにインタラクティブにパラメータ値を入力することをサポートし、playbookでvars_を定義するだけです.promptの変数名とインタラクティブなプロンプト内容でいいです.Ansibleは、SHA 512およびMD 5アルゴリズムを用いて暗号化するなど、入力された変数値を暗号化することができる.注意:変数値を暗号化する場合は、ansibleマシンにpasslib pythonライブラリをインストールします.
[root@zero01 playbook]# cat prompt.yaml
---
- hosts: all
gather_facts: False
vars_prompt:
- name: "one"
prompt: "Please input one value"
private: no
- name: "two"
prompt: "Please input two value"
default: 'good'
private: yes
tasks:
- name: display one value
debug: msg="one value is {{ one }}"
- name: display two value
debug: msg="two value is {{ two }}"
oneは非プライベート変数、twoはプライベート変数であり、privateの役割はインタラクティブモードで入力した変数値を表示するかどうかです.
[root@zero01 playbook]# ansible-playbook prompt.yaml -l 192.168.79.129
Please input one value: Ansible
Please input two value [good]:
PLAY [all] *******************************************************************************************************************
TASK [display one value] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "one value is Ansible"
}
TASK [display two value] *******************************************************************************************************************
ok: [192.168.79.129] => {
"msg": "two value is zero"
}
PLAY RECAP *******************************************************************************************************************
192.168.79.129 : ok=2 changed=0 unreachable=0 failed=0
ここでは,7でよく用いられる変数を定義する方法と,どのように参照するかをまとめた.皆さん、実践指正を歓迎します.ありがとうございます.
zero_gg:賢明で、大気が謙虚で...