01. 简介
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
的值去处理 (略去无关输出信息):