自動化運維工具ansible的實踐

邵磊發表於2019-03-03

前言

當伺服器越來越多,統一管理起來顯得尤為重要。那麼選擇一款管理工具必不可少,既要能滿足管理新部署的機器,還要相容之前部署的機器,無客戶端版的ansible管理工具可能成為優先考慮的工具之一。

認識ansible

ansible 是一款自動化運維工具,能夠解決我們在it工作中,一遍又一遍執行相同任務。利用它,我們可以只解決一次問題,然後自動化執行我們的解決方案。
目前,數以千計的公司正在使用簡單但功能強大的it自動化引擎,我相信它可以幫我們加速完成DevOps計劃。
對了,它是由Red Hat公司出品的。

特性

  1. 簡單、強大、無代理
  2. 無客戶端、推送式
  3. 任務按順序執行
  4. 應用程式部署、 配置管理
  5. 工作流編排
  6. 協調應用程式生命週期
  7. 使用OpenSSH和WinRM、無代理架構
  8. 沒有代理商利用或更新

框架結構

自動化運維工具ansible的實踐

安裝

推薦pip安裝

[sl@localhost ~]# easy_install pip
[sl@localhost ~]# pip install ansible
複製程式碼

其他安裝方式

從專案的checkout中可以很容易執行Ansible,Ansible的執行不要求root許可權,也不依賴於其他軟體,不要求執行後臺程式,也不需要設定資料庫.

從原始碼安裝的步驟

$ git clone git://github.com/ansible/ansible.git --recursive
$ cd ./ansible
//使用 Bash:

$ source ./hacking/env-setup
//使用 Fish:

$ . ./hacking/env-setup.fish
複製程式碼

yum源安裝

$ sudo yum install ansible
複製程式碼

apt安裝

$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible
複製程式碼

管理機器

編輯機器列表

修改這個列表/etc/ansible/hosts

[test]
10.10.100.205:22 ansible_ssh_user=sl ansible_ssh_pass=1
10.10.100.230:22 ansible_ssh_user=sl ansible_ssh_pass=1

複製程式碼

這裡我使用了使用者名稱密碼連線,當然官方並不建議這種連線方式,下文介紹證照連線。
如果提示找不到sshpass,需安裝。

yum install sshpass
複製程式碼

你還可以通過組的形式新增,如:

[test]
10.10.100.[1-10]
server[1-10]
[a-z].company.com
複製程式碼

以上,各自代表一組機器。

其他引數

ansible_ssh_host
    將要連線的遠端主機名.與你想要設定的主機的別名不同的話,可通過此變數設定.
ansible_ssh_port
    ssh埠號.如果不是預設的埠號,通過此變數設定.
ansible_ssh_user
    預設的 ssh 使用者名稱
ansible_ssh_pass
    ssh 密碼(這種方式並不安全,我們強烈建議使用 --ask-pass 或 SSH 金鑰)
ansible_sudo_pass
    sudo 密碼(這種方式並不安全,我們強烈建議使用 --ask-sudo-pass)
ansible_sudo_exe (new in version 1.8)
    sudo 命令路徑(適用於1.8及以上版本)
ansible_connection
    與主機的連線型別.比如:local, ssh 或者 paramiko. Ansible 1.2 以前預設使用 paramiko.1.2 以後預設使用 `smart`,`smart` 方式會根據是否支援 ControlPersist, 來判斷`ssh` 方式是否可行.
ansible_ssh_private_key_file
    ssh 使用的私鑰檔案.適用於有多個金鑰,而你不想使用 SSH 代理的情況.
ansible_shell_type
    目標系統的shell型別.預設情況下,命令的執行使用 `sh` 語法,可設定為 `csh` 或 `fish`.
ansible_python_interpreter
    目標主機的 python 路徑.適用於的情況: 系統中有多個 Python, 或者命令路徑不是"/usr/bin/python",比如  *BSD, 或者 /usr/bin/python
複製程式碼

基於證照認證新增機器

在控制主機中生成ssh金鑰對

ssh-keygen -t rsa
複製程式碼

