Ansible 简单使用

1,112 阅读4分钟

关于

系统管理员经常需要做一些重复的工作,如系统初始化、软件升级、修改配置、部署应用、重启服务、执行命令等。我们可以通过脚本来完成这些工作,例如使 Fabric。但当系统规模较大时,脚本就显得比较乏力,配置管理工具 SaltStack、Ansible 等的优点显现出来。配置管理的特点是通过配置来管理远程服务器,并不是脚本。

Ansible 是配置管理和应用部署工具,默认通过 ssh 协议管理服务器,在管理主机上执行命令就可以在各节上执行相应的动作,而 Saltstack、Puppet、Chef 等需要在每个设备上安装特定的软件。

Ansible 的目的:

  • 应用部署
  • 管理配置
  • 回滚更新 等

Ansible 的特点:

  • 无需在部署主机上安装任何代理
  • 协调应用程序生命周期
  • 任务按顺序执行
  • 支持 API 及自定义模块,可松扩展
  • 通过 Playbooks 来定制管理
  • 基于模块,具有高度的复用性
  • 能够和当前主流云计算平台、容器工具完美结合

安装

推荐 pip:

pip install ansible

配置

Ansible 的配置文件的查找顺序如下:

  1. 环境变量 ANSIBLE_CONFIG
  2. 当前目录下的 ansible.cfg
  3. home 目录下的 ~/.ansible.cfg
  4. /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 将不会自动加载文件,解决方法是将此目录的进入权限限定为特定的用户或组。如果系统不能使用 chmodchownchgrp,最好的解决方法修改文件系统的挂载选项,使目录对运行 ansible 的用户读写,对其他用户关闭。

使 ansible-config view 查看配置。

使用前

Ansible 远程通信默认使用原生的 OpenSSH,但是当管理节点是 Enterprise Linux 6(如 RHELCentOS),Openssh 的版太老,Ansible 会使用 OpenSSHPython 实现:paramiko。如果您想使用 SSH 的新特性,使用 FedoraMacOSUbuntu 作为控制节点。

可能有些设备不支持 SFTP,可以在配置文件中切换为 SCP 模式。

ssh keys

Ansibe 默认使用 SSH keys 和远程主机通信,虽然推荐使用 ssh keys,但当提供 --ask-pass 参数时也可以使口令认证。如果想用 sudo,需提供 --ask-become-pass(之前的 --ask-sudo-pass 不再推荐)。

Linux 无密钥登录:

  1. 在管理节点生成密钥对

    ssh-keygen -t rsa
    
  2. 发送公钥

    ssh-copy-id user@host
    

    ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
    
  3. 也可以设置远程主机拒绝密码验证

    # vi /etc/ssh/sshd_config
    PasswordAuthentication no
    

    PubkeyAuthentication yes

  4. 如果执行第三步,需重启 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 可以免去重输入密码的操作。

当然,不少系统默认都已经启动,而且生成的密钥也自动加入代理,所以下面的步骤不需要操作。

  1. 启动 ssh-agent:

    ssh-agent $SHELL  # 会启动一个子shell,运行在子shell中,会随着 ssh 会话的消失而消失,这是一种安全机制
    eval `ssh-agent`  # 不会启动子shell
    
  2. 关闭 ssh-agent:

    ssh-agent -k $SSH_AGENT_PID
    
  3. 添加私钥

    ssh-add ~/.ssh/id_rsa
    
  4. 查看代理中的私钥

    ssh-add -l
    
  5. 查看代理中的私钥对应的公钥

    ssh-add -L
    
  6. 删除指定私钥

    ssh-add -d /path/key/key_name
    
  7. 删除所有代理的私钥

    ssh-add -D
    
  8. 锁定 ssh 代理

    ssh-add -x
    
  9. 解锁 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
。。。。。。