ansible 修改文件變量_Ansible Playbook中的變量與引用

Ansible是一個系列文章,我會盡量以通俗易懂、詼諧幽默的總結方式給大家呈現這些枯燥的知識點,讓學習變的有趣一些。

6bb8999b863d132e16df20d036400144.png

Ansible自動化運維

前言

前面有說到使用playbook來搞一些復雜的功能,我們使用YAML來寫playbook,就像我們用其它語言寫代碼一樣,也是可以定義變量的,能定義變量,那這個功能就不得了了,就有必要好好的講講了。變量就好比playbook的翅膀,讓ansible playbook的使用場景大大增多。在Ansible中,變量的玩法有下面這幾種:

  • 通過inventory定義變量
  • 通過文件定義變量
  • 使用遠程主機的系統變量
  • 通過ansible-playbook命令行傳入變量
  • 通過vars定義變量
  • 通過vars_files定義變量
  • 通過register注冊變量
  • 使用vars_prompt傳入變量

玩法還挺多的,下面就對這些玩法進行一一的總結,爭取一次把Ansible中變量的玩法吃透。

通過inventory定義變量

我們可以在inventory文件中定義變量,然后在playbook中使用這些變量。到底怎么玩,下面我通過一段代碼來舉例說明:

192.168.1.3 key=10086 [server1]192.168.1.3[server1:vars]key=10087ansible_ssh_user='test1'

上面是我的inventory文件內容,我針對192.168.1.3這個主機定義了一個變量key,然后又針對server1這個主機組定義了變量key和ansible_ssh_user。然后我來寫一個測試playbook,看下在inventory文件中定義的變量怎么用。

---- hosts: server1  tasks:    - name: Display var from inventory file      debug: msg="The {{ inventory_hostname }} value is {{ key }}"

輸出內容如下:

[jelly@localhost yaml]$ ansible-playbook inventoryVar.yaml PLAY [server1] *************************************TASK [Gathering Facts] *****************************ok: [192.168.1.3]TASK [Display var from inventory file] *************ok: [192.168.1.3] => {    "msg": "The 192.168.1.3 value is 10086"}PLAY RECAP *****************************************192.168.1.3                : ok=2    changed=0    unreachable=0    failed=0  

可以看到,我們通過{{}}來引用變量,同時也看到,主機定義的變量的優先級高于主機組定義的變量。

通過文件定義變量

通過文件定義變量這種玩法就用的更多了,在后面講到role的時候,還會專門用到這個知識點的。說白了就是我們在playbook的同級目錄建立兩個名分別為host_vars和group_vars的文件夾,分別用來定義主機和主機組的變量。下面是我的文件結構:

[jelly@localhost yaml]$ tree.├── fileVar.yaml├── group_vars│?? └── server1├── host_vars│?? └── 192.168.1.3

host_vars文件夾下的文件用被管理主機的IP為文件名,比如此處的192.168.1.3,文件內容按照YAML的語法進行定義,比如此處192.168.1.3的內容如下:

key: 10086

group_vars文件夾下的文件用inventory下定義的組名來命名,比如此處的server1,文件內容也是按照YAML語法進行定義,比如此處server1的內容如下:

foo:  field1: one  field2: two

在來看我的測試playbook,它是這樣的:

---- hosts: server1  tasks:    - name: Display var from file      debug: msg="The {{ inventory_hostname }} value is {{ key }} and {{ foo.field1 }}"

重點是我們可以通過foo.field1這種方式來引用復雜的變量,運行結果如下:

[jelly@localhost yaml]$ ansible-playbook fileVar.yaml PLAY [server1] *************************************TASK [Gathering Facts] *****************************ok: [192.168.1.3]TASK [Display var from file] ***********************ok: [192.168.1.3] => {    "msg": "The 192.168.1.3 value is 10086 and one"}PLAY RECAP *****************************************192.168.1.3                : ok=2    changed=0    unreachable=0    failed=0  

使用遠程主機的系統變量

不知道大家有沒有看過上篇說過的Ansible Facts,我們通過setup模塊獲取的遠程主機的信息可以直接作為變量在playbook中引用。是的,這樣就大大方便了我們的工作。下面牛通過一個簡單的playbook來看看怎么玩。

