Ansible使用記錄(1):ansible簡述與安裝配置

一、Ansible簡單介紹

Ansible是一款自動化運維工具,類似於之前的Puppet,Saltstack,chef等,可以針對批量服務器實現系統配置、程序部署、命令執行等。ansible本身沒有批量部署的能力,但其提供了一種基於模塊的框架,可以通過模塊實現批量部署以及運行。
ansible是非典型性C/S模型,ansible服務器的ansible程序在執行命令時候調用,而不是後臺運行的監聽程序;被操作服務器(cleint服務器)不用額外安裝ansible特定開發的客戶端程序,而是直接複用openssh實現。

Ansible 總體架構示意圖

在這裏插入圖片描述
圖片來源地址:https://www.oreilly.com/library/view/learning-ansible/9781783550630/graphics/0630OT_01_01.jpg

詳細的介紹或者原理解析可以在需要的時候,到官方網站閱讀或者搜索相關博文

二、Ansible安裝部署[CentOS7]

在 CentOS 7 中安裝部署Ansible非常簡單,先配置epel yum源,然後直接安裝。如下

1. 配置epel源

yum -y install epel-release

2. 安裝ansible

2.1 安裝部署

yum -y install ansible

這樣ansible就已經安裝完成了,版本信息如下

ansible --version
ansible 2.7.10
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Apr  9 2019, 14:30:50) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

2.2 ansible命令與文件

ansible系統命令

ansible安裝完成後提供了一組命令實現不同的功能

ansible                       # 核心指令,主要使用實現執行ad-hoc命令
ansible-playbook              # 通過讀取playbook 文件後,執行相應的動作
ansible-pull                  # 拉取模式(ansible默認使用的是推送模式)
ansible-doc                   # 用於模塊信息查詢,以及相關文檔
ansible-galaxy                # 下載/管理第三方擴展模塊,類似於python的pip/esay_install
ansible-lint                  # 對playbook的語法進行檢查的一個工具
ansible-vault                 # 用於敏感信息加密解密
ansible-config                # 瀏覽,編輯,管理ansible配置
ansible-inventory             # 展示ansible inventory信息,
ansible-console               # 控制檯式的批量交互執行
ansible-connection            # 看名字,應該是ansible的connection plugins

ansible配置文件

/etc/ansible/ansible.cfg    # ansible默認主配置文件
/etc/ansible/hosts            # ansible命令執行ad-hoc的inventory文件(主機列表)

三、ansbile 簡單使用

ansible連接操作客戶端服務器可以直接通過賬號密碼操作也可以直接使用祕鑰無密碼訪問操作,配置如下

# ansible服務器執行[我這裏默認使用的是root賬戶]
# 1. 生成密碼
ssh-keygen -t rsa  -P ""  -f  ~/.ssh/id_rsa

# 2. 配置無密碼訪問被操作服務器(例如,10.116.186.4)
ssh-copy-id 10.116.186.4

這樣ansible服務器就可以使用當前用戶無密碼訪問被操作服務器(例如,10.116.186.4)

1. ansible(ad-hoc)

配置inventory,具體語法格式查看相關文檔

vi /etc/ansible/hosts  # 如下是我的2臺ngnix服務器(centos7)

[nginx]
10.116.186.4
10.116.186.5

通過ansible模塊批量執行ad-hoc命令

# 通過ping模塊,測試服務器連通性
ansible nginx -m ping
10.116.186.4 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
10.116.186.5 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

# 通過command模塊,可以執行命令,例如獲取主機當前目錄[備註:command模塊爲默認模塊,可以不使用-m指定]
 ansible nginx -a 'pwd'
10.116.186.5 | CHANGED | rc=0 >>
/root
10.116.186.4 | CHANGED | rc=0 >>
/root

ansible有很多核心模塊,例如:setup ping shell raw command copy等等,還可以自定義模塊

2. ansible-playbook

playbook通過組織和模板的方式批量配置應用或者系統,包括:

# 核心元素
tasks:              # 任務,即由模塊定義的操作列表
variables:          # 變量
templates:          # 模板,即使用模板語法編輯的相關配置文件
handlers:           # 由特定條件觸發的任務/操作列表
roles:             # 角色

# 基礎組件
hosts:              # 運行目標主機(運行指定任務或者操作)
remote_user:        # 在客戶機上使用哪個用於身份執行任務/操作
sudo_user:          # 非管理員用戶使用sudo權限執行任務/操作,前提條件是具有該權限
tasks:              # 任務列表 

一個簡單的實例

vi demo.yaml

---
- hosts: nginx
  remote_user: root

  tasks:
  - name: ping servers
    ping:  
  - name: copy a file to nginx servers
    copy:
      src: /tmp/test.txt
      dest: /tmp/test.txt
      owner: root
      group: root
      mode: 0755

cat /tmp/test.txt
hello world

# 執行這個簡單的playbook,沒有指定inventory會使用默認/etc/ansible/hosts,直接指定-i /etc/ansible/hosts可以省略
ansible-playbook -i /etc/ansible/hosts demo.yaml 

PLAY [nginx] ****************************************************************************************

TASK [Gathering Facts] ******************************************************************************
ok: [10.116.186.5]
ok: [10.116.186.4]

TASK [ping servers] *********************************************************************************
ok: [10.116.186.4]
ok: [10.116.186.5]

TASK [copy a file to nginx servers] *****************************************************************
changed: [10.116.186.5]
changed: [10.116.186.4]

PLAY RECAP ******************************************************************************************
10.116.186.4               : ok=3    changed=1    unreachable=0    failed=0   
10.116.186.5               : ok=3    changed=1    unreachable=0    failed=0  

可以到服務器上查看文件是否存在
ssh 10.116.186.4 'ls -l /tmp/test.txt'      # ssh 10.116.186.5 'ls -l /tmp/test.txt'  
-rwxr-xr-x 1 root root 12 May  9 17:23 /tmp/test.txt

這裏演示的只是一個非常簡單的單文件的playbook,而playbook是可以通過文件目錄主機完成非常複雜且強大的配置的。典型的一個playbook目錄結構

└── demo          #項目名稱
    ├── hosts_production  #生產環境hosts
    ├── hosts_staging     #測試環境hosts
    ├── group_vars        # hosts group變量目錄
    ├── host_vars         # hosts 指定host變量目錄
    ├── roles             # 角色列表目錄
    │   ├── common        # common role 配置一些共通的任務或操作
    │   │   ├── defaults
    │   │   │   └── main.yaml
    │   │   ├── files
    │   │   │   ├── a.txt
    │   │   │   └── b.txt
    │   │   ├── handlers
    │   │   │   └── main.yaml
    │   │   ├── meta
    │   │   │   └── main.yaml
    │   │   ├── tasks
    │   │   │   └── main.yaml
    │   │   ├── templates
    │   │   │   └── ntp.conf.j2
    │   │   └── vars
    │   │       └── main.yaml
    │   ├── database              # 數據庫角色,配置數據庫相關任務
    │   │   ├── 目錄結構與common類似
    │   └── web                  # web角色,配置web服務相關任務
    │       ├── 目錄結構與common類似
    ├── site.yaml               # playbook入口,名字可以隨意定,執行ansible-playbook的時候指定
    ├── webservers.yaml         # webserver的playbook定義文件,可以被site.yaml引用
    └── dbservers.yaml          # databaseserver的playbook定義文件,可以被site.yaml

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章