codecamp

Ansible 环境部署

在本次的章节里,冻仁将简单地介绍 Ansible 基本观念和怎么安装、设定 Ansible。

automate_with_ansible_basic-11.jpg

Ansible 是怎么运作的?

在 Ansible 的世界里,我们会通过 inventory 档案来定义有哪些 Managed node (被控端),并借由 SSH 和 Python 进行沟通。

automate_with_ansible_basic-12.jpg

换句话说,当 Control Machine (主控端) 可以用 SSH 连上 Managed node,且被连上的机器里有预载 Python 时,Ansible 就可以运作了!

  • Control Machine 指的是我们主要会在上面操作 Ansible 的机器,冻仁喜欢用主控端来形容它。它可以是我们平时用的电脑、手机 1 或机房里的某一台机器,也可以把它想成是一般 Lab 练习里的 Workstation

  • Managed node 则是被 Ansible 操纵的机器,冻仁喜欢用被控端来形容它。在很多的 Lab 练习里会用 Server 来称呼它。

怎么安装 Ansible?

在一般的情况下,我们只需在 Control Machine 里安装 Ansible 即可,因为 GNU/Linux 和 macOS 的 Managed node 都早已预载了 Python 2.5 以上的版本,且开通了 SSH 连线的条件。

若想拿 Ansible 来管 Windows 的话,则需进行较多的设置。大家可参考冻仁先前分享的 Ansible - Roles & Windows 简报和官方文件

automate_with_ansible_basic-13.jpg

在 Control Machine 上安装 Ansible

碍于文章篇幅,这里只会提到冻仁较常用的环境,其余的部份还请参考官方文件和 Ansible 台湾使用者社群所维护的 Ansible 安装教学

目前最新释出的 Ansible 版本为 v2.2.0.0。

Ubuntu (Apt)

  1. 安装 add-apt-repository 必要套件。

    $ sudo apt-get install -y python-software-properties software-properties-common
    
  2. 使用 Ansible 官方的 PPA 套件来源。

    $ sudo add-apt-repository -y ppa:ansible/ansible; sudo apt-get update
    
  3. 安装 Ansible。

    $ sudo apt-get install -y ansible
    
CentOS (Yum)
  1. 新增 epel-release 第三方套件来源。

    $ sudo yum install -y epel-release
    
  2. 安装 Ansible。

    $ sudo yum install -y ansible
    
macOS (Homebrew)
  1. 请先安装 homebrew,已安装者请略过。

    $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    
  2. 安装 Ansible。

    $ brew install ansible
    
Python (Pip)

Ansible 近来的释出速度很快,若想追求较新的版本可改用 Pip 的方式进行安装,较不建议初学者使用。

  1. 需请先安装 pip,已安装者请略过。

    # Debian, Ubuntu
    $ sudo apt-get install -y python-pip
    
    # CentOS
    $ sudo yum install -y python-pip
    
    # macOS
    $ sudo easy_install pip
    
  1. 升级 pip。

    $ sudo pip install -U pip
    
  2. 安装 Ansible。

    $ sudo pip install ansible
    

在 Managed Node 安装 OpenSSH server 和 Python

正常在 Managed Node 我们都会安装 OpenSSH server 和开通连线权限以便于远端管理,OpenSSH 这边冻仁就不多加赘述了。

Python 的部份呢?虽说现代的 GNU/Linux 大多都早已内建了,可 Ansible 预设使用的 Python 是 2.x 的版本,这在 Ubuntu 16.04 预载 Python 3.4 的环境上需做些调整,详情请参阅 Python 3 Support | Ansible Documentation 一文。2

  • Ubuntu.

    $ sudo apt-get install -y openssh-server python2.7
    
  • CentOS.

    $ sudo yum install -y openssh-server python
    
  • macOS: 在 macOS 10.11 里,我们只需使用内建的 OpenSSH server 和 Python 即可,详情请参考 Apple 官方的 OS X El Capitan: 允许远端电脑取用您的 Mac 一文进行设置。

怎么设定 Ansible?

我们可以借由 ansible.cfg 来设定预设的 inventory 档案的路径远端使用者名称和 SSH 金钥路径等相关设定。

automate_with_ansible_basic-14.jpg

  1. 安装好 Ansible 后,我们可以在 /etc/ansible/ 的目录底下找到 Ansible 的设定档。
  2. 通常我们较偏爱把 ansible.cfg 和 hosts 这两个档案与其它的 Playbooks 放在同个专案目录底下,然后通过版本控制系统 (例如 Git) 把它们一起储存起来,以实现 Ansible 的 Infrastructure as Code

inventory 是什么?

inventory 就单字本身有详细目录清单列表的意思。在这里我们可以把它当成是一份主机列表,我们可通过它对定义每个 Managed Node 的代号、IP 位址、连线相关资讯和群组。

automate_with_ansible_basic-15.jpg

  1. 若有对 Control Machine 本机操作的需求,建议于 /etc/ansible/hosts 补上 local 的设定。

    # For root user.
    $ /bin/echo -e "[local]\nlocalhost ansible_connection=local" >> /etc/ansible/hosts
    
    # For sudo user.
    $ sudo su -c '/bin/echo -e "[local]\nlocalhost ansible_connection=local" >> /etc/ansible/hosts'
    

Hello World

当已上的设置都完成了,您可以试著在终端机里用 Ansible 呼叫本机印出 Hello World

$ ansible localhost -m command -a 'echo Hello World.'
localhost | SUCCESS | rc=0 >>
Hello World.

欢迎来到 Ansible 的世界!:D

相关连结

1. 相信在这个智慧型手机里盛行的时代,要在手机里装个 Python 和 OpenSSH 一定不是什么难事 (笑)。在台湾还有人整合了 Ansible 与聊天机器人 (Chatbot),这样出门在外只要有手机和网络就可以远端工作了!(详情请参考从 DevOps 到 ChatOps:War Room、Bots 与 Automation 的简报) ↩
2. Ansible 已在 2.2 时加入了 Python 3 Support 的功能,感谢友人 @maxsolar 的 feedback,这下冻仁可以少写一篇文章了! ↩


Ansible 是什么
Ansible 用Vagrant练习Ansible
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }