关于
系统管理员经常需要做一些重复的工作,如系统初始化、软件升级、修改配置、部署应用、重启服务、执行命令等。我们可以通过脚本来完成这些工作,例如使 Fabric。但当系统规模较大时,脚本就显得比较乏力,配置管理工具 SaltStack、Ansible 等的优点显现出来。配置管理的特点是通过配置来管理远程服务器,并不是脚本。
Ansible 是配置管理和应用部署工具,默认通过 ssh 协议管理服务器,在管理主机上执行命令就可以在各节上执行相应的动作,而 Saltstack、Puppet、Chef 等需要在每个设备上安装特定的软件。
Ansible 的目的:
- 应用部署
- 管理配置
- 回滚更新 等
Ansible 的特点:
- 无需在部署主机上安装任何代理
- 协调应用程序生命周期
- 任务按顺序执行
- 支持 API 及自定义模块,可松扩展
- 通过 Playbooks 来定制管理
- 基于模块,具有高度的复用性
- 能够和当前主流云计算平台、容器工具完美结合
安装
推荐 pip:
pip install ansible
配置
Ansible 的配置文件的查找顺序如下:
- 环境变量
ANSIBLE_CONFIG
- 当前目录下的
ansible.cfg
- home 目录下的
~/.ansible.cfg
/etc/ansible/ansible.cfg
Ansible 使用找到的第一个文件,忽略其余的。
配置文件是 INI
格式文件的变种,#
和 ;
都可以用作注释符,但注释所在的行有正规的值时,只能使用 ;
# some basic default values...
inventory = /etc/ansible/hosts ; This points to the file that lists your hosts
出于安全的考虑,
ansible.vfg
所在的当前目录是world-writable
的话,Ansible 将不会自动加载文件,解决方法是将此目录的进入权限限定为特定的用户或组。如果系统不能使用chmod
、chown
、chgrp
,最好的解决方法修改文件系统的挂载选项,使目录对运行 ansible 的用户读写,对其他用户关闭。
使 ansible-config view
查看配置。
使用前
Ansible
远程通信默认使用原生的 OpenSSH
,但是当管理节点是 Enterprise Linux 6
(如 RHEL
和 CentOS
),Openssh
的版太老,Ansible
会使用 OpenSSH
的 Python
实现:paramiko
。如果您想使用 SSH
的新特性,使用 Fedora
、MacOS
或 Ubuntu
作为控制节点。
可能有些设备不支持
SFTP
,可以在配置文件中切换为SCP
模式。
ssh keys
Ansibe 默认使用 SSH keys 和远程主机通信,虽然推荐使用 ssh keys,但当提供 --ask-pass
参数时也可以使口令认证。如果想用 sudo
,需提供 --ask-become-pass
(之前的 --ask-sudo-pass
不再推荐)。
Linux
无密钥登录:
-
在管理节点生成密钥对
ssh-keygen -t rsa
-
发送公钥
ssh-copy-id user@host
或
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
-
也可以设置远程主机拒绝密码验证
# vi /etc/ssh/sshd_config PasswordAuthentication no
PubkeyAuthentication yes
-
如果执行第三步,需重启 sshd
systemctl restart sshd
ssh-agent
Ansible does not expose a channel to allow communication between the user and the ssh process to accept a password manually to decrypt an ssh key when using the ssh connection plugin (which is the default). The use of ssh-agent is highly recommended.
ssh-agent
是 ssh 的代理程序,可以帮助我们管理私钥。当遇到如下情况时,我们会需要 ssh-agent
:
- 使用不同的密钥连接不同的主机,需手动指定对应的密钥,使用
ssh-agent
可以帮助我们选择对应的密钥进行认证,不再需手动指定。 - 当私钥设置密码,每次使用时都要输入密码,
ssh-agent
可以免去重输入密码的操作。
当然,不少系统默认都已经启动,而且生成的密钥也自动加入代理,所以下面的步骤不需要操作。
-
启动
ssh-agent
:ssh-agent $SHELL # 会启动一个子shell,运行在子shell中,会随着 ssh 会话的消失而消失,这是一种安全机制 eval `ssh-agent` # 不会启动子shell
-
关闭
ssh-agent
:ssh-agent -k $SSH_AGENT_PID
-
添加私钥
ssh-add ~/.ssh/id_rsa
-
查看代理中的私钥
ssh-add -l
-
查看代理中的私钥对应的公钥
ssh-add -L
-
删除指定私钥
ssh-add -d /path/key/key_name
-
删除所有代理的私钥
ssh-add -D
-
锁定 ssh 代理
ssh-add -x
-
解锁 ssh 代理
ssh-add -X
开始使用
编辑 ansible.cfg
中的 inventory
指定的文件,默认 /etc/ansible/hosts
:
[test]
10.53.141.252 ansible_user=cec
命令行执行命令
$ ansible all -m ping
10.53.141.252 | SUCCESS => {
"changed": false,
"ping": "pong"
}
$ ansible all -a ifconfig
10.53.141.252 | CHANGED | rc=0 >>
enp2s0 Link encap:以太网 硬件地址 8c:ec:4b:51:cc:6d
inet 地址:10.53.141.252 广播:10.53.143.255 掩码:255.255.252.0
。。。。。。