Ansible 配置管理與部署入門

Ansible 配置管理與部署入門

簡介

Ansible 是一個開源的系統自動化工具,擁有配置系統,任務排程,可以透過代碼來管理我們的infra,可以進階設計出一些 CI/CD 流程等功能。Ansible 預設使用 SSH 來進行遠端主機管理,Ansible 1.3 之後的版本可以透過本地的 OpenSSH 與遠端的主機進行通訊,如果是在比較老舊的作業系統,則會採取 paramiko 的相對應做法。

安裝 Ansible

這裡列出一些安裝 ansible 的方法:

Mac 可以直接透過 brew install ansible

brew install ansible

透過 python 安裝ansible

sudo easy_install pip
sudo pip install ansible

Ubuntu 安裝 ansible

$ sudo apt-get install python-software-properties software-properties-common -y
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible -y

Centos 安裝 ansible

# install the epel-release RPM if needed on CentOS, RHEL, or Scientific Linux
$ sudo yum install -y epel-release
$ sudo yum install ansible -y

也可以從 github 下載代碼源,直接透過碼源安裝 ansible

git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup
sudo easy_install pip
sudo pip install paramiko PyYAML Jinja2 httplib2 six

檢查版本

安裝完畢,可以透過以下指令確認版本

> ansible --version

ansible 2.10.4

環境準備

首先,我們要透過 Ansible 控制遠端主機,必須先將本地的 public SSH key 必須在遠端主機系統的authorized_key

基本結構說明

在開始前,先大概知道一下,在使用 Ansible 會有哪些檔案結構及用途:

  • ansible.cfg:ansible 設定檔案
  • Inventory:遠端主機資森
  • Playbooks:腳本
  • Task:任務
  • Handler:服務及任務控制
  • Role:整合腳本與任務為 module

設定 asible.cfg

在 asible.cfg 設定檔案,會透過 inventory 來指定設定 host 的 file,也就是主機的清單列表。(在 ansible 2.8.0 之後的版本都是透過 inventory,舊版本則是使用 hostfile )

[defaults]
# 指定 inventory (host file) 檔案路徑
inventory = hosts

# 是否詢問加入 ssh keyben
host_key_checking = False

設定 hosts

hosts

主要格式,例如:

[dev-host]
server1 ansible_ssh_host=10.0.0.1 ansible_ssh_user=adam ansible_ssh_private_key_file=~/.ssh/id_rsa

[back-end-and-infra:children]
back-end-servers
infrastructure

[back-end-servers]
database ansible_host=10.0.0.1 ansible_port=22 ansible_user=postgres
webserver ansible_host=10.0.0.2 ansible_port=22 ansible_user=root

[infrastructure]
ldap ansible_host=10.0.0.100 ansible_port=22 ansible_user=root

設定完 host ,可以先試著執行看看,能否順利連線 host 及打印一個 hello world 字段

ansible all -m command -a 'echo Hello World on my host.'

設定 playbook

這裡新增一個 checkip-playbook.yml,我們來測試能否順利連到遠端主機,並且打印出遠端主機的IP

底下有列出一些 **ansible 如何取得遠端主機 IP ** 的幾種做法:

- hosts: all
  gather_facts: yes
  tasks:
    # Get IP from SSH connection between ansible master and host
    - debug: var=hostvars[inventory_hostname]['ansible_env'].SSH_CONNECTION.split(' ')[2]
    #  use playbook method to get IP address
    - debug: var=hostvars[inventory_hostname]['ansible_default_ipv4']['address']
    - debug: var=hostvars[inventory_hostname]['ansible_default_ipv6']['address']
    # Get IP address of enp0s3 interface
    - debug: var=ansible_enp0s3.ipv4.address
    # Get IP address of eth0 interface
    - debug: var=ansible_eth0.ipv4.address

設定完後,我們可以來執行 playbook

ansible-playbook checkip-playbook.yml

(如果,remote host 沒有設定 default_ip6,會返回 VARIABLE IS NOT DEFINED! )

參考

ansible中文權威指南