ansible 定義變數方式與[多層]變數引用,以及 register 詳解 ...
ansible 定義變數方式與[多層]變數引用,以及 register 詳解
主機規劃
添加用戶賬號
說明:
1、 運維人員使用的登錄賬號;
2、 所有的業務都放在 /app/ 下「yun用戶的家目錄」,避免業務數據亂放;
3、 該用戶也被 ansible 使用,因為幾乎所有的生產環境都是禁止 root 遠程登錄的(因此該 yun 用戶也進行了 sudo 提權)。
1 # 使用一個專門的用戶,避免直接使用root用戶 2 # 添加用戶、指定家目錄並指定用戶密碼 3 # sudo提權 4 # 讓其它普通用戶可以進入該目錄查看信息 5 useradd -u 1050 -d /app yun && echo '123456' | /usr/bin/passwd --stdin yun 6 echo "yun ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers 7 chmod 755 /app/
Ansible 配置清單Inventory
之後文章都是如下主機配置清單
1 [yun@ansi-manager ansible_info]$ pwd 2 /app/ansible_info 3 [yun@ansi-manager ansible_info]$ cat hosts_key 4 # 方式1、主機 + 埠 + 密鑰 5 [manageservers] 6 172.16.1.180:22 7 8 [proxyservers] 9 172.16.1.18[1:2]:22 10 11 # 方式2:別名 + 主機 + 埠 + 密碼 12 [webservers] 13 web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22 14 web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22 15 web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22
ansible 定義變數的三種方式
1、命令行中定義,通過 -e EXTRA_VARS, --extra-vars=EXTRA_VARS 定義
2、在 playbook 的 yml 文件中定義
3、在 inventory 清單中定義
4、變數名可以有下劃線,但不能有中橫線。
優先順序:命令行定義變數 > playbook定義變數 > inventory 定義變數
如下內容也是按照優先順序從低到高寫的,如果是為了測試優先順序那麼你可以直接按照如下步驟測驗。
測驗內容:在不同的位置定義相同的變數,但變數值不同,然後在阿裡雲鏡像源下載不同版本的 zabbix rpm 包。
地址:https://mirrors.aliyun.com/zabbix/zabbix/
在 inventory 清單中定義
有三種定義方式:
1、直接在 inventory 清單文件中定義變數「瞭解即可,不推薦使用」
2、通過 group_vars 定義變數
3、通過 host_vars 定義變數
自身內部的優先順序:host_vars/主機名【或別名】 定義變數 > group_vars/清單組名 定義變數 > group_vars/all 定義變數> inventory 文件中直接定義變數
在 inventory 清單文件中定義變數「瞭解」
1 [yun@ansi-manager object02]$ pwd 2 /app/ansible_info/object02 3 [yun@ansi-manager object02]$ cat ../hosts_key 4 # 方式1、主機 + 埠 + 密鑰 5 [manageservers] 6 172.16.1.180:22 7 8 [proxyservers] 9 172.16.1.18[1:2]:22 10 [proxyservers:vars] 11 zabbix_version=2.2 12 zabbix_rpm=zabbix-release-2.2-1.el7.noarch.rpm 13 ### ************ 定義變數如上 14 15 # 方式2:別名 + 主機 + 埠 + 密碼 16 [webservers] 17 web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22 18 web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22 19 web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22 20 21 [yun@ansi-manager object02]$ cat test_vars.yml 22 --- 23 # 下載 zabbix rpm包 24 - hosts: proxyservers 25 26 tasks: 27 - name: "download zabbix rpm" 28 get_url: 29 url: https://mirrors.aliyun.com/zabbix/zabbix/{{ zabbix_version }}/rhel/7/x86_64/{{ zabbix_rpm }} 30 dest: /tmp/ 31 32 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key --syntax-check test_vars.yml # 語法檢測 33 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key -C test_vars.yml # 預執行,測試執行 34 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key test_vars.yml # 執行
然後就可以在目標機器 172.16.1.181、172.16.1.182 查看下載的 zabbix-release-2.2-1.el7.noarch.rpm 包了。
通過 group_vars 定義變數
註意事項:
1、要創建的 group_vars 目錄要與 inventory 清單文件在同一個目錄,或者與要執行的 playbook 的 yml 文件在同一個目錄。
2、group_vars 目錄下的文件名是 inventory 清單文件中的組名。或者文件名為 all「特殊組」,表示對所有機器主機生效。
在 group_vars/all 定義變數
1 [yun@ansi-manager object02]$ pwd 2 /app/ansible_info/object02 3 [yun@ansi-manager object02]$ ll /app/ansible_info/ 4 total 4 5 drwxrwxr-x 2 yun yun 17 Oct 15 14:55 group_vars 6 -rw-rw-r-- 1 yun yun 348 Oct 11 20:36 hosts_key 7 drwxrwxr-x 2 yun yun 27 Oct 11 20:56 object02 8 [yun@ansi-manager object02]$ cat /app/ansible_info/group_vars/all # all「特殊組」變數文件 9 zabbix_version: 2.4 10 zabbix_rpm: zabbix-release-2.4-1.el7.noarch.rpm 11 12 [yun@ansi-manager object02]$ cat test_vars.yml 13 --- 14 # 下載 zabbix rpm包 15 - hosts: proxyservers 16 17 tasks: 18 - name: "download zabbix rpm" 19 get_url: 20 url: https://mirrors.aliyun.com/zabbix/zabbix/{{ zabbix_version }}/rhel/7/x86_64/{{ zabbix_rpm }} 21 dest: /tmp/ 22 23 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key --syntax-check test_vars.yml # 語法檢測 24 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key -C test_vars.yml # 預執行,測試執行 25 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key test_vars.yml # 執行
然後就可以在目標機器 172.16.1.181、172.16.1.182 查看下載的 zabbix-release-2.4-1.el7.noarch.rpm 包了。
在 group_vars/組 定義變數
1 [yun@ansi-manager object02]$ pwd 2 /app/ansible_info/object02 3 [yun@ansi-manager object02]$ ll /app/ansible_info/ 4 total 4 5 drwxrwxr-x 2 yun yun 17 Oct 15 14:55 group_vars 6 -rw-rw-r-- 1 yun yun 348 Oct 11 20:36 hosts_key 7 drwxrwxr-x 2 yun yun 27 Oct 11 20:56 object02 8 [yun@ansi-manager object02]$ cat /app/ansible_info/group_vars/proxyservers # inventory 清單文件中的組名 變數文件 9 zabbix_version: 3.0 10 zabbix_rpm: zabbix-release-3.0-1.el7.noarch.rpm 11 12 [yun@ansi-manager object02]$ cat test_vars.yml 13 --- 14 # 下載 zabbix rpm包 15 - hosts: proxyservers 16 17 tasks: 18 - name: "download zabbix rpm" 19 get_url: 20 url: https://mirrors.aliyun.com/zabbix/zabbix/{{ zabbix_version }}/rhel/7/x86_64/{{ zabbix_rpm }} 21 dest: /tmp/ 22 23 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key --syntax-check test_vars.yml # 語法檢測 24 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key -C test_vars.yml # 預執行,測試執行 25 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key test_vars.yml # 執行
然後就可以在目標機器 172.16.1.181、172.16.1.182 查看下載的 zabbix-release-3.0-1.el7.noarch.rpm 包了。
通過 host_vars 定義變數
註意事項:
1、要創建的 host_vars 目錄要與 inventory 清單文件在同一目錄,或者與要執行的 playbook 的 yml 文件在同一個目錄。
2、host_vars 目錄下的文件名是 inventory 清單文件中的主機名或別名。如果有別名那麼文件名為別名
1 [yun@ansi-manager object02]$ pwd 2 /app/ansible_info/object02 3 [yun@ansi-manager object02]$ ll /app/ansible_info/ 4 total 4 5 -rw-rw-r-- 1 yun yun 348 Oct 11 20:36 hosts_key 6 drwxrwxr-x 2 yun yun 26 Oct 15 15:50 host_vars 7 drwxrwxr-x 2 yun yun 27 Oct 11 20:56 object02 8 [yun@ansi-manager object02]$ cat /app/ansible_info/host_vars/172.16.1.181 # inventory 清單文件中的主機名或別名 變數文件 9 zabbix_version: 3.4 10 zabbix_rpm: zabbix-release-3.4-2.el7.noarch.rpm 11 12 [yun@ansi-manager object02]$ cat test_vars.yml 13 --- 14 # 下載 zabbix rpm包 15 - hosts: proxyservers 16 17 tasks: 18 - name: "download zabbix rpm" 19 get_url: 20 url: https://mirrors.aliyun.com/zabbix/zabbix/{{ zabbix_version }}/rhel/7/x86_64/{{ zabbix_rpm }} 21 dest: /tmp/ 22 23 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key --syntax-check test_vars.yml # 語法檢測 24 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key -C test_vars.yml # 預執行,測試執行 25 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key test_vars.yml # 執行
然後就可以在目標機器 172.16.1.181 查看下載的 zabbix-release-3.4-2.el7.noarch.rpm 包了。
使用 playbook 定義變數
使用 playbook 定義變數有兩種方式:
1、直接在要執行的 playbook 文件中定義變數。缺點是:這些變數無法與其他 playbook 共用。
2、將 playbook 中的變數抽出來,單獨一個或多個文件 yml 文件。其他 playbook 文件要使用變數時,可以調用這些變數文件。好處是:可對變數集中管理,降低後期維護成本。「推薦使用」
自身內部優先順序:playbook 引用文件變數 > 直接定義在要執行的 yml 文件中
直接在 playbook 中定義變數
變數寫在要使用變數的 playbook 文件中。
1 [yun@ansi-manager object02]$ pwd 2 /app/ansible_info/object02 3 [yun@ansi-manager object02]$ ll 4 total 4 5 -rw-rw-r-- 1 yun yun 323 Oct 15 16:06 test_vars.yml 6 [yun@ansi-manager object02]$ cat test_vars.yml 7 --- 8 # 下載 zabbix rpm包 9 - hosts: proxyservers 10 # 變數定義 11 vars: 12 - zabbix_version: 3.5 13 - zabbix_rpm: zabbix-release-3.5-1.el7.noarch.rpm 14 15 tasks: 16 - name: "download zabbix rpm" 17 get_url: 18 url: https://mirrors.aliyun.com/zabbix/zabbix/{{ zabbix_version }}/rhel/7/x86_64/{{ zabbix_rpm }} 19 dest: /tmp/ 20 21 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key --syntax-check test_vars.yml # 語法檢測 22 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key -C test_vars.yml # 預執行,測試執行 23 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key test_vars.yml # 執行
然後就可以在目標機器 172.16.1.181、172.16.1.182 查看下載的 zabbix-release-3.5-1.el7.noarch.rpm 包了。
playbook 引用變數文件
將 playbook 變數抽出來,使用單獨的文件進行管理
1 [yun@ansi-manager object02]$ pwd 2 /app/ansible_info/object02 3 [yun@ansi-manager object02]$ ll /app/ansible_info/ 4 total 8 5 -rw-rw-r-- 1 yun yun 456 Oct 15 15:56 hosts_key 6 drwxrwxr-x 2 yun yun 27 Oct 15 16:08 object02 7 -rw-rw-r-- 1 yun yun 69 Oct 15 16:11 playbood_vars.yml 8 [yun@ansi-manager object02]$ cat /app/ansible_info/playbood_vars.yml # 單獨文件定義的變數 9 zabbix_version: 4.0 10 zabbix_rpm: zabbix-release-4.0-1.el7.noarch.rpm 11 12 [yun@ansi-manager object02]$ cat test_vars.yml 13 --- 14 # 下載 zabbix rpm包 15 - hosts: proxyservers 16 # 變數引用 17 vars_files: ../playbood_vars.yml 18 19 # 變數定義 20 vars: 21 - zabbix_version: 3.5 22 - zabbix_rpm: zabbix-release-3.5-1.el7.noarch.rpm 23 24 tasks: 25 - name: "download zabbix rpm" 26 get_url: 27 url: https://mirrors.aliyun.com/zabbix/zabbix/{{ zabbix_version }}/rhel/7/x86_64/{{ zabbix_rpm }} 28 dest: /tmp/ 29 30 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key --syntax-check test_vars.yml # 語法檢測 31 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key -C test_vars.yml # 預執行,測試執行 32 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key test_vars.yml # 執行
然後就可以在目標機器 172.16.1.181、172.16.1.182 查看下載的 zabbix-release-4.0-1.el7.noarch.rpm 包了。
使用命令行定義變數
優先順序別最高,但只是臨時使用。
1 [yun@ansi-manager object02]$ pwd 2 /app/ansible_info/object02 3 [yun@ansi-manager object02]$ ll 4 total 4 5 -rw-rw-r-- 1 yun yun 393 Oct 15 16:14 test_vars.yml 6 [yun@ansi-manager object02]$ cat test_vars.yml 7 --- 8 # 下載 zabbix rpm包 9 - hosts: proxyservers 10 # 變數引用 11 vars_files: ../playbood_vars.yml 12 13 # 變數定義 14 vars: 15 - zabbix_version: 3.5 16 - zabbix_rpm: zabbix-release-3.5-1.el7.noarch.rpm 17 18 tasks: 19 - name: "download zabbix rpm" 20 get_url: 21 url: https://mirrors.aliyun.com/zabbix/zabbix/{{ zabbix_version }}/rhel/7/x86_64/{{ zabbix_rpm }} 22 dest: /tmp/ 23 24 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key -e "zabbix_version=4.1 zabbix_rpm=zabbix-release-4.1-1.el7.noarch.rpm" --syntax-check test_vars.yml # 語法檢測 25 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key -e "zabbix_version=4.1 zabbix_rpm=zabbix-release-4.1-1.el7.noarch.rpm" -C test_vars.yml # 預執行,測試執行 26 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key -e "zabbix_version=4.1 zabbix_rpm=zabbix-release-4.1-1.el7.noarch.rpm" test_vars.yml # 執行
然後就可以在目標機器 172.16.1.181、172.16.1.182 查看下載的 zabbix-release-4.1-1.el7.noarch.rpm 包了。
多層級變數寫法與引用
層級變數的寫法與兩種引用方式。
1 [yun@ansi-manager object02]$ pwd 2 /app/ansible_info/object02 3 [yun@ansi-manager object02]$ ll /app/ansible_info/ 4 total 12 5 -rw-rw-r-- 1 yun yun 456 Oct 15 15:56 hosts_key 6 drwxrwxr-x 2 yun yun 27 Oct 15 16:14 object02 7 -rw-rw-r-- 1 yun yun 76 Oct 15 16:26 playbood_vars_mult.yml 8 [yun@ansi-manager object02]$ cat /app/ansible_info/playbood_vars_mult.yml 9 # 多層級變數書寫 10 zabbix_rpm_info: 11 version: 4.2 12 rpm: zabbix-release-4.2-1.el7.noarch.rpm 13 14 [yun@ansi-manager object02]$ cat test_vars_mult.yml # 具體的 playbook 信息 15 --- 16 # 下載 zabbix rpm包 17 - hosts: proxyservers 18 # 變數引用 19 vars_files: ../playbood_vars_mult.yml 20 21 tasks: 22 - name: "download zabbix rpm" 23 get_url: 24 # 下麵寫了兩種方式引用變數,推薦使用後一種引用方式 25 url: https://mirrors.aliyun.com/zabbix/zabbix/{{ zabbix_rpm_info.version }}/rhel/7/x86_64/{{ zabbix_rpm_info['rpm'] }} 26 dest: /tmp/ 27 28 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key --syntax-check test_vars_mult.yml # 語法檢測 29 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key -C test_vars_mult.yml # 預執行,測試執行 30 [yun@ansi-manager object02]$ ansible-playbook -b -i ../hosts_key test_vars_mult.yml # 執行
然後就可以在目標機器 172.16.1.181、172.16.1.182 查看下載的 zabbix-release-4.2-1.el7.noarch.rpm 包了。
register 註冊變數
如何使用 register 註冊變數
1 [yun@ansi-manager ansible_info]$ pwd 2 /app/ansible_info 3 [yun@ansi-manager ansible_info]$ ll 4 total 24 5 -rw-rw-r-- 1 yun yun 483 Aug 18 09:12 hosts_key 6 -rw-rw-r-- 1 yun yun 245 Aug 18 21:55 test_debug_register.yml 7 [yun@ansi-manager ansible_info]$ cat test_debug_register.yml 8 --- 9 # 如何使用 debug 模塊與 register 變數 10 - hosts: proxyservers 11 12 tasks: 13 - name: "get host port info" 14 shell: netstat -lntp 15 register: host_port 16 17 - name: "print host port" 18 debug: 19 #msg: "{{ host_port }}" # 輸出全部信息 20 #msg: "{{ host_port.cmd }}" # 引用方式一 21 msg: "{{ host_port['stdout_lines'] }}" # 引用方式二 22 23 [yun@ansi-manager ansible_info]$ ansible-playbook -b -i ./hosts_key test_debug_register.yml # 執行
第一個 task 中,使用了 register 註冊變數,名為 host_port ;當 shell 模塊執行完畢後,會將數據放到該變數中。
第二給 task 中,使用了 debug 模塊,並從 host_port 中獲取數據。
———END———
如果覺得不錯就關註下唄 (-^O^-) !