理論部分:
-
常用的自動化運維工具:
Puppet
—基於 Ruby 開發,采用 C/S 架構,擴展性強,基於 SSL,遠程命令執行相對較弱
SaltStack
—基於 Python 開發,采用 C/S 架構,相對 puppet 更輕量級,配置語法使用 YMAL,使得配置腳本更簡單
Ansible
—基於 Python paramiko 開發,分布式,無需客戶端,輕量級,配置語法使用 YMAL 及 Jinja2 模板語言,更強的遠程命令執行操作
其他 DevOps 請參看:https://github.com/geekwolf/sa-scripts/blob/master/devops.md
2.ansible簡介:
Ansible 是一個簡單的自動化運維管理工具,可以用來自動化部署應用、配置、編排 task(持續交付、無宕機更新等),采用 paramiko 協議庫(fabric 也使用這個),通過 SSH 或者 ZeroMQ 等連接主機,大概每 2 個月發布一個主版本
簡單的說: 讓我們自動化部署APP;自動化管理配置項;自動化的持續交付;自動化的(AWS)雲服務管理。 批量的在遠程服務器上執行命令 。
Ansible則是提供了一套簡單的流程,你要按照它的流程來做,就能輕松完成任務.
3.Ansible 工作機制:
基於 paramiko 開發的。這是一個純Python實現的ssh協議庫,Ansible 在管理節點將 Ansible 模塊通過 SSH 協議(或者 Kerberos、LDAP)推送到被管理端執行,執行完之后自動刪除,可以使用 SVN 等來管理自定義模塊及編排
4.Ansible 的組成:
由 5 個部分組成:
Ansible:核心
Modules:包括 Ansible 自帶的核心模塊及自定義模塊
Plugins:完成模塊功能的補充,包括連接插件、郵件插件等
Playbooks:網上很多翻譯為劇本,個人覺得理解為編排更為合理;定義 Ansible 多任務配置文件,有 Ansible 自動執行
Inventory:定義 Ansible 管理主機的清單
5.ansible的優點:
1、輕量級,他不需要去客戶端安裝agent,更新時,只需要在操作機上進行一次更新即可.
2、批量任務執行可以寫成腳本,而且不用分發到遠程就可以執行.
3、使用python編寫的,維護更簡單,ruby語法過於復雜 .
4、支持sudo.
實驗部分:
1.安裝ansible
實驗環境 :
角色 |
Hostname |
SystemRelease |
IP address |
node1 |
node1.server.com |
Rhel-6.5_x86_64 |
192.168.1.63 |
node2 |
node2.server.com |
Rhel-6.5_x86_64 |
192.168.1.64 |
server |
ansible.server.com |
CentOS-6.5_x86_64 |
192.168.1.20 |
准備工作:
關閉iptables:
各個服務器節點的配置
1、節點1的配置,修改主機名
[root@xuegod63 ~]# service iptables stop
[root@xuegod63 ~]# chkconfig iptables off
[root@xuegod63 ~]# hostname node1.server.com
[root@xuegod63 ~]# vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node1.server.com
logout 注銷 重新登錄 或者是reboot 重啟
2、節點2的配置,修改主機名:
[root@xuegod64 ~]# service iptables stop
[root@xuegod64 ~]# chkconfig iptables off
[root@xuegod64 ~]# hostname node2.server.com
[root@xuegod64 ~]# vim /etc/sysconfig/network
//添加如下內容:
NETWORKING=yes
HOSTNAME=node2.server.com
logout 注銷 重新登錄 或者是reboot 重啟
在Ansible服務器配置:
-
防火牆和主機名配置
[root@Master ~]# service iptables stop
[root@Master ~]# chkconfig iptables off
[root@Master ~]# hostname ansible.server.com
[root@Master ~]# vim /etc/sysconfig/network
添加:
NETWORKING=yes
HOSTNAME=ansible.server.com
重啟或者是logout
-
添加hosts解析
[root@ansible ~]# vim /etc/hosts #編輯hosts文件
[root@ansible ~]# tail -3 /etc/hosts
192.168.1.63 node1.server.com #node1
192.168.1.64 node2.server.com #node2
192.168.1.20 ansible.server.com #ansible
測試連通性
[root@ansible ~]# ping node1.server.com
[root@ansible ~]# ping node2.server.com
-
配置EPEL源
[root@ansible ~]#
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@ansible ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
[root@ansible ~]# yum install ansible -y #安裝ansible
2.ansible的配置文件及作用
[root@ansible ~]# rpm -ql ansible | more
/etc/ansible
/etc/ansible/ansible.cfg #主配置文件
/etc/ansible/hosts #節點主機列表
/etc/ansible/roles
/usr/bin/ansible
/usr/bin/ansible-console
/usr/bin/ansible-doc
/usr/bin/ansible-galaxy
/usr/bin/ansible-playbook
/usr/bin/ansible-pull
/usr/bin/ansible-vault
3. 編輯/etc/ansible/hosts(節點配置文件):
[root@ansible ~]# vim /etc/ansible/hosts
[root@ansible ~]# tail -3 /etc/ansible/hosts
[webserver]
node1.server.com
node2.server.com
//其他內容可以全部注釋掉
-
配置ansible端能基於密鑰認證的方式聯系各被管理節點。
[root@ansible ~]# ssh-keygen #生成密鑰對
5、把密鑰發往各個節點服務器上:
[root@ansible ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1.server.com
[root@ansible ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2.server.com
Ansible簡單測試
ansible命令
格式:ansible 節點名稱 [ -m 模塊] -a 命令參數
例:
1、查看各個節點的時間
[root@ansible ~]# ansible all -a date
[root@ansible ~]# ansible all -m command -a date
//以上兩條命令結果是一樣的,因為默認調用 command 模塊,所以可以省略, all 表示所有節點, -a 后面是參數
2、查看各個節點在線情況
[root@ansible ~]# ansible all -m ping //內建的ping模塊
3、在各個節點輸出指定信息
[root@ansible ~]# ansible all -a "/bin/echo hello,world" #輸出信息
[root@ansible ~]# ansible all -a "/bin/df -h" #輸出掛載信息
[root@ansible ~]# ansible all -a "/sbin/ip addr show dev eth0 " #查看各節點的 eth0 網卡信息
Ansible-playbook
1、Playbook是通過yaml文件來配置實現的,先來介紹下yaml語法!
YAML的語法和其他高階語言類似,並且可以簡單表達清單、散列表、標量等數據結構。\
其結構(Structure)通過空格來展示,序列(Sequence)里的項用"-"來代表,Map里的鍵值對用":"分隔。YAML文件擴展名通常為.yaml,如example.yaml
2、Playbook可以用來管理復雜任務
對於需反復執行的、較為復雜的任務,我們可以通過定義 Playbook 來搞定。Playbook 是 Ansible 真正強大的地方,它允許使用變量、條件、循環、以及模板,也能通過角色 及包含指令來重用既有內容。下面我們來看看一些具體的實例。
1:批量安裝mysql-server軟件:
[root@ansible ~]# vim mysql-server.yaml #建立mysql-server .yaml文件
內容如下: (注意語法格式)
選項解析:
hosts:webserver #指定要執行指定任務的主機,其可以是一個或多個由冒號分隔主機組
remote_user:root #用於指定遠程主機上的執行任務的用戶
tasks: # 任務
-name:mysql-server installing # 給這個任務起的名字
yum:name=php #利用yum模塊,安裝軟件的包名為mysql-server
state=present #狀態為安裝
state=absent #狀態為卸載
檢查node是否已經安裝mysql-server
[root@ansible ~]# ansible all -a "/bin/rpm -q mysql-server "
[root@ansible ~]# ansible-playbook mysql-server.yaml
看到結果,ok=2 changed=1 說明客戶機上的mysql-server安裝成功了!
驗證一下 mysql-server是否成功
[root@ansible ~]# ansible all -a "/bin/rpm -q mysql-server "
[root@ansible ~]# ansible all -a "/sbin/service mysqld start " #啟動mysqld
案例2 創建crontab計划
1.建立cron.yaml,讓每月10號來運行/root/backup.sh腳本
[root@ansible ~]# vim crond.yaml
內容如下:
-
執行
[root@ansible ~]# ansible-playbook crond.yaml
看到結果,ok=2 changed=1 說明客戶機上的crontab計划創建成功了!
-
[root@ansible ~]# ansible all -a 'crontab -l ' #查看各個節點crontab:
注:
"ansible-doc -l" 命令來查看它內置的有哪些模塊。
"ansible-doc 模塊名" 命令來查看具體模塊的詳細用法。
使用ansible批量的添加用戶
方法一:直接使用ansible命令
[root@ansible ~]# openssl passwd -salt -l "abc123"
-luVlrZexUGHM
[root@ansible ~]# ansible all -m user -a "name=baigujing password=-luVlrZexUGHM shell=/bin/bash " -u root
方法二:定義主機清單在使用ansible命令
[root@ansible ~]# openssl passwd -salt -l "abc123"
-luVlrZexUGHM
[root@ansible ~]# vim hosts #添加主機地址
[root@ansible ~]# ansible -i hosts webserver -m user -a "name=tester password=-luVlrZexUGHMshell=/bin/bash " -u root
參數解釋:
-i #指定 inventory文件的位置;
webserver #清單文件中的主機組名稱
-m #指定模塊,不加此選項默認使用command模塊
user #添加用戶的模塊
-a #編寫模塊內支持的指定
-u #指定遠程用戶
注意:密碼不能是明文 注意是password 不是passwd
.注意password必須是密文的,直接添加到/etc/shadow文件中
創建用戶組:
ansible -i test puppet -m group -a "name=test state=present" -u root
#建立用戶組,使用的是新的模塊 group
刪除用戶:
ansible -i hosts webserver -m user -a "name=tester remove=yes state=absent" -u root
方法三:編寫yaml文件
1,生成密鑰
[root@ansible ~]# openssl passwd -salt -l "abc123"
-luVlrZexUGHM #生成salt密鑰
2.編輯yaml文件
[root@ansible ~]# vim useradd.yaml #編輯文件
[root@ansible ~]# cat useradd.yaml #查看內容
- hosts: webserver #定義主機組
user: root #遠程鏈接用戶
vars:
user: jerry #添加的用戶名
tasks: #任務
- name: add user #任務名稱
action: user name={{ user }} password=-luVlrZexUGHM shell=/bin/bash home=/home/{{ user }} #指定用戶相關的信息 密碼 必須是密文salt加密 登錄shell 宿主目錄
3.執行yaml文件
[root@ansible ~]# ansible-playbook useradd.yaml
成功
-
客戶端節點驗證
[root@ansible ~]# ansible all -a "/usr/bin/tail -1 /etc/shadow"
用戶名jerry 沒錯 密碼就是通過第一步生成的 abc123
切換用戶驗證
輸入明文abc123 即可