---- hosts: server1  tasks:     - name: Echo System      debug: msg="{{ ansible_os_family }}"

ansible_os_family是ansible_facts節點下的一個值,我們可以直接在playbook中直接應用。就是這么簡單!

通過ansible-playbook命令行傳入變量

上面的三種方式在我們日常工作中用的比較多,接下來說說怎么通過ansible-playbook命令行傳參的方式定義變量。先來看下我們的測試YAML腳本:

---- hosts: server1  tasks:     - name: ansible-playbook command var      debug: msg="var1 is {{ var1 }}; var2 is {{ var2 }}"

我們在命令行輸入以下命令進行執行:

ansible-playbook commandVar1.yaml -e "var1=1 var2=2"

除了這里說的直接傳入變量,目前ansible-playbook還支持指定文件的方式傳入變量,變量文件的內容支持YAML和JSON兩種格式,來看下怎么玩!!!

我這里準備了兩個文件,分別是YAML和JSON格式的。內容如下:

[jelly@localhost yaml]$ cat var.json {"var1":"10086", "var2":"10087"}[jelly@localhost yaml]$ cat var.yaml ---var1: 10086var2: 10087

接下來,我在命令行指定var.json或者var.yaml文件傳入變量:

ansible-playbook commandVar1.yaml -e "@var.json"

玩起來還是蠻簡單的!

注意:ansible-playbook命令行傳進去的變量都是全局變量

通過vars定義變量

通過vars定義變量,這個就簡單了,在之前的文章中也有說過,這里就通過一個簡單的YAML腳本來演示。

---- hosts: server1  vars:    var1: 10086    var2: 10087  tasks:     - name: Display vars      debug: msg="var1 is {{var1}}, var2 is {{var2}}"

這個就是這么簡單,自己理解去吧!!!

通過vars_files定義變量

這種玩法就有點意思了,怎么說呢。我們可以把所有的變量定義到某個文件內,然后在playbook文件內使用vars_files參數引用這個變量文件。比如這樣子:

---- hosts: server1  vars_files:    - var.yaml  tasks:     - name: Display vars      debug: msg="var1 is {{var1}}, var2 is {{var2}}"

通過register注冊變量

如果我們有需要在兩個task之間傳遞數據的場景,就可以考慮使用這里的register注冊變量了,比如我們在一個playbook中有兩個task,分別是TaskA和TaskB,如果TaskB需要根據TaskA的執行結果做一些判斷,這個時候就需要在兩個task之間傳遞數據,把TaskA的執行結果傳遞給TaskB。怎么搞?看下面的代碼。

---- hosts: server1  tasks:    - name: TaskA      shell: hostname      register: info    - name: TaskB      debug: msg="TaskA's output is {{info}}"

執行上面的YAML腳本,輸出結果如下:

[jelly@localhost yaml]$ ansible-playbook registerVar.yaml PLAY [server1] ******************************************TASK [Gathering Facts] **********************************ok: [192.168.1.3]TASK [TaskA] ********************************************changed: [192.168.1.3]TASK [TaskB] ********************************************ok: [192.168.1.3] => {    "msg": "TaskA's output is {'changed': True, 'end': '2019-10-08 08:34:11.129667', 'stdout': 'localhost.localdomain', 'cmd': 'hostname', 'rc': 0, 'start': '2019-10-08 08:34:11.123739', 'stderr': '', 'delta': '0:00:00.005928', 'stdout_lines': ['localhost.localdomain'], 'stderr_lines': [], 'failed': False}"}PLAY RECAP **********************************************192.168.1.3                : ok=3    changed=1    unreachable=0    failed=0  

從上面的YAML腳本,我們可以看到TaskA中執行的hostname命令,它的輸出結果注冊到了info中,這樣一來,在TaskB中就可以引用info了,完成數據在task之間的傳遞。

同時也可以看到,info的結果是一段Python字段數據,里面存儲著很多信息包含執行時間、狀態變化等信息。register的輸出數據結果都是Python字典,我們可以很容易地挑選出我們想要的信息,比如這樣:

---- hosts: server1  tasks:    - name: TaskA      shell: hostname      register: info    - name: TaskB      debug: msg="TaskA's output is {{info.stdout}}"

使用vars_prompt傳入變量

