復雜的循環結構
- 循環基礎
[student@worktest myansible]$ cat users.yml
---
- name: create usershosts: serveratasks:- name: create some usersuser:name: "{{item}}"password: "{{'123456'|password_hash('sha512')}}"state: presentloop:- zhangsan- lisi
- loop是ansible 2.5以后引入的,之前使用
with_xxx
結構
[student@worktest myansible]$ cat users.yml
---
- name: create usershosts: serveratasks:- name: create some usersuser:name: "{{item}}"password: "{{'123456'|password_hash('sha512')}}"state: presentwith_list:- zhangsan- lisi
列表嵌套
- 嵌套的列表,可以使用flatten過濾器處理成扁平結構
[student@worktest myansible]$ cat file_list.yml
---
- name: create fileshosts: serveravars:file_lists:- [a1, a2, a3]- [b1, b2]- [c1, c2, c3, c4]tasks:- name: display flatten listdebug:msg: "{{file_lists|flatten}}"- name: create some filesfile:path: /tmp/{{item}}state: touchloop: "{{file_lists|flatten}}"
復雜的嵌套結構
- 復雜嵌結構,python示例:
[student@worktest myansible]$ python3
>>> users = [
... {
... 'name': 'zzz',
... 'email': 'zzz@stud.cn',
... 'days': ['Sat', 'Sun']
... },
... {
... 'name': 'dmy',
... 'email': 'dmy@stud.cn',
... 'days': ['Mon', 'Tue', 'Wed']
... }
... ]
# 在取數據的時候,列表項是通過下標取出的,字典項通過key取出。
>>> users[0]
{'name': 'zzz', 'email': 'zzz@stud.cn', 'days': ['Sat', 'Sun']}
>>> users[1]
{'name': 'dmy', 'email': 'dmy@stud.cn', 'days': ['Mon', 'Tue', 'Wed']}
>>> users[0]['email']
'zzz@stud.cn'
>>> users[1]['days']
['Mon', 'Tue', 'Wed']
>>> users[1]['days'][1]
'Tue'
- 取出復雜結構中的子列表,使用subelement過濾器
[student@worktest myansible]$ cat lists2.yml
---
- name: nested listshosts: serveravars:users:- name: zzzemail: zzz@stud.cndays:- Sat- Sun- name: dmyemail: dmy@stud.cndays:- Mon- Tue- Wedtasks:- name: display emaildebug:msg: "{{item}}"loop: "{{users|subelements('days')}}"
遍歷字典
- 輸出嵌套的字典結構
[student@worktest myansible]$ cat dicts.yml
---
- name: display dicthosts: serveravars:users:user1:name: zzzemail: zzz@stud.cnuser2:name: dmyemail: dmy@stud.cntasks:- name: display some infodebug:msg: "{{users|dict2items}}" #將上面的結構轉換為key,value的結構- name: loop usersdebug:msg: "{{item.key}}:{{item['value']}}"loop: "{{users|dict2items}}"
使用過濾器處理網絡地址
收集和處理地址信息
- 與網絡有關的facts變量
ansible_facts['dns']['nameservers']
:DNS服務器ansible_facts['domain']
:域名ansible_facts['all_ipv4_addresses']
:所有的IPV4地址ansible_facts['all_ipv6_addresses']
:所有的IPV6地址ansible_facts['fqdn']
:完全合格域名ansible_facts['hostname']
:主機名
[student@worktest myansible]$ ansible all -m setup -a "filter=ansible_all_ipv4"
[student@worktest myansible]$ ansible all -m setup -a "filter=ansible_fqdn"
[student@worktest myansible]$ ansible all -m setup -a "filter=ansible_hostname"
網絡信息過濾器
- ipaddr:
# 如果是一個地址,則返回地址;不是IP地址,則返回False
[student@worktest myansible]$ lab data-netfilters start
[student@worktest myansible]$ cat ipaddr.yml
---
- name: test ip addresshosts: serveravars:myips:- "192.168.1.10"- "300.1.1.1"tasks:- name: test ipdebug:msg: "{{item|ipaddr}}"loop: "{{myips}}"# netmask參數,可以返回前綴表示法地址中的網絡掩碼
[student@worktest myansible]$ cat ipaddr.yml
---
- name: test ip addresshosts: serveratasks:- name: test ipdebug:msg: "{{'10.1.1.10/23'|ipaddr('netmask')}}"
ipaddr可以使用的選項有:
- address:判斷某一地址是否是有效地址
- net:驗證輸出的值是是網絡范圍
- host:確保地址有一個等效的CIDR格式
- prefix:驗證輸入的是CIDR/prefix格式,返回前綴
# 返回網絡地址10.1.0.0/24
[student@worktest myansible]$ cat ipaddr.yml
---
- name: test ip addresshosts: serveratasks:- name: test ipdebug:msg: "{{'10.1.0.0/255.255.255.0'|ipaddr('net')}}"# 判斷地址是不是公有的public。私有的private
[student@worktest myansible]$ cat ipaddr.yml
---
- name: test ip addresshosts: serveratasks:- name: test ipdebug:msg: "{{'100.1.10.0'|ipaddr('public')}}"
使用插件收集網絡信息
DNS記錄
- A:把FQDN解析為IP地址
- PTR:與A記錄相反
- SOA:起始授權。指定域中的權威服務器
- NS:名稱服務器。
- MX:郵件交換器
- CNAME:別名記錄
C:\Users\BJTT>nslookup # 進入時,將顯示當前主機使用的DNS服務器
默認服務器: xd-cache-1.bjtelecom.net
Address: 219.141.136.10
# 查看163.com中誰是權威服務器
> set type=soa
> 163.com
服務器: xd-cache-1.bjtelecom.net
Address: 219.141.136.10非權威應答:
163.comprimary name server = ns4.nease.netresponsible mail addr = admin.nease.netserial = 20201030refresh = 7200 (2 hours)retry = 1800 (30 mins)expire = 1209600 (14 days)default TTL = 60 (1 min)163.com nameserver = ns5.nease.net
163.com nameserver = ns2.166.com
163.com nameserver = ns1.nease.net
163.com nameserver = ns6.nease.net
163.com nameserver = ns8.166.com
163.com nameserver = ns3.nease.net
163.com nameserver = ns4.nease.net# 查看ns4.nease.net的IP地址
> set q=a # 等價于set type=a
> ns4.nease.net
服務器: xd-cache-1.bjtelecom.net
Address: 219.141.136.10非權威應答:
名稱: ns4.nease.net
Address: 103.72.16.81# 查詢163.com中,有哪些郵件服務器
> set q=mx
> 163.com
服務器: xd-cache-1.bjtelecom.net
Address: 219.141.136.10非權威應答:
163.com MX preference = 10, mail exchanger = 163mx01.mxmail.netease.com
163.com MX preference = 10, mail exchanger = 163mx02.mxmail.netease.com
163.com MX preference = 10, mail exchanger = 163mx03.mxmail.netease.com
163.com MX preference = 50, mail exchanger = 163mx00.mxmail.netease.com163.com nameserver = ns3.nease.net
163.com nameserver = ns5.nease.net
163.com nameserver = ns2.166.com
163.com nameserver = ns1.nease.net
163.com nameserver = ns6.nease.net
163.com nameserver = ns8.166.com
163.com nameserver = ns4.nease.net
- 通過dig插件查詢域信息
# 默認查詢A記錄。查詢example.com的IP地址
[student@worktest myansible]$ cat ipaddr.yml
---
- name: test ip addresshosts: serveratasks:- name: dns infodebug:msg: "{{lookup('dig', 'example.com')}}"# 查詢example.com中郵件服務器是誰
[student@worktest myansible]$ cat ipaddr.yml
---
- name: test ip addresshosts: serveratasks:- name: dns infodebug:msg: "{{lookup('dig', 'example.com', 'qtype=MX')}}"