环境
- 控制节点:Ubuntu 22.04
- Ansible 2.10.8
- 管理节点:CentOS 8
组成
Ansible环境主要由三部分组成:
- 控制节点(Control node):安装Ansible的节点,在此节点上运行Ansible命令
- 管理节点(Managed node):Ansible所控制的节点
- 主机清单(Inventory):我们一般通过Ansible来管理多个远程节点,那么就需要把所有的节点在逻辑上组织起来,比如按照功能划分为若干个组。控制节点通过inventory来管理远程节点
官网( https://docs.ansible.com/ansible/latest/getting_started/index.html
)提供的架构如下图所示:
特点
用途:
- 消除重复,简化流程
- 管理维护系统配置
- 持续部署复杂软件
- 零宕机滚动更新(rolling update)
优点:
- 无代理架构:远程节点无需安装额外的软件,维护的开销很小(主控节点通过SSH访问远程节点)
- 简单性:playbook使用YAML语法
- 伸缩性和灵活性:简易且快速
- 幂等性和可预测性:playbook可多次运行,如果系统已处于目标状态,则再次运行也没有变化
安装
apt install ansible
环境搭建
注:下面都是使用root用户。
首先需要一个inventory文件,默认文件为 /etc/ansible/hosts
,也可以使用 -i
参数来显式指定。
创建文件 /etc/ansible/hosts
,内容如下:
[myvms]
192.168.1.55
运行 ansible all --list-hosts
,如下:
➜ ansible ansible all --list-hosts
hosts (1):
192.168.1.55
接下来,和远程节点建立SSH连接。
把主控节点的private key(一般是 ~/.ssh/id_rsa
文件)复制到远程节点的 ~/.ssh/authorized_keys/
目录下(如果本地没有就用 ssh-keygen -t rsa
生成一下),可以用 ssh-copy-id root@<host>
来复制。
注:ansible可用 -u
参数指定登录用户名。
测试一下 ssh root@192.168.1.55
,确保可以免密登录。
注: root@
可以省略,但本地必须是root用户(因为复制时两端都使用的root用户)。
接下来用 ansible all -m ping
测试连通性:
➜ ~ ansible all -m ping
192.168.1.55 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
命令行(ad-hoc)和playbook
命令行(ad-hoc)
其语法为:
ansible [pattern] -m [module] -a "[module options]"
下面是一个“Hello World”例子:
➜ ~ ansible all -m debug -a "msg='hello world'"
192.168.1.55 | SUCCESS => {
"msg": "hello world"
}
Playbook
- Playbook:由一系列play组成
- Play:由一系列task组成
- Task:由一系列module组成
- Module:Ansible运行的代码单元,每个module有一个Fully Qualified Collection Name (FQCN)
其语法为:
ansible-playbook -i /path/to/my_inventory_file -u my_connection_user -k -f 3 -T 30 -t my_tag -M /path/to/my_modules -b -K my_playbook.yml
其中:
-i
:指定inventory文件-u
:指定SSH连接用户名-k
:询问SSH连接密码-f
:指定N个fork-T
:设置超时时间(秒)-t
:只运行指定tag的task-M
:从指定路径载入本地module-b
:executes with elevated privileges (uses become)-K
:prompts the user for the become password.
例:
创建 playbook1.yml
文件,内容如下:
- name: Hello ansible
hosts: all
tasks:
- name: PingPingPing
ansible.builtin.ping:
- name: Say hello
ansible.builtin.debug:
msg: Hello world
运行:
➜ ansible ansible-playbook playbook1.yml
PLAY [Hello ansible] *******************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]
TASK [PingPingPing] ********************************************************************************
ok: [192.168.1.55]
TASK [Say hello] ***********************************************************************************
ok: [192.168.1.55] => {
"msg": "Hello world"
}
PLAY RECAP *****************************************************************************************
192.168.1.55 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
帮助
方法1:官网
https://docs.ansible.com/ansible/latest/index.html
方法2:命令行
ansible -h
:查看ansible
用法ansible-doc <plugin>
:查看指定plugin用法,例如ansible-doc ping
注:可用ansible-doc -h
查看ansible-doc
用法。