python-ansible

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"

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息