http://sofar.blog.51cto.com/353572/1579894html
http://www.aikaiyuan.com/6299.htmljava
http://docs.ansible.com/modules_by_category.htmlpython
http://www.ansible.cn/docs/git
http://zh.wikipedia.org/wiki/Cowsaygithub
http://www.poluoluo.com/server/201409/303039.htmlweb
http://www.kiratechblog.com/?p=476shell
自從CFEngine 在1993年被Mark Burgess開發出來以後,配置管理工具就層出不窮了。像puppet 和chef,系統管理員能夠有不少選擇。Ansible 是一個新的配置管理工具,與其餘工具不一樣的是,其餘管理工具注重的是完整性和可配置性,而Ansible注重的是簡單性和易用性。
官方的title是「Ansible is Simple IT Automation」——簡單的自動化IT工具。這個工具的目標有這麼幾項:讓咱們自動化部署APP;自動化管理配置項;自動化的持續交付;自動化的(AWS)雲服務管理。
那麼fabric和ansible有什麼差異呢?簡單來講fabric像是一個工具箱,提供了不少好用的工具,用來在Remote執行命令,而Ansible則是提供了一套簡單的流程,你要按照它的流程來作,就能輕鬆完成任務。這就像是庫和框架的關係同樣。
固然,它們之間也是有共同點的——都是基於 paramiko 開發的。這個paramiko是什麼呢?它是一個純Python實現的ssh協議庫。所以fabric和ansible還有一個共同點就是不須要在遠程主機上安裝client/agents,由於它們是基於ssh來和遠程主機通信的。apache
ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric)的優勢,實現了批量系統配置、批量程序部署、批量運行命令等功能。ansible是基於模塊工做的,自己沒有批量部署的能力。真正具備批量部署的是ansible所運行的模塊,ansible只是提供一種框架。主要包括:
(1)、鏈接插件connection plugins:負責和被監控端實現通訊;
(2)、host inventory:指定操做的主機,是一個配置文件裏面定義監控的主機;
(3)、各類模塊核心模塊、command模塊、自定義模塊;
(4)、藉助於插件完成記錄日誌郵件等功能;
(5)、playbook:劇本執行多個任務時,非必需可讓節點一次性運行多個任務。
ansible是一個python package,是個徹底的unpack and play軟件,對客戶端惟一的要求是有ssh有python,而且裝了python-simplejson包,部署上簡單到髮指。json
ansible.cfg。ansible執行的時候會按照如下順序查找配置項:
* ANSIBLE_CONFIG (環境變量)
* ansible.cfg (當前目錄下)
* .ansible.cfg (用戶家目錄下)
* /etc/ansible/ansible.cfg
在ansible中還有一個Module(模塊)的概念,這個模塊能夠理解爲一個庫,全部的命令都須要經過模塊來執行
這是一條ad-hoc命令——臨時執行命令,ad-hoc是ansible裏的一個概念, 在上面命令中就是 -a
ad hoc——臨時的,在ansible中是指須要快速執行,而且不須要保存的命令。說白了就是執行簡單的命令——一條命令。對於複雜的命令後面會說playbook。
上面的ad hoc是指執行一條臨時的不須要保存的命令,那麼複雜的命令怎麼執行呢?所以也就有了playbook這個命令: ansible-playbook 。windows
playbook的組成:playbook是由一個或多個「play」組成的列表,可讓它們聯同起來按事先編排的機制執行;所謂task無非是調用ansible的一個module,而在模塊參數中可使用變量;模塊執行是冪等的,這意味着屢次執行是安全的,由於其結果均一致;
執行模型:task list中的各任務按次序逐個在hosts中指定的全部主機上執行,即在全部主機上完成第一個任務後再開始第二個。在順序運行某playbook時,若是中途發生錯誤,全部已執行任務都將回滾,所以,在修改playbook後從新執行一次便可;
task組成:每一個task都應該有其name,用於playbook的執行結果輸出,建議其內容儘量清晰地描述任務執行步驟。若是未提供name,則action的結果將用於輸出;
notify指定handler的執行機制:「notify」這個action可用於在每一個play的最後被觸發,在notify中列出的操做稱爲handler,僅在全部的變化發生完成後一次性地執行指定操做。
默認playbook是進行客戶端fact蒐集,通常若是你配置裏沒有使用fact的話,能夠關閉這樣就能減小運行時間
Intro to Playbooks
Introduction To Ad-Hoc Commands
ad hoc adj 特別的,臨時
[root@084-monitor bin]# cat /var/www/html/scripts/newmonitor/aa.yml
---
- hosts: 192.168.2.225
remote_user: root
gather_facts: False
tasks:
- name: pong
ping:
- name: free
command : free
---
- hosts: web
remote_user: root
tasks:
- name: ping host
ping:
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted
能夠用下面的time測試加與不加gather_facts的效果,
[root@084-monitor ~]# time ansible-playbook shell.yml
從本地到遠程是copy模塊
從遠程到本地是fetch模塊
[root@084-monitor ~]# ansible 192.168.2.222 -m fetch -a "src=/usr/local/src/jdk1.6.tar.gz dest=/root/"
192.168.2.222 | success >> {
"changed": true,
"dest": "/root/192.168.2.222/usr/local/src/jdk1.6.tar.gz",
"md5sum": "321b6121ff8d59f802dd64cef2452d14",
"remote_md5sum": "321b6121ff8d59f802dd64cef2452d14"
}
[root@084-monitor ~]# ansible web -m shell -a "ss -ln|grep 80"
若是你有多臺服務器的話,想併發運行,可使用-f參數,默認是併發5
sudo esay_install ansible
# 或者
sudo pip install ansible
-m 模塊
shell, 默認是此模塊,會處理一些變量,管道,重定向
command, 只能執行單個命令
Python 2.6 或更高版本
Paramiko(Python的SSH模塊)
PyYAML(Python的YAML解析器)
Jinja2(Python的模板引擎)
更多模塊能夠參考:
#ansible-doc –l
受控節點若是是Python 2.4 或 Python 2.5 ,則需額外安裝 Simplejson 模塊。到Python的2.6或以上版本,就則內置了 Simplejson模塊,不須要額外安裝任何其它依賴。值得欣慰的是,目前主流的服務器上內置的Python版本絕多數都是 Python 2.6 以上版本。
各自不一樣的實現
java yaml
python yaml
ruby yaml
Ruby和YAML的聯繫,甚至比Java與XML的聯繫還要緊密。Ruby把YAML用到了和數據相關的方方面面。配置文件的約定格式是YAML。同時YAML仍是Ruby的文本序列化格式,就像XML是SDO的文本序列化格式同樣。
不誇張的說,YAML是Ruby中流動的血液。
因爲實現簡單,解析成本很低,YAML特別適合在腳本語言中使用。列一下現有的語言實現:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript。除了Java,其餘都是腳本語言.
YAML比較適合作序列化。由於它是宿主語言數據類型直轉的。
YAML作配置文件也不錯。好比Ruby on Rails的配置就選用的YAML。對ROR而言,這很天然,也很省事.
因爲兼容性問題,不一樣語言間的數據流轉建議如今不要用YAML.
We use YAML because it is easier for humans to read and write than other common data formats like XML or JSON. Further, there are libraries available in most programming languages for working with YAML.
默認狀況下Ansible會讀取 /etc/ansible 文件裏的主機列表,內容爲ini格式的
ini格式
xml格式
json格式
ini文件(Initialization file),這種類型的文件中一般存放的是一個程序的初始化信息。ini文件由若干個節(Section)組成,每一個Section由若干鍵(Key)組成,每一個Key能夠賦相應的值。讀寫ini文件實際上就是讀寫某個的Section中相應的Key的值,而這隻要藉助幾個函數便可完成。 爲何要用INI文件?若是咱們程序沒有任何配置文件時,這樣的程序對外是全封閉的,一旦程序須要修改一些參數,必需要修改程序代碼自己並從新編譯,這樣很很差,因此要用配置文件,讓程序出廠後還能根據須要進行必要的配置;配置文件有不少如INI配置文件,XML配置文件,還有就是可使用系統註冊表等。 本文主要是爲讀者在實現讀寫INI配置文件模塊以前,提供有關INI文件的格式信息。 「.INI 」就是英文 「initialization」的頭三個字母的縮寫;固然INI file的後綴名也不必定是".ini"也能夠是".cfg",".conf 」或者是".txt"。 INI文件的格式很簡單,最基本的三個要素是:parameters,sections和comments。 INI所包含的最基本的「元素」就是parameter;每個parameter都有一個name和一個value,name和value是由等號「=」隔開。name在等號的左邊。
yaml在python上的具體實現:PyYaml
YAML被不少人認爲是能夠超越xml和json的文件格式。對比xml,除了擁有xml的衆多優勢外,它足夠簡單,易於使用。而對於json,YAML能夠寫成規範化的配置文件(這我認爲是高於json不少的優勢,用json寫配置文件會讓人發瘋)。
任何轉義失效的地方均可能發生注入。幸運的是,許多框架(至少有Pyramid和Flask)使用了markupsafe庫,它能智能地幫助避免這個問題。
markupsafe提供一個單一的類, Markup ,繼承自 unicode . Markup(u'Hello!') ,會產生一個行爲上至關像字符串的對象。類方法 Markup.escape 工做方式相同,但會轉義通過包裹的字符串中的任意HTML字符。
Jinja2是基於python的模板引擎,功能比較相似於於PHP的smarty,J2ee的Freemarker和velocity。 它能徹底支持unicode,並具備集成的沙箱執行環境,應用普遍。jinja2使用BSD受權。
果真,仍是須要用到模板,不能老是直接在Response中寫上長串的html代碼。
python中的模板引擎主要有mako, genshi, jinjia等。
mako 主要特色在於模板裏面 能夠比較方便的嵌入Python代碼,並且執行效率一流;
genshi 的特色在於基於 xml, 很是簡單易懂的模板語法,對於熱愛xhtml的朋友來講是很好的選擇,同時也能夠嵌入Python 代碼,實現一些複雜的展示邏輯;
jinja 和 genshi 同樣擁有很簡單的模板語法,只是不 依賴於 xml 的格式,一樣很適合設計人員直接進行模板的製做,同時也能夠嵌入Python 代碼實現一些複雜的展示邏輯。
Python 中使用SSH須要用到OpenSSH,而OpenSSH依賴於paramiko模塊,而paramiko模塊又依賴於pycrypto模塊,所以要在 Python中使用SSH,則須要先安裝模塊順序是:pycrypto -> ecdsa -> paramiko
看不少博客沒有提到這個庫,但我執行paramiko時,提示找不到ecdsa模塊。
在python中,我理解的simplejson模塊就是主要用於將python數據類型轉換爲json類型。
控制服務器(Master)須要安裝Python2.6/7,windows上沒法使用ansible。被管理的服務器(Managed Node)須要安裝Python2.4以上的版本,若是低於2.5,須要安裝python-simplejson。
yum -y install python-simplejson
對於鏈接多臺服務器,進行復雜的鏈接操做特別有幫助。批量操做機器
安裝paramiko有兩個先決條件,python和另一個名爲PyCrypto的模塊。
一般安裝標準的python模塊,只須要在模塊的根目錄下運行:
python setup.py build
python setup.py install
ansible Site01 -u root -k -m ping 回車後會提示你輸入root密碼,而後會打印以下結果: 若是你使用密鑰方式登陸SSH,去掉 -k 參數便可。能夠爲Ansible設置一個特定的用戶,全部操做均以此用戶來執行。甚至能夠爲每一個「受控節點」設置各自不一樣的用戶。 [root@084-monitor ~]# ansible test -m file -a 'path=/tmp/ksops state=directory mode=0755 owner=nobody' 192.168.2.250 | success >> { "changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "nobody", "path": "/tmp/ksops", "size": 4096, "state": "directory", "uid": 99 } [root@084-monitor ~]# ansible test -m copy -a 'src=/root/ssh-conn dest=/tmp/ mode=0755 owner=root' 192.168.2.250 | success >> { "changed": true, "dest": "/tmp/ssh-conn", "gid": 0, "group": "root", "md5sum": "dbdff0f3ef913dd399cd52608c27cdf0", "mode": "0755", "owner": "root", "size": 1148, "src": "/root/.ansible/tmp/ansible-tmp-1421140306.4-262938535704591/source", "state": "file", "uid": 0 }
先作免密碼登陸,有幾臺機器就scp幾回公鑰 ssh-keygen -t rsa -P '' scp id_rsa.pub 192.168.2.84:/root/.ssh/authorized_keys [root@084-monitor ansible]# bash ansib [root@084-monitor ansible]# cat ansib wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz tar zxvf setuptools-7.0.tar.gz cd setuptools-7.0 python setup.py install cd ../ wget --no-check-certificate https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz tar zxvf pycrypto-2.6.1.tar.gz cd pycrypto-2.6.1 yum install python-devel python setup.py install cd ../ wget --no-check-certificate http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz tar zxvf yaml-0.1.5.tar.gz cd yaml-0.1.5 ./configure --prefix=/usr/local make --jobs=`cat /proc/cpuinfo|grep processor|wc -l` cd ../ wget --no-check-certificate https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz tar zxvf PyYAML-3.11.tar.gz cd PyYAML-3.11 python setup.py install cd ../ wget --no-check-certificate https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz tar zxvf MarkupSafe-0.9.3.tar.gz cd MarkupSafe-0.9.3 python setup.py install cd ../ wget --no-check-certificate https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gz tar zxvf Jinja2-2.7.3.tar.gz cd Jinja2-2.7.3 python setup.py install cd ../ wget --no-check-certificate https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.11.tar.gz tar zxvf ecdsa-0.11.tar.gz cd ecdsa-0.11 python setup.py install cd ../ wget --no-check-certificate https://pypi.python.org/packages/source/p/paramiko/paramiko-1.15.1.tar.gz tar zxvf paramiko-1.15.1.tar.gz cd paramiko-1.15.1 python setup.py install cd ../ wget --no-check-certificate https://pypi.python.org/packages/source/s/simplejson/simplejson-3.6.5.tar.gz tar zxvf simplejson-3.6.5.tar.gz cd simplejson-3.6.5 python setup.py install cd ../ wget --no-check-certificate https://github.com/ansible/ansible/archive/v1.7.2.tar.gz tar zxvf v1.7.2.tar.gz cd ansible-1.7.2/ python setup.py install cd ../ mkdir -p /etc/ansible cat <<EOF > /etc/ansible/ansible.cfg [defaults] hostfile=/etc/ansible/hosts EOF cat <<EOF > /etc/ansible/hosts [aa] 192.168.2.220 192.168.2.221 192.168.2.222 192.168.2.223 192.168.2.224 EOF [root@084-monitor ansible]# ansible aa -m command -a 'free' 192.168.2.224 | success | rc=0 >> total used free shared buffers cached Mem: 1020132 953112 67020 0 134156 541024 -/+ buffers/cache: 277932 742200 Swap: 1675256 6260 1668996 192.168.2.223 | success | rc=0 >> total used free shared buffers cached Mem: 7999632 7717876 281756 0 219012 6540924 -/+ buffers/cache: 957940 7041692 Swap: 3145720 32772 3112948 192.168.2.220 | success | rc=0 >> total used free shared buffers cached Mem: 3923760 3818168 105592 0 239264 2671504 -/+ buffers/cache: 907400 3016360 Swap: 3145720 132888 3012832 192.168.2.221 | success | rc=0 >> total used free shared buffers cached Mem: 1019820 723684 296136 0 138636 104360 -/+ buffers/cache: 480688 539132 Swap: 1675256 736 1674520 192.168.2.222 | success | rc=0 >> total used free shared buffers cached Mem: 1020296 951344 68952 0 69916 218880 -/+ buffers/cache: 662548 357748 Swap: 1675256 161188 1514068
批量部署 在有不少服務器,而且須要相同環境時,批量部署就很簡單與方便了。不用專門每次都去下載wget,直接使用自帶的curl就能夠了
[root@84-monitor ~]# vi /etc/ansible/hosts [root@84-monitor ~]# ansible mfs -m shell -a "curl 'http://ppa.moosefs.com/RPM-GPG-KEY-MooseFS' > /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS" 192.168.2.233 | success | rc=0 >> % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 105 1796 105 1796 0 0 1677 0 0:00:01 0:00:01 --:--:-- 7741 192.168.2.232 | success | rc=0 >> % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 105 1796 105 1796 0 0 905 0 0:00:01 0:00:01 --:--:-- 7610 [root@84-monitor ~]# ansible mfs -m shell -a "curl 'http://ppa.moosefs.com/MooseFS-stable-rhsysv.repo' > /etc/yum.repos.d/MooseFS.repo" 192.168.2.232 | success | rc=0 >> % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 169 169 169 169 0 0 254 0 --:--:-- --:--:-- --:--:-- 725 192.168.2.233 | success | rc=0 >> % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 169 169 169 169 0 0 253 0 --:--:-- --:--:-- --:--:-- 725
[root@84-monitor ~]# ansible wo -m shell -a "sed -i '/ntpdate/d' /var/spool/cron/root"
[root@84-monitor ~]# ansible wo -m shell -a "echo '0 20 * * * /usr/sbin/ntpdate 192.168.2.1 && /sbin/clock -w > /dev/null 2>&1' >>/var/spool/cron/root"