ansible使用及YAML語法介紹

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
相關文章
相關標籤/搜索