ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、chef、func、fabric)的優勢,實現了批量系統配置、批量程序部署、批量運行命令等功能。html
ansible是基於 paramiko 開發的,而且基於模塊化工做,自己沒有批量部署的能力。真正具備批量部署的是ansible所運行的模塊,ansible只是提供一種框架。ansible不須要在遠程主機上安裝client/agents,由於它們是基於ssh來和遠程主機通信的。ansible目前已經已經被紅帽官方收購,是自動化運維工具中你們承認度最高的,而且上手容易,學習簡單。是每位運維工程師必須掌握的技能之一。python
Ansible 與 SaltStackmysql
>> 最大的區別是 Ansible 無需在被監控主機部署任何客戶端代理,默認經過 SSH 通道進行遠程命令執行或下發配置。
>> 相同點是都具有功能強大、靈活的系統管理、狀態配置,都使用 YAML 格式來描述配置,二者都提供豐富的模板及 API,對雲計算平臺、大數據都有很好的支持web
由如下幾個核心組件構成:sql
ansible(主體):ansible的核心程序,提供一個命令行接口給用戶對ansible進行管理操做;
Host Inventory(主機清單):爲Ansible定義了管理主機的策略。通常小型環境下咱們只須要在host文件中寫入主機的IP地址便可,可是到了中大型環境咱們有可能須要使用靜態inventory或者動態主機清單來生成咱們所須要執行的目標主機。
Core Modules(核心模塊):Ansible執行命令的功能模塊,多數爲內置的核心模塊。
Custom Modules(拓展模塊):若是ansible自帶的模塊沒法知足我麼你的需求,用戶可自定義相應的模塊來知足本身的需求。
Connection Plugins(鏈接插件):模塊功能的補充,如鏈接類型插件、循環插件、變量插件、過濾插件等,該功能不經常使用
Playbook(任務劇本):編排定義ansible任務集的配置文件,由ansible順序依次執行,一般是JSON格式的* YML文件
API:供第三方程序調用的應用程序編程接口
數據庫
/etc/ansible/ansible.cfg
;.ansible/tmp/XXX/XXX.PY
文件;sleep 0
退出
172.25.254.1 server1編程
172.25.254.2 server2vim
ansible的相關的文件的路徑: rpm -aq | grep ansible (或者 rpm -ql | grep ansible)服務器
/etc/ansible/ansible.cfg ##主配置文件,配置ansible工做特性
/etc/ansible/hosts ##主機清單
/etc/ansible/roles/ ##存放角色的目錄框架
cd ansible/
ls
ansible-2.7.8-1.el7.noarch.rpm
ansible-tower-setup-bundle-3.4.2-1.el7.tar.gz
libtomcrypt-1.17-25.el7.x86_64.rpm
libtommath-0.42.0-5.el7.x86_64.rpm
python2-crypto-2.6.1-13.el7.x86_64.rpm
python2-jmespath-0.9.0-1.el7.noarch.rpm
python-httplib2-0.9.2-0.1.el7.noarch.rpm
python-keyczar-0.71c-2.el7.noarch.rpm
python-paramiko-2.1.1-0.9.el7.noarch.rpm
sshpass-1.06-1.el7.x86_64.rpm
yum install -y *.rpm ##將上面列出的安裝包所有安裝,防止有依賴性而安裝不了
cd /etc/ansible/
ls
ansible.cfg hosts roles
vim hosts ##主機清單,在文件的後面添加
[web] ##定義一個主機組
server1 ##將主機名加進去
[db]
server2
ansible server1 -m ping ## -m 執行模塊的名字,默認的是使用 command 模塊
ansible server1 -m ping -k ## -k 提示密碼使用sudo,sudo表示提權操做
注意:上面兩條命令不能交換操做的順序,就至關因而,-m 輸入 yes 之後,給了登陸的權限;下一次登陸就會要求輸入密碼登陸。
ssh-keygen ##生成祕鑰
ssh-copy-id server1 ##將生成的祕鑰發送給server1
root@server1's password:
ssh-copy-id server2 ##將生成的祕鑰發送給server2
root@server2's password:
ansible server1 -m ping
ansible server2 -m ping
ansible all -m ping
ansible web -m ping
ansible db -m ping
ansible-doc -l ##列出全部模塊
ansible-doc user ##查看user模塊的使用方法
在 server1上執行添加用的命令:ansible all -m user -a "name=wang password=fang"
在server2 上查看是否用戶添加成功: id hui
uid=1000(wang) gid=1000(wang) groups=1000(wang)
cat /etc/shadow ##密碼會以明文顯示
wang:fang:17979:0:99999:7:::
ssh-copy-id wang@server1 ##明文的密碼致使不能作免密認證
Permission denied, please try again.
passwd hui ##給server1和server2手動更改密碼,再作免密
ssh-copy-id wang@server1
wang@server1's password:
ssh-copy-id wang@server2
wang@server2's password:
ssh wang@server1 ##測試免密登錄
ssh hui@server2
vim /etc/sudoers ##添加用戶受權
92 wang ALL=(ALL) NOPASSWD: ALL
vim /etc/sudoers
92 wang ALL=(ALL) NOPASSWD: ALL
ansible all -m ping -u hui -b ##-b切換成root用戶
(1)查看主機名
ansible all -u wang -b -a "hostname"
(2)安裝並開啓服務
ansible server2 -u wang -b -m yum -a "name=httpd state=present"
rpm -q httpd ##查看已經安裝上
httpd-2.4.6-45.el7.x86_64
ansible server2 -u wang -b -m service -a "name=httpd state=started"
systemctl status httpd
(3)拷貝文件
在server1上操做:
vim index.html
www.westos.org
ansible server2 -u wang -b -m copy -a "src=index.html dest=/var/www/html/index.html"
在server2上查看:curl 172.25.19.2
www.westos.org
(4)建立軟鏈接
ansible server2 -u wang -b -m file -a "src=/etc/fstab dest=/tmp/fstab state=link"
在server2上查看: ll /tmp/fstab
lrwxrwxrwx 1 root root 10 Mar 24 10:45 /tmp/fstab -> /etc/fstab
ansible server2 -u wang -b -m file -a "dest=/tmp/fstab state=absent" ##刪除軟鏈接
ll /tmp/fstab
ls: cannot access /tmp/fstab: No such file or directory
(5)建立目錄
ansible server2 -u wang -b -m file -a "dest=/tmp/dir1/dir2 state=directory mode=755"
在server2上查看:
cd /tmp/
ls
dir1
cd dir1/
ls
dir2
(6)刪除目錄
ansible server2 -u wang -b -m file -a "dest=/tmp/dir1/dir2 state=absent" ##後面能夠加-f參數,指定多少個線程
在server2上查不到相應的目錄了
(7)在server2上安裝部署mysql
ansible server2 -m yum -a "name=MySQL-python state=present"
ansible server2 -m yum -a "name=mariadb-server state=present"
ansible server2 -m service -a "name=mariadb state=started"
ansible server2 -m mysql_user -a "name=wang password=fang priv=test.*:ALL state=present"
server2 | CHANGED => {
"changed": true,
"user": "hyg"
}
測試登陸一下數據庫:mysql -u wang -p fang test MariaDB [test]> quit Bye