我寫了更完善的ansible專欄文章:一步到位玩兒透ansible
ansible系列文章:
ansible中的迴圈都是借助迭代來實現的。基本都是以"with_"開頭。以下是常見的幾種迴圈。
ansibel支援迭代功能。例如,有一大堆要輸出的命令、一大堆要安裝的軟體包、一大堆要copy的檔案等等。
例如,要安裝一堆軟體包。
---
- hosts: localhost
tasks:
- yum: name="}"
state=installed
with_items:
- pkg1
- pkg2
- pkg3
它會乙個乙個迭代到特殊變數"}"處。
再例如,指定一堆檔案列表,然後使用grep搜尋出給定檔案列表中包含"www.example.com"字串的檔案:
---
- hosts: localhost
tasks:
- shell: grep -rl "www\.example\.com"
"}" with_items:
- file1
- file2
- file3
register: match_file
- debug: msg=" } "
注意,將with_items迭代後的結果註冊為變數時,其註冊結果也是列表式的,且其key為"results"。具體的結果比較長,可以使用debug模組的var或msg引數觀察match_file變數的結果。
在上面,是使用for迴圈進行引用的。如果不使用for迴圈,那麼就需要使用陣列格式。例如,引用match_file中的第一和第二個結果。
- debug: var=match_file.results[0].stdout
- debug: var=match_file.results[1].stdout
顯然,不如迴圈引用更好,因為不知道match_file中到底有幾個匹配檔案,也就不能確定match_file中的列表數量。
每個列表項中可能都包含乙個或多個字典,既然with_items迭代的是列表項,那麼肯定也能迭代列表中的各字典。
例如:
tasks:
- command: echo }
with_items: [ 0, 2, 4, 6, 8, 10 ]
register: num
- debug: msg=" } "
再例如:
---
- hosts: localhost
tasks:
- shell: echo
"name=},age=}"
with_items:
- -
- register: who
- debug: msg=" } "
使用"with_dict"可以迭代字典項。迭代時,使用"item.key"表示字典的key,"item.value"表示字典的值。
例如:
---
-hosts:localhost
tasks:
- debug: msg="} & }"
with_dict:
另一種情況,字典是已儲存好的。例如ansible facts中的ansible_eth0.ipv4,其內容如下:
"ipv4":
這種情況下,with_dict處可以直接指定該字典的key。即:
---
-hosts:localhost
tasks:
- debug: msg="} & }"
with_dict: ansible_eth0.ipv4
再例如,直接引用playbook中定義的vars。
---
- hosts: 192.168.100.65
gather_facts: false
vars:
user:
longshuai_key:
name: longshuai
gender: male
xiaofang_key:
name: xiaofang
gender: female
tasks:
- name: print hash loop var
debug: msg="} & } & }"
with_dict: "}"
例如,拷貝一堆用萬用字元匹配出來的檔案到各遠端主機上。
---
- hosts: centos
tasks:
- copy: src="}" dest=/tmp/
with_fileglob:
- /tmp/*.sh
- /tmp/*.py
注意,萬用字元無法匹配"/",因此無法遞迴到子目錄中,也就無法迭代子目錄中的檔案。
with_lines很好用,可以將命令列的輸出結果按行迭代。
例如,find一堆檔案出來,copy走。
---
- hosts: localhost
tasks:
- copy: src="}" dest=/tmp/yaml
with_lines:
- find /tmp -type f -name "*.yml"
巢狀迭代是指多次迭代列表項。例如:
---
-hosts:localhost
tasks:
- debug: msg="} & }"
with_nested:
- [a,b]
- [1,2,3]
結果將得到"a & 1"、"a & 2"、"a & 3"、"b & 1"、"b & 2"和"b & 3"共6個結果。
在ansible中,只有when可以實現條件判斷。
tasks:
- name: config the yum repo for centos 6
yum_repository:
name: epel
description: epel
baseurl:
gpgcheck: no
when: ansible_distribution_major_version == "6"
注意兩點:
此外,還支援各種邏輯組合。
tasks:
# 邏輯或
- command: /sbin/shutdown -h now
when: (ansible_distribution == "centos"
and ansible_distribution_major_version == "6") or
(ansible_distribution == "debian"
and ansible_distribution_major_version == "7")
# 邏輯與
- command: /sbin/shutdown -t now
when:
- ansible_distribution == "centos"
- ansible_distribution_major_version == "6"
# 取反
- command: /sbin/shutdown -t now
when: not ansible_distribution == "centos"
還可以直接直接引用布林值的變數。
---
- hosts: localhost
vars:
epic: false
tasks:
- debug: msg="this certainly is epic!"
when: not epic
此外,可以使用jinja2的defined來測試變數是否已定義,使用undefined可以取反表示未定義。例如:
tasks:
- shell: echo "i've got '}' and am not afraid to use it!"
when: foo is defined
- fail: msg="bailing out. this play requires 'bar'"
when: bar is undefined
Ansible 編寫迴圈和條件任務
1 ansible支援使用loop關鍵字對一組專案迭代任務,可以配置迴圈以利用列表中的各個專案 列表中各個檔案的內容 生成的數字序列或更為複雜的結構來重複任務 1 簡單迴圈 1 簡單迴圈對一組專案迭代任務。loop關鍵字新增到任務中,將應對其迭代任務的專案列表取為值。迴圈變數item儲存每個迭代過程...
C 系列六《迴圈語句》
學習過前面的知識以後,我們已經可以寫出一些簡單的程式,例如 編寫乙個程式在螢幕中列印出1 2的和,太簡單了?沒關係一步一步來嘛,就像電影 讓子彈飛 裡面有一句話,飯要一口一口吃,路要一步一步走,步子邁大了,咔。容易。哈哈!好吧,不瞎扯了,還是看上面那個簡單的程式吧。1.乙個簡單程式的實現 首先看下 ...
ruby 條件和迴圈
1.1 if else 語句if conditional then code elsif conditional then code end值為false和nil為假,其他都為真。請注意關鍵字elsif。通常我們省略保留字then,但若想在一行內寫出完整的 if 式,則使用then。例子如下 x 1...