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! )