Ansible還支持在運行playbook的時候通過交互式的方式給定義好的參數傳入變量值,只需要在playbook中定義vars_prompt的變量名和交互式提示內容即可!就像下面這樣:

---- hosts: server1  vars_prompt:    - name: "var1"      prompt: "Please input var1"      private: no    - name: "var2"      prompt: "Please input var2"      default: '10086'      private: yes  tasks:     - name: echo var1      debug: msg="var1 is {{var1}}"    - name: echo var2      debug: msg="var2 is {{var2}}"

在運行上面的YAML腳本的時候,會提示進行變量輸入,其中我們定義的var1為非私有變量,var2為私有變量還有一個默認值。當定義為私有變量時,在終端輸入變量時,則不會顯示對應的值,就像我們ssh登陸主機,輸入密碼看不見一樣。

總結

哦,我的天哪!總結完一看,這么長,這么多內容;但是還好,內容雖多,但是蠻簡單的。在上班路上,或者下班路上,看看這么一篇總結,也還是不錯的。希望你看完這篇文章后,能感嘆一下,Ansible的變量玩法還有這么多啊。玩了Ansible這么久,就是感覺這貨一直都在給我帶來驚喜,越來越好玩,越來越耐玩!還等什么,搞個測試環境,也玩一玩!

果凍想,認真玩技術的地方。

2019年10月8日,于內蒙古呼和浩特。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446280.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446280.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446280.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 判斷日期為第幾天

