Ansible使用及YAML語法介紹
一、簡介
1、ansible 簡介
Ansible官方的 title 是「Ansible is Simple IT Automation」——簡單的自動化IT工具。這個工具的目標有這麼幾項:自動化部署APP;自動化管理配置項;自動化的持續交付;自動化的(AWS)雲服務管理。
所有的這幾個目標本質上來說都是在一個台或者幾台伺服器上,執行一系列的命令而已,而如果你要管理的伺服器是成千上萬台的,那你用一台伺服器去管理控制這大批量的伺服器,勢必會造成這台主控機的相當可觀的資源消耗和性能的低下(即使可以使用 Ansible -f 參數並行執行),這時就需要有種 p2p 的概念,讓每一台被同步、配置的伺服器也可以做為一台 ansible 中控機去同步配置其它的伺服器。
Ansible 無需安裝服務端和客戶端,只要 SSH 即可。這意 味著,任何一台裝有 Ansible 的機器都可以成為強大的管理端。Ansible 上手十分快,用 Ad-Hoc 可以應付簡單的管理任務,麻煩點的也可以定義 Playbook 文 件來搞定。
2、強大的自動化運維工具
強大的自動化工具有:Ansible,Puppet,Saltstack
Puppet 與 Saltstack 這2個軟體都需要安裝客戶端,而 Saltstack 與 Ansible很相似,都是屬於 Python 流的,但 Saltstack 不是很穩定,所以 Asible 的搜索率是 Saltstack 的3倍也不是沒有原因的。Puppet 雖然穩定,但命令執行的時候,需要配置模塊兒,非常麻煩,而且還需要安裝客戶端,如果公司和別的公司有合作關係的話,很顯然,安裝客戶端是一個不得不考慮的因素。
因此,Ansible 在性能方面並不弱於這兩個工具,而且使用還並不繁瑣,關鍵Ansible是基於 Paramiko 開發的,Paramiko 是一個純 Python 實現的 SSH 協議庫。Ansible 不需要在遠程主機上安裝 client/agents,因為它是基於 SSH 來和遠程主機通訊的。
3、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:可實現多級指揮;
二、Ansible基本使用
1、安裝ansible
[root@localhost ~]# yum install -y ansible
2、主要文件
[root@DBSlave ~]# ls /etc/ansible/ansible.cfg #主配置文件,可不修改hosts #添加需操作的主機組
3、ansible使用格式
ansible <host-pattern> [-f forks] [-m module_name] [-a args] host-pattern # 可以是all,或者配置文件中的主機組名 -f forks # 指定並行處理的進程數 -m module # 指定使用的模塊,默認模塊為command -a args # 指定模塊的參數如果你有多台伺服器的話,想並發運行,可以使用-f參數,默認是並發5
4、查看各模塊的使用方法
ansible-doc [options] [modules] :Show Ansible module documentation -l 列出所有的ansible模塊 -s 列出該模塊的相關指令
5、首次使用ansible
(1)安裝ansible
[root@localhost ~]# yum install -y ansible
(2)設置主機組(host-pattern)
# vim /etc/ansible/hosts[web servers]192.168.200.211192.168.200.212192.168.200.213192.168.200.214 [db servers]192.168.200.215192.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
(7) 常用模塊
常用的模塊:copy、command、service、yum、apt、file、raw、shell、script、cron、user、state、template、
ansible -i /etc/ansiblehosts all -m service -a name=httpd state=stopedansible -m yum -a name=gcc state=present
yum模塊常用來安裝軟體
service模塊常用來對服務的開關操作shell模塊可以用來執行命令以及腳本raw和command、shell類似,但是它可以傳遞管道
三、YAML語法
YAML Aint Markup Language,即YAML不是XML。不過,在開發的這種語言時,YAML的意思其實是:"Yet Another Markup Language"(仍是一種標記語言)。
YAML的語法和其他高階語言類似,並且可以簡單表達清單、散列表、標量等數據結構。其結構(Structure)通過空格來展示,序列(Sequence)里的項用"-"來代表,Map里的鍵值對用":"分隔。下面是一個示例。
YAML文件擴展名通常為.yaml,如example.yaml。
name: John Smithage: 41gender: Malespouse: name: Jane Smith age: 37 gender: Femalechildren: - name: Jimmy Smith age: 17 gender: Male - name: Jenny Smith age 13 gender: Female
四、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
1、HOSTS和Users
playbook中的每一個play的目的都是為了讓某個或某些主機以某個指定的用戶身份執行任務。
hosts用於指定要執行指定任務的主機,其可以是一個或多個由冒號分隔主機組;
remote_user則用於指定遠程主機上的執行任務的用戶。如上面示例中的
-hosts: webnodesremote_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
2、任務列表和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
3、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
五、playbook案例
1、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
2、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
原文鏈接:http://nmshuishui.blog.51cto.com/1850554/1573941
小月兒
推薦閱讀:
※機械設計新人獨立思考能力養成
※如果你也熱愛生活,你可能也需要一個照片分類工具(PC端)
※Spare Parts 拼湊夢想
TAG:自動化 |