事实、循环、条件判断

事实

描述Ansible事实

Ansible事实是Ansible在受管主机上自动检测到的变量。
受管主机收集的一些事实可能包括:

  • 主机名
  • 内核版本
  • 网络接口
  • IP地址
  • 操作系统版本
  • 各种环境变量
  • CPU数量
  • 提供的或可用的内存
  • 可用磁盘空间
    借助事实,可以方便地检索受管主机的状态,并根据该状态确定要执行的操作。
  • 可以根据含有受管主机当前内核版本的事实运行条件任务,以此来重启服务器
  • 可以根据通过事实报告的可用内存来自定义MySQL配置文件
  • 可以根据事实的值设置配置文件中使用的IPv4地址
[root@apache opt]# ansible all -m setup
192.168.111.142 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.111.142"
        ], 

ansible事实实例:

事实 变量
短主机名 ansible_facts[‘hostname’]
完全限定域名 ansible_facts[‘fqdn’]
IPv4地址 ansible_facts[‘default_ipv4’][‘address’]
所有网络接口的名称列表 ansible_facts[‘interfaces’]
/dev/vda1磁盘分区的大小 ansible_facts[‘devices’][‘vda’][‘partitions’][‘vda1’][‘size’]
DNS服务器列表 ansible_facts[‘dns’][‘nameservers’]
当前运行的内核版本 ansible_facts[‘kernel’]

Ansible事实作为变量注入

许多较旧的playbook仍然使用作为变量注入的事实,而不是在ansible_facts变量下创建命名空间的新语法。
选定的Ansible事实名称比较

ansible_facts形式 旧事实变量形式
ansible_facts[‘hostname’] ansible_hostname
ansible_facts[‘fqdn’] ansible_fqdn
ansible_facts[‘default_ipv4’][‘address’] ansible_default_ipv4[‘address’]
ansible_facts[‘interfaces’] ansible_interfaces
ansible_facts[‘devices’][‘vda’][‘partitions’][‘vda1’][‘size’] ansible_devices[‘vda’][‘partitions’][‘vda1’][‘size’]
ansible_facts[‘dns’][‘nameservers’] ansible_dns[‘nameservers’]
ansible_facts[‘kernel’] ansible_kernel

关闭事实收集

可将gather_facts关键字设置为no

---
- name: This play gathers no facts automatically
  hosts: apache
  gather_facts: no

创建自定义事实

除了使用系统捕获的事实外,我们还可以自定义事实,并将其本地存储在每个受管主机上。
自定义事实可以在静态文件中定义,格式可为INI文件或采用JSON。也可以是生成JSON输出的可执行脚本,如同动态清单脚本一样。

循环

利用循环迭代任务

通过利用循环,我们无需编写多个使用同一模块的任务

简单循环

- name: Postfix and Devecot are running
  service:
    name: "{
    { item }}"
    state: started
  loop:
    - postfix
    - dovecot

可以通过一个变量提供loop所使用的列表。在以下示例中,变量mail_services含有需要处于运行状态的服务的列表。

vars:
  mail_services:
    - postfix
    - dovecot

tasks:
  - name: Postfix and Dovecot are running
    service:
      name: "{
    { item }}"
      state: started
    loop: "{
    { mail_services }}"

循环散列或字典列表

- name: Users exist and are in the correct groups
  user:
    name: "{
    { item.name }}"
    state: present
    groups: "{
    { item.groups }}"
  loop:
    - name: jane
      groups: wheel
    - name: joe
      groups: root

较早样式的循环关键字

  • with_items
vars:
  data:
    - user0
    - user1
    - user2
tasks:
  - name: "with_items"
    debug:
      msg: "{
    { item }}"
    with_items: "{
    { data }}"
  • with_file
  • with_sequence

条件判断

有条件地运行任务

Ansible可使用conditionals在符合特定条件时执行任务或play。例如,可以利用一个条件在Ansible安装或配置服务前确定受管主机上的可用内存。
Playbook变量、注册的变量和Ansible事实都可通过条件来进行测试。可以使用比较字符串、数字数据和布尔值的运算符。
以下场景说明了在Ansible中使用条件的情况:

  • 可以在变量中定义硬限制(如min_memory)并将它与受管主机上的可用内存进行比较。
  • Ansible可以捕获并评估命令的输出,以确定某一任务在执行进一步操作前是否已经完成。
  • 可以利用Ansible事实来确定受管主机网络配置,并决定要发送的模板文件
  • 可以评估CPU的数量,来确定如何正确调节某一Web服务器。
  • 将注册的变量与预定义的变量进行比较,以确定服务是否已更改。例如,测试服务配置文件的MD5检验以和查看服务是否已更改。

条件任务语法

可以测试的一个最简单条件是某一布尔变量是True还是False。

---
- name: Simple Boolean Task Demo
  hosts: 172.16.103.129
  vars:
    run_my_task: True
    
  tasks:
    - name: httpd package is installed
      yum:
        name: httpd
      when: run_my_task

示例条件

操作 示例
等于(值为字符串) ansible_machine == “x86_64”
等于(值为数字) max_memory == 512
小于 min_memory < 128
大于 min_memory > 256
小于等于 min_memory <= 256
大于等于 min_memory >= 512
不等于 min_memory != 512
变量存在 min_memory is defined
变量不存在 min_memory is not defined
布尔变量是True。1、True或yes的求值为True memory_available
布尔变量是False。0、False或no的求值为False not memory_available
第一个变量的值存在,作为第二个变量的列表中的值 ansible_distribution in supported_distros

你可能感兴趣的:(事实、循环、条件判断)