第十章 Ansible-playbook變數基礎
阿新 • • 發佈:2021-12-23
一、ansible變數概述
ansible變數提供了便捷的方式來管理Ansible playbook的每一個專案中的動態值,比如nginx-1.6.3這個軟體包的版本,在其它地方或許會反覆使用,那麼如果講此值設定為變數,然後再在其他的playbook中呼叫,會方便許多。如此一來還方便維護,減少維護的成本。
二、ansible定義變數的方式
1.通過命令列進行變數定義
2.在playbook檔案中進行變數定義
3.通過Inventory主機資訊檔案中進行變數定義
4.通過vars_files的方式定義變數
5.通過host_vars和group_vars定義變數
三、playbook檔案中進行變數定義
1.在模組下面定義變數
- hosts: web_group tasks: - name: ensure a list of packages installed yum: name: "{{ packages }}" vars: packages: - httpd - httpd-tools - name: remove server yum: name: "{{ packages }}" state: absent vars: packages: - httpd - httpd-tools #問題:模組下定義變數,變數只在當前動作生效,到其他動作後變數需要重新定義
2.在hosts下面定義變數
- hosts: web_group
vars:
packages:
- httpd
- httpd-tools
tasks:
- name: ensure a list of packages installed
yum:
name: "{{ packages }}"
- name:
yum:
name: "{{ packages }}"
state: absent
3.在hosts下面定義多個變數
- hosts: web_group vars: packages: - httpd - httpd-tools db: - mariadb-server - MySQL-python tasks: - name: install web server yum: name: "{{ packages }}" - name: install mariadb-server yum: name: "{{ db }}" #問題:變數解除安裝hosts下面,可以解決多個動作分別設定變數的問題,但是設定的變數只能在當前的playbook中使用,其他的playbook無法使用
四、vars_file方式定義變數
1.定義變數檔案
[root@m01 ~]# vim vars.yml
web:
- httpd
- httpd-tools
db: mariadb-server
2.palybook呼叫變數檔案
[root@m01 ~]# vim moudle_vars.yml
- hosts: web_group
vars_files: /root/vars.yml
tasks:
- name: install web server
yum:
name: "{{ web }}"
state: absent
- name: install mariadb-server
yum:
name: "{{ db }}"
state: absent
3.新增變數檔案
[root@m01 ~]# vim vars1.yml
nfs:
- nfs-utils
- rpcbind
4.呼叫多個變數檔案
[root@m01 ~]# vim moudle_vars.yml
- hosts: web_group
vars_files:
- /root/vars.yml
- /root/vars1.yml
tasks:
- name: install web server
yum:
name: "{{ web }}"
- name: install mariadb-server
yum:
name: "{{ db }}"
- name: install nfs server
yum:
name: "{{ nfs }}"
五、Inventory中定義變數
1.主機清單中定義變數
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_pass='1'
web02 ansible_ssh_pass='1'
web03 ansible_ssh_pass='1'
......
[web_group:vars]
web=httpd
db=mariadb-server
2.呼叫變數
- hosts: web_group
tasks:
- name: install web server
yum:
name: "{{ web }}"
state: absent
- name: install db server
yum:
name: "{{ db }}"
#問題:
1.主機清單定義變數,只能給某個組使用,如果所有主機都使用需要定義很多變數
2.主機清單內容很多的時候,配置變數會使檔案變得太大
3.複合組定義變數
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_pass='1'
web02 ansible_ssh_pass='1'
web03 ansible_ssh_pass='1'
... ...
[nginx_group:children]
web_group
slb
[web_group:vars]
web=httpd
db=mariadb-server
[nginx_group:vars]
web=nginx
rsync=rsync
4.呼叫變數
[root@m01 ~]# vim mkdir.yml
- hosts: nginx_group
tasks:
- name: Mkdir dir
file:
path: /tmp/{{web}}
state: directory
- name: Mkdir dir
file:
path: /tmp/{{rsync}}
state: directory
#執行結果
[root@m01 ~]# ansible-playbook mkdir.yml
[root@web01 ~]# ll /tmp/
total 0
drwxr-xr-x 2 root root 6 Sep 23 17:52 httpd
drwxr-xr-x 2 root root 6 Sep 23 17:52 rsync
[root@lb01 ~]# ll /tmp/
total 0
drwxr-xr-x 2 root root 6 Sep 23 17:52 nginx
drwxr-xr-x 2 root root 6 Sep 23 17:52 rsync
#結論:主機清單定義變數時,複合組定義的變數優先順序低於主機組定義的
六、使用內建變數
1.直接使用內建變數
[root@m01 ~]# vim mkdir.yml
- hosts: nginx_group
tasks:
- name: Mkdir dir
file:
path: /backup/{{ansible_fqdn}}_{{ansible_eth1.ipv4.address}}_{{ansible_date_time.date}}
state: directory
2.內建變數設定變數
[root@m01 ~]# vim mkdir.yml
- hosts: nginx_group
vars:
- remote_ip: "{{ansible_eth1.ipv4.address}}"
- host: "{{ansible_fqdn}}"
- date: "{{ansible_date_time.date}}"
tasks:
- name: Mkdir dir
file:
path: /backup/{{remote_ip}}_{{host}}_{{date}}
state: directory
3.內建變數常用方式
#編寫配置檔案
[root@m01 ~]# vim /root/conf/redis.conf
bind {{ansible_eth1.ipv4.address}}
#編寫playbook
[root@m01 ~]# vim redis.yml
- hosts: web_group
tasks:
- name: Install Redis Server
yum:
name: redis
- name: Config Redis Server
template:
src: /root/conf/redis.conf
dest: /etc/
#執行
[root@m01 ~]# ansible-playbook redis.yml
#檢視結果
[root@web01 ~]# grep "^bind" /etc/redis.conf
bind "172.16.1.7"
[root@web02 ~]# grep "^bind" /etc/redis.conf
bind "172.16.1.8"
[root@web03 ~]# grep "^bind" /etc/redis.conf
bind "172.16.1.9"
七、host_vars和group_vars定義變數
之前的幾種變數定義都不是很好用,比較好用的是在Ansible專案目錄下建立兩個變數目錄:
host_vars
group_vars
切記,目錄名字一定要一致,不能做任何修改。
1.主機組定義變數
1.建立主機組變數目錄(名字一定是group_vars)
[root@m01 ~]# mkdir group_vars
2.主機組目錄下建立變數檔案(檔名字一定是主機清單中主機組的名字)
[root@m01 ~]# vim group_vars/web_group
web: httpd
3.呼叫變數
[root@m01 ~]# vim mkdir.yml
- hosts: web_group
tasks:
- name: Mkdir dir
file:
path: /tmp/{{web}}
state: directory
2.主機定義變數
1.建立主機變數目錄(名字一定是host_vars)
[root@m01 ~]# mkdir host_vars
2.主機目錄下建立變數檔案(檔名字一定是主機清單中主機的名字)
[root@m01 ~]# vim host_vars/web01
web: web01_host_vars
3.呼叫變數
[root@m01 ~]# vim mkdir.yml
- hosts: web_group
tasks:
- name: Mkdir dir
file:
path: /tmp/{{web}}
state: directory
4.執行
[root@m01 ~]# ansible-playbook mkdir.yml
5.檢視結果
[root@web01 ~]# ll /tmp
total 0
drwxr-xr-x 2 root root 6 Sep 23 18:57 web01_host_vars
[root@web02 ~]# ll /tmp
total 0
drwxr-xr-x 2 root root 6 Sep 23 18:57 httpd
[root@web03 ~]# ll /tmp
total 0
drwxr-xr-x 2 root root 6 Sep 23 18:57 httpd
3.測試
#1.配置主機清單
[root@m01 ~]# cat /etc/ansible/hosts
[web_group]
web01 ansible_ssh_pass='1'
web02 ansible_ssh_pass='1'
web03 ansible_ssh_pass='1'
[slb]
lb01 ansible_ssh_pass='1'
[nginx_group:children]
web_group
slb
#2.配置變數
[root@m01 ~]# cat group_vars/nginx_group
web: nginx_group
[root@m01 ~]# cat group_vars/web_group
web: web_group
[root@m01 ~]# cat host_vars/web01
web: web01_host_vars
#3.呼叫變數
[root@m01 ~]# vim mkdir.yml
- hosts: nginx_group
tasks:
- name: Mkdir dir
file:
path: /tmp/{{web}}
state: directory
#4.執行
[root@m01 ~]# ansible-playbook mkdir.yml
#5.檢視結果
[root@lb01 ~]# ll /tmp/
drwxr-xr-x 2 root root 6 Sep 23 19:02 nginx_group
[root@web01 ~]# ll /tmp
total 0
drwxr-xr-x 2 root root 6 Sep 23 19:02 web01_host_vars
[root@web02 ~]# ll /tmp
total 0
drwxr-xr-x 2 root root 6 Sep 23 19:02 web_group
[root@web03 ~]# ll /tmp
total 0
drwxr-xr-x 2 root root 6 Sep 23 19:02 web_group
#6.結論:
主機定義的優先順序高於主機組,主機組定義的變數優先順序高於複合組
八、命令列進行變數定義
通過命令列覆蓋變數,Inventory的變數會被playbook檔案中覆蓋,這兩種方式的變數都會被命令列直接指定變數所覆蓋,使用--extra-vars或者-e設定變數
1.使用命令列定義單個變數
[root@m01 ~]# ansible-playbook mkdir.yml -e "web=commend"
2.使用命令列定義多個變數
[root@m01 ~]# ansible-playbook mkdir.yml -e "web=commend" -e "db=mysql"
#注意:指定的變數會根據命令列執行,沒有指定的變數繼續按照變數的設定執行
九、變數呼叫的優先順序測試
#1.定義vars_file變數
[root@m01 ~]# vim vars.yml
web: vars_file
#2.主機清單定義變數
[root@m01 ~]# vim /etc/ansible/hosts
[nginx_group:vars]
web=host_vars
#3.主機組定義變數
[root@m01 ~]# vim group_vars/nginx_group
web: group_vars
#4.主機定義變數
[root@m01 ~]# vim host_vars/web01
web: host_vars
#5.playbook定義變數
[root@m01 ~]# vim mkdir.yml
- hosts: nginx_group
vars:
web: playbook_vars
vars_files: /root/vars.yml
tasks:
- name: Mkdir dir
file:
path: /tmp/{{web}}
state: directory
#6.命令列執行定義變數
[root@m01 ~]# ansible-playbook mkdir.yml -e "web=command"
#7.依次執行,得到結論
優先順序排序:從上到下以此降低
1.命令列
2.vars_files
3.playbook中配置變數
4.主機定義變數
5.主機組定義變數
6.主機清單定義變數
十、層級定義變數
#編輯變數檔案
[root@m01 ~]# vim vars_file.yml
lamp:
framework:
web_package: httpd
db_package: mariadb-server
php_package: php
lnmp:
framework:
web_package: nginx
db_package: mysql
php_package: php
lnmt:
framework:
web_package: nginx
db_package: mysql
java_package: tomcat
#編輯playbook檔案
[root@m01 ~]# vim test.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install LAMP httpd
yum:
name: "{{ lamp.framework.web_package }}"
- name: Install LAMP mariadb-server
yum:
name: "{{ lamp.framework.db_package }}"
- name: Install LAMP php
yum:
name: "{{ lamp.framework.php_package }}"
#官方推薦寫法
[root@m01 ~]# vim test.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install LAMP httpd
yum:
name: "{{ lamp['framework']['web_package'] }}"
- name: Install LAMP mariadb-server
yum:
name: "{{ lamp['framework']['db_package'] }}"
- name: Install LAMP php
yum:
name: "{{ lamp['framework']['php_package'] }}"
#執行playbook
[root@m01 ~]# ansible-playbook test.yml