一路回車下去,然後執行

ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.10.100.205
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.10.100.206
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.10.100.207
複製程式碼
自動化運維工具ansible的實踐

/etc/ansible/hosts 中增加機器ip及埠號即可,最後測試一下。

簡單使用

列出檔案列表

ansible test -a "ls "
複製程式碼
自動化運維工具ansible的實踐

測試機器是否通

[sl@localhost ~]# ansible test -m ping
10.10.100.205 | SUCCESS => {
    "changed": false, 
    "failed": false, 
    "ping": "pong"
}
10.10.100.230 | SUCCESS => {
    "changed": false, 
    "failed": false, 
    "ping": "pong"
}

複製程式碼

其他命令

# 執行遠端命令
# ansible test -m command -a `uptime`

# 執行主控端指令碼
# ansible test -m script -a `/etc/ansible/script/test.sh`

# 執行遠端主機的指令碼
# ansible test -m shell -a `ps aux|grep zabbix`

# 類似shell
# ansible test -m raw -a "ps aux|grep zabbix|awk `{print $2}`"

# 建立軟連結
# ansible test -m file -a "src=/etc/resolv.conf dest=/tmp/resolv.conf state=link"

# 刪除軟連結
# ansible test -m file -a "path=/tmp/resolv.conf state=absent"

# 複製檔案到遠端伺服器
# ansible test -m copy -a "src=/etc/ansible/ansible.cfg dest=/tmp/ansible.cfg owner=root group=root mode=0644"
複製程式碼

使用playbook

Playbook是一種與adhoc任務執行模式完全不同的方式,而且特別強大。
簡單地說,Playbooks是一個非常簡單的配置管理和多機器部署系統的基礎,不同於任何已經存在的配置系統,而且非常適合部署複雜應用程式。

yml語法

yml是一種比較精簡的語法結構,通過空格來控制層級,具體可移步百度。

檢測 apache是否是最新版

---
- hosts: test
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: name=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running (and enable it at boot)
    service: name=httpd state=started enabled=yes
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

複製程式碼

儲存為test.yml,執行

ansible-playbook test.yml
複製程式碼
自動化運維工具ansible的實踐

因為所有機器上都沒有安裝,所有報failed。

yml基本結構

基本結構:
– host: test
remote_user:
tasks:
– task1
module_name: module_args
– task 2
handlers:
– handler1
– handler2
hosts行是一個或多個組或主機模式的列表,以冒號分隔,
每個任務定義可遠端使用者:

-  hosts : webservers 
  remote_user : root 
  tasks :
    -  name : test connection 
      ping :
      remote_user : yourname
複製程式碼

任務分為service、command、shell等:

tasks:
  - name: make sure apache is running
    service: name=httpd state=started
    
tasks:
  - name: enable selinux
    command: /sbin/setenforce 1
    
tasks:
  - name: run this command and ignore the result
    shell: /usr/bin/somecommand || /bin/true
    
tasks:
  - name: run this command and ignore the result
    shell: /usr/bin/somecommand
    ignore_errors: True
    
tasks:
    - name: restart everything
      command: echo "this task will restart the web services"
      notify: "restart web services"
複製程式碼

使用playbook安裝nginx

寫安裝nginx的sh指令碼vim nginx-install.yml

- hosts: test
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: copy nginx-install.sh to client
    copy: src=nginx-install.sh dest=/tmp/nginx-install.sh
  - name: chomd a+x
    shell: chmod +x /tmp/nginx-install.sh
  - name: install nginx
    shell: /tmp/nginx-install.sh

複製程式碼

執行ansible-playbook

[shaolei@localhost ~]# ansible-playbook nginx-install.yml 
複製程式碼
自動化運維工具ansible的實踐

到各機器上觀察

[shaolei@localhost html]# ps -ef |grep nginx
shaolei      2477 31369  0 13:09 pts/0    00:00:00 grep --color=auto nginx
複製程式碼

總結

總體來說,ansible功能十分強大,適合大部分公司大部分場景,本文介紹了ansible基本用法,和playbook指令碼的一些簡單實踐。當然如果你熟悉python,你還可以使用python寫出各種各樣適合自己公司的運維命令來。

相關文章