Ansible系列 六 迴圈和條件判斷

2022-02-20 10:54:02 字數 4450 閱讀 3458

我寫了更完善的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...