ansible(一)

 

Ansible簡介

Ansible:Ansible的核心程序
Host Lnventory:記錄了每個由Ansible管理的主機信息,信息包括ssh端口,root賬號密碼,ip地址等等。能夠經過file來加載,能夠經過CMDB加載。
Playbooks:YAML格式文件,多個任務定義在一個文件中,使用時能夠統一調用,「劇本」用來定義那些主機須要調用那些模塊來完成的功能。
Core Modules:Ansible執行任何管理任務都不是由Ansible本身完成,而是由核心模塊完成;Ansible管理主機以前,先調用core Modules中的模塊,而後指明管理Host Lnventory中的主機,就能夠完成管理主機。
Custom Modules:自定義模塊,完成Ansible核心模塊沒法完成的功能,此模塊支持任何語言編寫。
Connection Plugins:鏈接插件,Ansible和Host通訊使用
ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric)的優勢,實現了批量系統配置、批量程序部署、批量運行命令等功能。
ansible是基於模塊工做的,自己沒有批量部署的能力。真正具備批量部署的是ansible所運行的模塊,ansible只是提供一種框架。主要包括:
(1)、鏈接插件connection plugins:負責和被監控端實現通訊;
(2)、host inventory:指定操做的主機,是一個配置文件裏面定義監控的主機;
(3)、各類模塊核心模塊、command模塊、自定義模塊;
(4)、藉助於插件完成記錄日誌郵件等功能;
(5)、playbook:劇本執行多個任務時,非必需可讓節點一次性運行多個任務。python

 

 

Ansible的特性和優勢

特性

(1)、no agents:不須要在被管控主機上安裝任何客戶端;
(2)、no server:無服務器端,使用時直接運行命令便可;
(3)、modules in any languages:基於模塊工做,可以使用任意語言開發模塊;
(4)、yaml,not code:使用yaml語言定製劇本playbook;
(5)、ssh by default:基於SSH工做;
(6)、strong multi-tier solution:可實現多級指揮。shell

優勢

(1)、輕量級,無需在客戶端安裝agent,更新時,只需在操做機上進行一次更新便可;
(2)、批量任務執行能夠寫成腳本,並且不用分發到遠程就能夠執行;
(3)、使用python編寫,維護更簡單,ruby語法過於複雜;
(4)、支持sudo。ruby

 

Ansible的配置

Ansible讀取配置文件的順序:
ansible.cfg 位於當前位置
ANSIBLE_CONFIG 一個環境變量
.ansible.cfg 位於家目錄下
/etc/ansible/ansible.cfg服務器

配置文件詳解框架

#inventory = /etc/ansible/hosts #forks = 5 #sudo_user = root #remote_port = 22

Ansible的優化

1. 開啓ssh長鏈接:
ansible模式是使用ssh和被管機器進行通訊的,因此ansible對ssh的依賴很是強,那麼咱們就從ssh入手來優化ansible 在openssh5.6之後的版本就支持了Multiplexing,若是咱們中控機中的ssh -v版本大於5.6那麼咱們能夠直接在ansible.cfg文件中設置ssh長鏈接便可
ssh_args = -C -o ControlMaster=auto -o ControlPersist=5d
ControlPersisit=5d 這個參數是設置整個長鏈接保持時間這裏設置爲5天,若是開啓後,經過ssh連接過的設備都會在當前ansible\/cp目錄下面生成一個socket文件,也能夠經過netstat命令查看,會發現有一個ESTABLISHED狀態的鏈接一直與遠端設備進行着TCP鏈接運維

2.開啓accelerate模式
accelerate是使用python程序在被管機器上運行一個守護進程,而後ansible會經過這個守護進程監聽端口進行通訊。
開發方法 只須要在playbook中配置accelerate: true就能夠了,可是開啓這個功能須要在中控機和被管機器上面都安裝python-keyczar軟件包,下面是在ansible.cfg中定義一些accelerate參數,列如遠程機器的監聽端口以及一些timeout的設置,固然這些參數也能夠在playbook的時候再定義。ssh

[accelerate] accelerate_port= 5099 accelerate_timeout=30 accelerate_connect_timeount=5.0