題目1 編寫程序:從鍵盤上輸入2019年的“month”和“day”,要求通過程序 輸出輸入的日期為2019年的第幾天。 代碼1 從12月往下加日期數 package l1_switch_case; import java.util.Scanner; public class SwitchDemo4 {public static void main(Strin…

STL源碼剖析 list概述

目錄 list的節點(node) list迭代器 list 的構造和內存管理 list 的元素操作 list相較于vector連續的線性空間就顯得很復雜,他的存儲空間是不連續的,好處是每次插入和刪除一個元素的時候,只需要配置或者釋放一個元素的空間 插入和刪除十分的…

vsftp不允許切換到其它目錄_IntelliJ IDEA如何對project的目錄進行篩選顯示?

如果你的項目很龐大,同一個功能用到的各種文件散落在多個文件夾,開發時切換不便,可以利用scope功能,只顯示該功能用到的文件,讓project列表十分清爽,提高開發效率。本文使用的IDEA版本為2020.1。1、打開sco…

java 年份對應的中國生肖

題目 編寫一個程序,為一個給定的年份找出其對應的中國生肖。 中國的生肖基于12年一個周期, 每年用一個動物代表: rat、ox、tiger、rabbit、dragon、snake、horse、sheep、monkey、 rooster、dog、pig。 提示:2019年:豬…

密碼學專題 對稱加密算法

一般來說,使用OpenSSL對稱加密算法有兩種方式,一種是使用API函數的方式,一種是使用OpenSSL提供的對稱加密算法指令方式。本書將介紹對稱加密算法的指令方式OpenSSL的對稱加密算法指令主要用來對數據進行加密和解密處理,輸入輸出的…

網絡防火墻單向和雙向_單向晶閘管與雙向晶閘管之間的不同之處

晶閘管是回一個可以控導點開關,能以弱電去控制強電的各種電路。晶閘管常用于整流,調壓,交直流變化,開關,調光等控制電路中。具有提交小,重量輕,耐壓高,容量大,效率高&…

java 遍歷100以內的偶數,偶數的和,偶數的個數

題目 遍歷100以內的偶數,偶數的和,偶數的個數 代碼 package l2_for; /*遍歷100以內的偶數,偶數的和,偶數的個數*/ public class ForDemo1 {public static void main(String[] args) {//方法1:int sum1 0,count10;f…

python版本切換_怎么切換python版本

展開全部 (1)分別安2113裝 python-2.7.12.amd64.msi python-3.5.2-amd64.exe (python官網下載的) 順序無所謂(為5261了看著4102方便,我把安裝路徑修改統一了1653) (2)配置…

java 打印

題目 編寫程序從1循環到150,并在每行打印一個值,另外在每個3的倍數行 上打印出“foo”,在每個5的倍數行上打印“biz”,在每個7的倍數行上打印 輸出“baz”。 代碼 package l2_for;/** 編寫程序從1循環到150,并在每行打印一個值&#xff0c…

react.lazy 路由懶加載_Vue面試題: 如何實現路由懶加載?

非懶加載import List from /components/list.vue const router new VueRouter({routes: [{ path: /list, component: List }] })方案一(常用)const List () > import(/components/list.vue) const router new VueRouter({routes: [{ path: /list, component: List }] })方…

STL源碼剖析 deque雙端隊列 概述

vector是單向開口的連續線性空間,deque是一種雙向開口的連續線性空間。deque可以在頭尾兩端分別進行元素的插入和刪除操作vector和deque的差異 1,deque允許常數時間內對于頭端元素進行插入和刪除操作2,deque沒有所謂容量(capacity)的概念&…

java 最大公約數和最小公倍數

題目 題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 比如:12和20的最大公約數是4,最小公倍數是60。 說明:break關鍵字的使用 代碼一 package l2_for; //題目:輸入兩個正整數m和n,求…

python的自帶數據集_Python的Sklearn庫中的數據集

一、Sklearn介紹 scikit-learn是Python語言開發的機器學習庫,一般簡稱為sklearn,目前算是通用機器學習算法庫中實現得比較完善的庫了。其完善之處不僅在于實現的算法多,還包括大量詳盡的文檔和示例。其文檔寫得通俗易懂,完全可以當…

STL源碼剖析 stack 棧 概述->(使用deque雙端隊列 / list鏈表)作為stack的底層容器

Stack是一種先進后出的數據結構,他只有一個出口stack允許 新增元素、移除元素、取得最頂端的元素,但是無法獲得stack的內部數據,因此satck沒有遍歷行為Stack定義的完整列表 (雙端隊列作為Stack的底層容器) 將deque作為Stack的底部結構&#…

java 三位數的水仙花數

代碼 package l2_for;public class ForDemo6 {public static void main(String[] args) {for (int i 100; i <999 ; i) {int i1i/1%10;int i2i/10%10;int i3i/100%10;if (i(int)(Math.pow(i1,3)Math.pow(i2,3)Math.pow(i3,3))){System.out.print(i"\t");}}} }

python怎么實現圖像去噪_基于深度卷積神經網絡和跳躍連接的圖像去噪和超分辨...

Image Restoration Using Very Deep Convolutional Encoder-Decoder Networks with Symmetric Skip Connections作者&#xff1a;Xiao-Jiao Mao、Chunhua Shen等本文提出了一個深度的全卷積編碼-解碼框架來解決去噪和超分辨之類的圖像修復問題。網絡由多層的卷積和反卷積組成&a…

STL源碼剖析 queue隊列概述

queue是一種先進先出的數據結構&#xff0c;他有兩個出口允許新增元素&#xff08;從最底端 加入元素&#xff09;、移除元素&#xff08;從最頂端刪除元素&#xff09;&#xff0c;除了對于頂端和底端元素進行操作之外&#xff0c;沒有辦法可以獲取queue的其他元素即queue沒有…

java輸入正數和負數并計算個數

題目 從鍵盤讀入個數不確定的整數&#xff0c;并判斷讀入的正數和負數的個數&#xff0c;輸入 為0時結束程序。 知識點 最簡單“無限” 循環格式&#xff1a;while(true) , for(;;),無限循環存在的原因是并不 知道循環多少次&#xff0c;需要根據循環體內部某些條件&#xf…

python為什么運行不了_python為什么會環境變量設置不成功

學習python編程&#xff0c;首先要配置好環境變量。本文主要講解python的環境變量配置&#xff0c;在不同版本下如何安裝 Windows 打開Python官方下載網站 x86:表示是32位電腦 x86-64:表示是64位電腦 目前Python版本分為2.x版本和3.x版本。推薦大家使用3.x版本。 設置環境變量&…

STL 源碼剖析 heap堆

heap不屬于STL容器的組件&#xff0c;屬于幕后角色&#xff0c;是priority_queue的助手priority_queue 允許用戶以任何次序將任何元素推入容器內&#xff0c;但是取出的時候需要從優先級最高(也就是數值最高)的元素開始取&#xff0c;這種思想是基于heap的函數實現如果使用list…