1、簡介 node
一、ansible 簡介python
ansible官方的title是「Ansible is Simple IT Automation」——簡單的自動化IT工具。這個工具的目標有這麼幾項:自動化部署APP;自動化管理配置項;自動化的持續交付;自動化的(AWS)雲服務管理。mysql
全部的這幾個目標本質上來講都是在一個臺或者幾臺服務器上,執行一系列的命令而已,而若是你要管理的服務器是成千上萬臺的,那你用一臺服務器去管理控制這大批量的服務器,勢必會形成這臺主控機的至關可觀的資源消耗和性能的低下(即便可使用 ansible -f 參數並行執行),這時就須要有種 p2p 的概念,讓每一臺被同步、配置的服務器也能夠作爲一臺 ansible 中控機去同步配置其它的服務器。linux
Ansible 無需安裝服務端和客戶端,只要 SSH 便可。這意 味着,任何一臺裝有 Ansible 的機器均可以成爲強大的管理端。Ansible 上手十分快,用 Ad-Hoc 能夠應付簡單的管理任務,麻煩點的也能夠定義 Playbook 文 件來搞定。web
二、強大的自動化運維工具sql
強大的自動化工具備:ansible,puppet,saltstackshell
puppet與saltstack這2個軟件都須要安裝客戶端,而saltstack與ansible很類似,都是屬於python流的,但saltstack不是很穩定,因此ansible的搜索率是saltstack的3倍也不是沒有緣由的。puppet雖然穩定,但命令執行的時候,須要配置模塊兒,很是麻煩,並且還須要安裝客戶端,若是公司和別的公司有合做關係的話,很顯然,安裝客戶端是一個不得不考慮的因素;所以,ansible在性能方面並不弱於這兩個工具,並且使用還並不繁瑣,關鍵ansible是基於paramiko 開發的,paramiko是一個純Python實現的ssh協議庫。ansible不須要在遠程主機上安裝client/agents,由於它是基於ssh來和遠程主機通信的。apache
三、ansible的特色vim
(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:可實現多級指揮;
2、ansible基本使用
一、安裝ansible
[root@localhost ~]# yum install -y ansible
二、主要文件
[root@DBSlave ~]# ls /etc/ansible/ ansible.cfg #主配置文件,可不修改 hosts #添加需操做的主機組
三、ansible使用格式
ansible <host-pattern> [-f forks] [-m module_name] [-a args] host-pattern # 能夠是all,或者配置文件中的主機組名 -f forks # 指定並行處理的進程數 -m module # 指定使用的模塊,默認模塊爲command -a args # 指定模塊的參數 若是你有多臺服務器的話,想併發運行,可使用-f參數,默認是併發5
四、查看各模塊的使用方法
ansible-doc [options] [modules] :Show Ansible module documentation -l 列出全部的ansible模塊 -s 列出該模塊的相關指令
五、首次使用ansible
(1)安裝ansible
[root@localhost ~]# yum install -y ansible
(2)設置主機組(host-pattern)
# vim /etc/ansible/hosts [web servers] 192.168.200.211 192.168.200.212 192.168.200.213 192.168.200.214 [db servers] 192.168.200.215 192.168.200.216
(3)建立SSH公鑰與私鑰
[root@localhost ~]# ssh-keygen
(4)將公鑰文件複製到目標服務器 [注: ssh-copy-id 把公鑰追加到遠程主機的 .ssh/authorized_key 上.]
[root@localhost ~]# ssh-copy-id root@192.168.200.211 [root@localhost ~]# ssh-copy-id root@192.168.200.212 [root@localhost ~]# ssh-copy-id root@192.168.200.213 ...
(5)鏈接與驗證測試
[root@localhost ~]# ansible -i /etc/ansible/hosts all -m ping
(6)模塊兒
查看各模塊的使用方法
ansible-doc [options] [modules] :Show Ansible module documentation -l 列出全部的ansible模塊 -s 列出該模塊的相關指令 能夠直接使用 ansible-doc 模塊兒名 來查看模塊兒的使用,如 # ansible-doc htpasswd
幾個示例
ansible all -a "/bin/echo hello" (不寫-m,默認模塊是shell) ansible all -m command -a "/bin/echo hello, world" ansible all -m shell -a "ping baidu.com -c 1" ansible all -m ping # ping操做 -i 參數可不指定,默認找 /etc/ansible/hosts ansible "web servers" -a 'date' (可省略-m command) # 執行date命令 ansible "db servers" -m copy -a 「src=/root/ansible.rpm dest=/tmp/」 # 複製文件 ansible all -m cron -a ‘name="custom job" minute=*/3 hour=* day=* month=* weekday=* job="/usr/sbin/ntpdate 192.168.200.16"’ # 配置crontab任務 ansible all -m user -a 'name=mysql shell=/sbin/nologin createhome=no' ansible all -m user -a "name=tester remove=yes state=absent" ansible all -m group -a "name=mysql gid=36 system=yes" # 建立組 ansible all -m yum -a "name=httpd state=present" # 經過yum安裝httpd ansible all -m service -a "name=httpd state=started enabled=yes" # 配置服務開啓啓動 ansible test -m file -a 'dest=/root/test.txt owner=text group=text mode=644 state=touch' ansible test -m file -a 'src=/root/test.txt dest=/tmp/test.txt mode=440 owner=test group=test state=link' 建立遞歸文件夾 # ansible 192.168.200.225 -m file -a "dest=/tmp/a/b/c owner=root group=root mode=755 state=directory" 192.168.200.225 | success >> { "changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "root", "path": "/tmp/a/b/c", "size": 4096, "state": "directory", "uid": 0 } 查看結果: 192.168.200.225 | success | rc=0 >> /tmp |-- a | `-- b | `-- c `-- hsperfdata_root `-- 14306 4 directories, 1 file
經常使用模塊兒
經常使用的模塊:copy、command、service、yum、apt、file、raw、shell、script、cron、user、state、template、
ansible -i /etc/ansiblehosts all -m 'service' -a 'name=httpd state=stoped' ansible -m yum -a 'name=gcc state=present'
yum模塊經常使用來安裝軟件
service模塊經常使用來對服務的開關操做
shell模塊能夠用來執行命令以及腳本
raw和command、shell相似,可是它能夠傳遞管道
3、YAML語法
YAML Ain't Markup Language,即YAML不是XML。不過,在開發的這種語言時,YAML的意思實際上是:"Yet Another Markup Language"(還是一種標記語言)。
YAML的語法和其餘高階語言相似,而且能夠簡單表達清單、散列表、標量等數據結構。其結構(Structure)經過空格來展現,序列(Sequence)裏的項用"-"來表明,Map裏的鍵值對用":"分隔。下面是一個示例。
YAML文件擴展名一般爲.yaml,如example.yaml。
name: John Smith age: 41 gender: Male spouse: name: Jane Smith age: 37 gender: Female children: - name: Jimmy Smith age: 17 gender: Male - name: Jenny Smith age 13 gender: Female
4、ansible playbook(劇本)
playbook使用:ansible-playbook test.yaml
playbook是由一個或多個「play」組成的列表。play的主要功能在於將事先歸併爲一組的主機裝扮成事先經過ansible中的task定義好的角色。從根本上來說,所謂task無非是調用ansible的一個module。將多個play組織在一個playbook中,便可以讓它們聯同起來按事先編排的機制同唱一臺大戲
下面就是一個只包含了一個play的playbook,在寫playbook的時候,必定要記住在 hosts,yum(模塊兒名)等後帶空格,不然會報錯
#這個是你選擇的主機 - hosts: webservers #這個是變量 vars: http_port: 80 max_clients: 200 #遠端的執行權限 remote_user: root tasks: #利用yum模塊來操做 - name: ensure apache is at the latest version yum: pkg=httpd state=latest - 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 #這裏的restart apache 和上面的觸發是配對的。這就是handlers的做用。至關於tag handlers: - name: restart apache service: name=httpd state=restarted
一、HOSTS和Users
playbook中的每個play的目的都是爲了讓某個或某些主機以某個指定的用戶身份執行任務。
hosts用於指定要執行指定任務的主機,其能夠是一個或多個由冒號分隔主機組;
remote_user則用於指定遠程主機上的執行任務的用戶。如上面示例中的
-hosts: webnodes remote_user: root
不過,remote_user也可用於各task中。也能夠經過指定其經過sudo的方式在遠程主機上執行任務,其可用於play全局或某任務;此外,甚至能夠在sudo時使用sudo_user指定sudo時切換的用戶。
- hosts: webnodes remote_user: root tasks: - name: test connection ping: remote_user: root sudo: yes
二、任務列表和cation
play的主體部分是task list。task list中的各任務按次序逐個在hosts中指定的全部主機上執行,即在全部主機上完成第一個任務後再開始第二個。在運行自下而下某playbook時,若是中途發生錯誤,全部已執行任務都將回滾,所以,在更正playbook後從新執行一次便可。
task的目的是使用指定的參數執行模塊,而在模塊參數中可使用變量。模塊執行是冪等的,這意味着屢次執行是安全的,由於其結果均一致。
每一個task都應該有其name,用於playbook的執行結果輸出,建議其內容儘量清晰地描述任務執行步驟。若是未提供name,則action的結果將用於輸出。
定義task的可使用「action: module options」或「module: options」的格式,推薦使用後者以實現向後兼容。若是action一行的內容過多,也中使用在行首使用幾個空白字符進行換行。
tasks: - name: make sure apache is running service: name=httpd state=running
在衆多模塊中,只有command和shell模塊僅須要給定一個列表而無需使用「key=value」格式,例如:
tasks: - name: disable selinux command: /sbin/setenforce 0
若是命令或腳本的退出碼不爲零,可使用以下方式替代:
tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand || /bin/true
或者使用ignore_errors來忽略錯誤信息:
tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand ignore_errors: True
三、handlers
用於當關注的資源發生變化時採起必定的操做。
「notify」這個action可用於在每一個play的最後被觸發,這樣能夠避免屢次有改變發生時每次都執行指定的操做,取而代之,僅在全部的變化發生完成後一次性地執行指定操做。在notify中列出的操做稱爲handler,也即notify中調用handler中定義的操做。
- name: template configuration file template: src=template.j2 dest=/etc/foo.conf notify: - restart memcached - restart apache
handler是task列表,這些task與前述的task並無本質上的不一樣。
handlers: - name: restart memcached service: name=memcached state=restarted - name: restart apache service: name=apache state=restarted
5、playbook案例
一、heartbeat.yaml
heartbeat.yaml - hosts: hbhosts remote_user: root tasks: - name: ensure heartbeat latest version yum: name=heartbeat state=present - name: authkeys configure file copy: src=/root/hb_conf/authkeys dest=/etc/ha.d/authkeys - name: authkeys mode 600 file: path=/etc/ha.d/authkeys mode=600 notify: - restart heartbeat - name: ha.cf configure file copy: src=/root/hb_conf/ha.cf dest=/etc/ha.d/ha.cf notify: - restart heartbeat handlers: - name: restart heartbeat service: name=heartbeat state=restarted
二、corosync.yaml
- hosts: hanodes #指定要執行任務的主機,可由冒號分隔主機組 remote_user: root #指定遠程主機上執行任務的用戶 vars: #定義以下2個變量 crmsh: crmsh-1.2.6.4.el6.x86_64.rpm pssh: pssh-2.3.1-2.el6.x86_64.rpm tasks: #指定需執行的任務列表,每一個task都有其name和使用的模塊及參數 - name: test connection ping: #ping模塊無需執行參數 remote_user: jason #在task中指定遠程主機上執行任務的用戶 sudo: yes #使用sudo在遠程主機上執行任務 - name: corosync installing yum: name=corosync state=present - name: pacemaker installing #定義一個軟件安裝任務 yum: name=pacemaker state=present #使用yum安裝,並配置需安裝的軟件名(name),及狀態(state) - name: crmsh rpm packages copy: src=/ansible/corosync/packages/{{ crmsh }} dest=/tmp/{{ crmsh }} - name: pssh rpm packages copy: src=/ansible/corosync/packages/{{ pssh }} dest=/tmp/{{ pssh }} - name: crmsh installing command: yum -y reinstall /tmp/{{ crmsh }} /tmp/{{ pssh }} - name: authkey configure file copy: src=/ansible/corosync/conf/authkey dest=/etc/corosync/authkey - name: authkey mode 400 #定義一個文件權限設置任務 file: path=/etc/corosync/authkey mode=400 notify: #定義一個通知,當此任務執行時,能夠激發響應的handler - restart corosync - name: corosync.conf configure file copy: src=/ansible/corosync/conf/corosync.conf dest=/etc/corosync/corosync.conf tags: - conf notify: - restart corosync - name: ensure the corosync service startup on boot service: name=corosync state=started enabled=yes handlers: #定義當關注的資源發生變化時,需採起的操做 - name: restart corosync #定義一個服務重啓任務 service: name=corosync state=restarted