沒有性能瓶頸的狀況下 不推薦使用。socket

 

3. Ansible取消交互工具

如何去除ssh無交互添加known_hosts配置文件/etc/ansible/ansible.cfg,打開註釋就OK。性能

# uncomment this to disable SSH key host checking
host_key_checking = False

取消ssh的yes和no的交互

cat > ~/.ssh/config << end UserKnownHostsFile /dev/null ConnectTimeout 15 StrictHostKeyChecking no end

或者直接ssh是增長一個參數

ssh -o StrictHostKeyChecking=no root@192.168.1.1

 

Ansible的模塊

1. ping模塊

ansible all -m ping 第二個參數是模塊名字,all表明全部的ip

2. command模塊

ansible 192.168.48.129  -m command -a "w"

3. shell模塊

ansible –i 1.txt all  -m shell  -a "w" 
Command模塊和shell模塊都是遠程執行命令的模塊,可是推薦使用shell模塊,當咱們須要在字符串中使用特殊字符的時候,使用shell就不須要轉義。

4. copy模塊

ansible 192.168.48.129 -m copy -a "src=/root/1.py dest=/home/admin/1.py owner=root group=root mode=0755" 
192.168.48.129 | SUCCESS => { "changed": true, "checksum": "bc917730b55d2e3d16fda4d867596036dc184b42", "dest": "/home/admin/1.py", "gid": 0, "group": "root", "md5sum": "cc07adb0e56175fa165a2a741eee8f4c", "mode": "0755", "owner": "root", "size": 510, "src": "/root/.ansible/tmp/ansible-tmp-1517479393.27-183914298703434/source", "state": "file", "uid": 0 }

5. cron模塊

[root@localhost ~]# ansible 192.168.48.129 -m cron -a "name='ajing' user=admin job='touch /home/admin/1.txt' minute=1 hour=1 day=1 month=1 weekday=5" 
192.168.48.129 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "ajing" ] } 129服務器上查看結果: [admin@localhost ~]$ crontab  -l #Ansible: ajing
1 1 1 1 5 touch /home/admin/1.txt

cron模塊刪除定時任務

ansible all -m cron -a "name='ajing' state=absent user=admin" 刪除任務是主須要把state變成absent就能夠了 minute, hour, day, month, weekday 默認不寫時表示*

6. yum模塊

[root@localhost ~]# ansible 192.168.48.129 -m yum -a 'name=gcc'
192.168.48.129 | SUCCESS => { "changed": false, "msg": "", "rc": 0, "results": [ "gcc-4.8.5-11.el7.x86_64 providing gcc is already installed" ] } name直接寫須要安裝的包名就能夠了。

指定ip或者指定ip列表文件執行命令

ansible all -i "10.79.192.125," -m ping ansible-playbook -i "10.168.101.179," test.yml ansible -i 1.txt test.yml

須要在咱們返回結果中去使用本地ip, 可使用以下技巧

[root@localhost ~]# ansible -i 1.txt all -m shell -a "echo {{inventory_hostname}}" 
192.168.48.129 | SUCCESS | rc=0 >>
192.168.48.129 Inventory_hostname 表示的是客戶端的ip

7. setup模塊

使用setup獲取ip地址以及主機名使用filter過濾等等。

[root@localhost ~]# ansible -i 1.txt all -m setup -a 'filter=ansible_default_ipv4'
192.168.48.129 | SUCCESS => { "ansible_facts": { "ansible_default_ipv4": { "address": "192.168.48.129", "alias": "ens33", "broadcast": "192.168.48.255", "gateway": "192.168.48.2", "interface": "ens33", "macaddress": "00:0c:29:be:cf:4d", "mtu": 1500, "netmask": "255.255.255.0", "network": "192.168.48.0", "type": "ether" } }, "changed": false }

8. script模塊

遠程執行ansible本地腳本,至關於scp+shell命令的組合。 ansible -i 1.txt all -m script -a  "1.sh" 不能寫成sh 1.sh  寫成sh就是shell模塊,並且報錯。
相關文章
相關標籤/搜索