Skip to content

01. 简介

Ansible中文权威指南

Ansible Documentation

1. 对管理主机的要求

目前,只要机器上安装了 Python 2.6 或 Python 2.7 (windows系统不可以做控制主机),都可以运行Ansible。

2. 对托管节点的要求

通常我们使用 ssh 与托管节点通信,默认使用 sftp。如果 sftp 不可用,可在 ansible.cfg 配置文件中配置成 scp 的方式。在托管节点上也需要安装 Python 2.4 或以上的版本。如果版本低于 Python 2.5 ,还需要额外安装一个模块:

  • python-simplejson

Note

如果托管节点上开启了SElinux,你需要安装libselinux-python,这样才可使用 Ansible 中与copy/file/template相关的功能。你可以通过 Ansible 的 yum 模块在需要的托管节点上安装libselinux-python。

Note

你需要安装一个 Python 2.X 解释器,并在 inventory (详见 Inventory文件) 中设置 ansible_python_interpreter 变量指向你的 2.X Python,你可以使用raw模块在托管节点上远程安装Python 2.X。例如:ansible myhost --sudo -m raw -a "yum install -y python2 python-simplejson" 这条命令可以通过远程方式在托管节点上安装 Python 2.X 和 simplejson 模块。

3. 安装

先配置epel源:安装epel源

安装:

yum install ansible

3.1 模块使用说明

模块索引

简易的查询模块的参数和说明:

ansible-doc yum

4. 版本兼容问题

4.1 register

以验证 MAC 地址为例,对register语法赋值问题进行分析:

---
- hosts: localhost
  tasks:
  - name: Define Engine VM MAC address
    block:
    - name: Generate unicast MAC address
      shell: od -An -N6 -tx1 /dev/urandom | sed -e 's/^  *//' -e 's/  */:/g' -e 's/:$//' -e 's/^\(.\)[13579bdf]/\10/'
      changed_when: true
      register: mac_address
    - debug:
        var: mac_address
    - name: Set he_vm_mac_addr
      set_fact:
        he_vm_mac_addr: >-
          {{ mac_address.stdout if he_vm_mac_addr is not defined or he_vm_mac_addr is none else he_vm_mac_addr }}
      register: he_vm_mac_addr_re
    - debug:
        var: he_vm_mac_addr
    - debug:
        var: he_vm_mac_addr_re
    - name: Fail if MAC address structure is incorrect
      fail:
        msg: "Invalid unicast MAC address format. Got {{ he_vm_mac_addr }}"
      when: not he_vm_mac_addr | regex_search( '^[a-fA-F0-9][02468aAcCeE](:[a-fA-F0-9]{2}){5}$' )

若像此例一样将set_fact变量与register变量分开存储,那么不会出现版本兼容问题,都会出现如下输出:

# ansible-playbook validate_mac_address.yml

TASK [debug] ***********************************************************************************************************************************************************
ok: [localhost] => {
    "mac_address": {
        "changed": true,
        "cmd": "od -An -N6 -tx1 /dev/urandom | sed -e 's/^  *//' -e 's/  */:/g' -e 's/:$//' -e 's/^\\(.\\)[13579bdf]/\\10/'",
        "delta": "0:00:00.007956",
        "end": "2020-12-14 13:37:21.980232",
        "failed": false,
        "rc": 0,
        "start": "2020-12-14 13:37:21.972276",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "30:c1:52:e0:77:67",
        "stdout_lines": [
            "30:c1:52:e0:77:67"
        ]
    }
}

TASK [debug] ***********************************************************************************************************************************************************
ok: [localhost] => {
    "he_vm_mac_addr": "30:c1:52:e0:77:67"
}

TASK [debug] ***********************************************************************************************************************************************************
ok: [localhost] => {
    "he_vm_mac_addr_re": {
        "ansible_facts": {
            "he_vm_mac_addr": "30:c1:52:e0:77:67"
        },
        "changed": false,
        "failed": false
    }
}

TASK [Fail if MAC address structure is incorrect] **********************************************************************************************************************
skipping: [localhost]

PLAY RECAP *************************************************************************************************************************************************************
localhost                  : ok=6    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

可见 set_fact 的值 与 注册变量后的值 是不同的。

但若将两者的值先后存储到同一个变量he_vm_mac_addr中(register: he_vm_mac_addr),则会导致不同的结果:

ansible <= 2.9.10 版本会按照 set_fact 的值去处理 (略去无关输出信息):