ansible进阶06

复杂的循环结构

  • 循环基础
[student@worktest myansible]$ cat users.yml
---
- name: create users
  hosts: servera
  tasks:
    - name: create some users
      user:
        name: "{{item}}"
        password: "{{'123456'|password_hash('sha512')}}"
        state: present
      loop:
        - zhangsan
        - lisi
  • loop是ansible 2.5以后引入的,之前使用with_xxx结构
[student@worktest myansible]$ cat users.yml
---
- name: create users
  hosts: servera
  tasks:
    - name: create some users
      user:
        name: "{{item}}"
        password: "{{'123456'|password_hash('sha512')}}"
        state: present
      with_list:
        - zhangsan
        - lisi

列表嵌套

  • 嵌套的列表,可以使用flatten过滤器处理成扁平结构
[student@worktest myansible]$ cat file_list.yml
---
- name: create files
  hosts: servera
  vars:
    file_lists:
      - [a1, a2, a3]
      - [b1, b2]
      - [c1, c2, c3, c4]
  tasks:
    - name: display flatten list
      debug:
        msg: "{{file_lists|flatten}}"

    - name: create some files
      file:
        path: /tmp/{{item}}
        state: touch
      loop: "{{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 lists
  hosts: servera
  vars:
    users:
      - name: zzz
        email: zzz@stud.cn
        days:
          - Sat
          - Sun
      - name: dmy
        email: dmy@stud.cn
        days:
          - Mon
          - Tue
          - Wed
  tasks:
    - name: display email
      debug:
        msg: "{{item}}"
      loop: "{{users|subelements('days')}}"

遍历字典
  • 输出嵌套的字典结构
[student@worktest myansible]$ cat dicts.yml
---
- name: display dict
  hosts: servera
  vars:
    users:
      user1:
        name: zzz
        email: zzz@stud.cn
      user2:
        name: dmy
        email: dmy@stud.cn
  tasks:
    - name: display some info
      debug:
        msg: "{{users|dict2items}}"  #将上面的结构转换为key,value的结构

    - name: loop users
      debug:
        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 address
  hosts: servera
  vars:
    myips:
      - "192.168.1.10"
      - "300.1.1.1"
  tasks:
    - name: test ip
      debug:
        msg: "{{item|ipaddr}}"
      loop: "{{myips}}"
     
# netmask参数,可以返回前缀表示法地址中的网络掩码
[student@worktest myansible]$ cat ipaddr.yml
---
- name: test ip address
  hosts: servera
  tasks:
    - name: test ip
      debug:
        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 address
  hosts: servera
  tasks:
    - name: test ip
      debug:
        msg: "{{'10.1.0.0/255.255.255.0'|ipaddr('net')}}"

# 判断地址是不是公有的public。私有的private
[student@worktest myansible]$ cat ipaddr.yml
---
- name: test ip address
  hosts: servera
  tasks:
    - name: test ip
      debug:
        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.com
        primary name server = ns4.nease.net
        responsible mail addr = admin.nease.net
        serial  = 20201030
        refresh = 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.com

163.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 address
  hosts: servera
  tasks:
    - name: dns info
      debug:
        msg: "{{lookup('dig', 'example.com')}}"

# 查询example.com中邮件服务器是谁
[student@worktest myansible]$ cat ipaddr.yml
---
- name: test ip address
  hosts: servera
  tasks:
    - name: dns info
      debug:
        msg: "{{lookup('dig', 'example.com', 'qtype=MX')}}"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值