python-ansible


http://sofar.blog.51cto.com/353572/1579894

http://www.aikaiyuan.com/6299.html

http://docs.ansible.com/modules_by_category.html

http://www.ansible.cn/docs/

http://zh.wikipedia.org/wiki/Cowsay

http://www.poluoluo.com/server/201409/303039.html

http://www.kiratechblog.com/?p=476

自從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來和遠程主機通訊的。

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包,部署上簡單到發指。

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 。

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"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM