Linux服務之ansible自動化

一、初步介紹node

Ansible是一個完全的簡單的配置管理、應用部署、任務執行和多節點編制引擎。設計原則有一個死去的簡單的安裝過程和最小的學習曲線是很是快和並行默認不須要服務器或客戶端守護進程,使用現有的SSHd使用一種語言,是機器和人類友好容易專一於安全審覈/審查/修改的內容當即管理遠程機器,沒有在任何動態語言引導容許模塊開發,不只Python做爲非根可用最簡單的自動化系統使用python

在管理服務器的時候對於數量較少的時候還比較輕鬆。可是若是一旦服務器數量過多那麼管理就會很吃力。而ansible的出現可以很好的知足需可以很好解決問題。nginx

二、進一步解析ansibleshell

2.一、結構圖以下vim

wKiom1ZoB6XTgQNgAABmZFt4cNs128.png

 


2.二、對於ANSIBLE來講須要在服務器上進行部署想關進程才能對其劃分的服務器進行管理。centos

而安裝程序須要的安裝有以下幾個安全

[root@localhost ~]# rpm -qa ansible服務器

ansible-1.9.2-1.el7.noarchbabel

若是是手動編譯安裝須要解決其依賴關係其須要的依賴包以下網絡

python-jinja2 

PyYAML 

python-paramiko 

python-babel 

python-crypto

2.三、ANSIBLE主要的一些配置文件

[root@localhost ~]# rpm -ql ansible | less

/etc/ansible

/etc/ansible/ansible.cfg——ansible主配置文件

/etc/ansible/hosts——定義須要的控制服務器的ip地址或者服務器名

/etc/ansible/roles——定義須要角色

/usr/bin/ansible-doc——ansible須要的幫助文檔

/usr/bin/ansible-playbook——執行劇本

/usr/bin/ansible-vault——ansible庫文件

對於ansible而言全部的配置文件都在ansible目錄下面。

2.四、對於ansible而言在操做以前須要事先配置ansible端能基於密鑰認證的方式聯繫各被管理節點。以下的操做

[root@wp ~]# ssh-keygen ——對於彈出來的界面回車到結束便可

[root@wp ~]# ssh-copy-id -i  ~/.ssh/id_rsa  root@172.16.17.1

[root@wp ~]# ssh-copy-id -i  ~/.ssh/id_rsa  root@172.16.17.22

把全部的須要管理的服務器統一添加都羣組中去。

2.五、ansible簡單的操做以下

 ansible <host-pattern> [-f forks] [-m module_name] [-a args]

[root@localhost ~]# ansible-doc -s

Usage: ansible-doc [options] [module...]

Options:

  -h, --help            show this help message and exit

  -l, --list            List available modules

  -s, --snippet         Show playbook snippet for specified module(s)

  -v                    Show version number and exit

[root@localhost ~]# 

三、ansible具體介紹

3.一、對其主配置文件進行說明

[root@node1 ~]# vim /etc/ansible/ansible.cfg 

[defaults]

inventory      = /etc/ansible/hosts——默認用戶存放文件

#library        = /usr/share/my_modules/——ansible默認模塊

remote_tmp     = $HOME/.ansible/tmp

pattern        = *——全局匹配

forks          = 5——分叉五次

poll_interval  = 1——投票間隔

sudo_user      = root——默認以root用戶設置

#remote_port    = 22——默認遠程端口

sudo_exe = sudo——以sudo的方式執行執行權限

timeout = 10——ssh鏈接超時10s

 

[root@localhost ~]# vim /etc/ansible/hosts 

[keep]定義ansible

172.16.17.1

172.16.17.3

[httpd]

172.16.17.4

172.16.17.5

3.二、對於ansible而言除了可以單個命令執行還能夠定義劇本一次執行。

第二部分、接下說說ansible經常使用模塊

一、Setup

收集遠程主機的服務器的基本信息

Ansible  HOSTS  -m setup

二、File 設置文件的一些經常使用屬性

[root@localhost ~]# ansible-doc -s  file

force須要在兩種狀況下強制建立軟連接一種是源文件不存在但以後會創建的狀況下另外一種是目標軟連接已存在,須要先取消以前的軟鏈而後建立新的軟鏈有兩個選項yes|no

group定義文件/目錄的屬組

mode定義文件/目錄的權限

owner定義文件/目錄的屬主

path必選項定義文件/目錄的路徑

recurse遞歸的設置文件的屬性只對目錄有效

src要被連接的源文件的路徑只應用於state=link的狀況

dest被連接到的路徑只應用於state=link的狀況

state指定須要實現的狀態狀態有以下的這些

directory若是目錄不存在建立目錄

file即便文件不存在也不會被建立

link建立軟連接

hard建立硬連接

touch若是文件不存在則會建立一個新的文件若是文件或目錄已存在則更新其最後修改時間

absent刪除目錄、文件或者取消連接文件

例子

     ansible nginx -m file -a 'src=/etc/fstab dest=/tmp/fstab state=link'

     ansible nginx -m file -a 'path=/tmp/test.sh state=touch'

     ansible nginx -m shell -a 'echo "hell world" > /tmp/test.sh'

     ansible nginx -m file -a 'path=/tmp/test1 state=directory mode=744'

三、command 在控制的服務器中執行命令

      chdir       # 在運行某個目錄下的命令以前先切換到目錄下

      creates     # 若是建立的文件存在即退出不建立

      executable  # 以shell的方式執行命令可是須要時絕對路徑的前提下

      removes    # 移除某個文件可是若是不存在就不執行

 例子

[root@localhost ~]# ansible nginx -m command -a 'date'

172.16.17.1 | success | rc=0 >>

Thu Oct 22 00:51:39 CST 2015

172.16.17.22 | success | rc=0 >>

Thu Oct 22 00:51:39 CST 2015

四、user   添加用戶

[root@localhost ~]# ansible-doc -s user

      createhome    除非設置爲「不」,一個主目錄將爲用戶建立帳戶時或者主目錄不存在。

      force         當狀態 爲absent就如使用 `userdel --force'同樣

      generate_ssh_key  是否產生問題中的用戶的SSH密鑰。這將不會覆蓋現有的SSH密鑰。                                   

      groups       列出全部用戶組當 groups=空的時候把附加組都刪除

      home        給用戶建立家目錄

      move_home  修改用戶的家目錄

      name=       建立刪除修改時候須要的指定用戶  

      password     給用戶添加一個祕密

      remove      刪除用戶至關於`state=absent', 

      shell         指定擁護採用的shell格式   

      state        不管該賬戶是否存在若是該狀態與所述狀態不一樣則採起行動。

      system      建立系統用戶

      uid         指定擁護UID

      update_password     更改祕密

須要特別說明的是password後面指定的密碼不能是明文後面這一串密碼會被直接傳送到被管理主機的/etc/shadow文件中而登錄的時候輸入的密碼會被hash加密之後再去與/etc/shadow中存放的密碼去作對比會出現不一致的現象。因此須要先將密碼字符串進行加密處理openssl passwd -salt -1 "123456"而後將獲得的字符串放到password中便可。

五、group 用戶組管理

      gid         指定用戶組GUD

      name=      指定用戶組名

      state        該組是否應該在遠程主機上

      system     建立用戶組

六、cron 遠程客戶端執行任務計劃

      backup      在建立新的crontab任務以前對其以前建立的進行備份

      cron_file     若是肯定使用這個文件使用使用cronD而不是單個用戶的crontab

      day         # Day of the month the job should run ( 1-31, *, */2, etc )

      hour        # Hour when the job should run ( 0-23, *, */2, etc )

      job         # The command to execute. Required if state=present.

      minute      # Minute when the job should run ( 0-59, *, */2, etc )

      month      # Month of the year the job should run ( 1-12, *, */2, etc )

      name=      # Description of a crontab entry.

      state        # Whether to ensure the job is present or absent.

      user        # The specific user whose crontab should be modified.

      weekday    # Day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )

例子

[root@wp ~]# ansible all -m cron -a 'name="sync time from ntpserver"state=present minute=*/3 job="/bin/cat /etc/issue &> /dev/null"'

[root@wp ~]# ansible all -m cron -a 'name="sync time from ntpserver"state=absent '

七、copy 複製文件

     複製文件到遠程主機

copy模塊包含以下選項

backup在覆蓋以前將原文件備份備份文件包含時間信息。有兩個選項yes|no

content用於替代"src",能夠直接設定指定文件的值

dest必選項。要將源文件複製到的遠程主機的絕對路徑若是源文件是一個目錄那麼該路徑也必須是個目錄

directory_mode遞歸的設定目錄的權限默認爲系統默認權限

force若是目標主機包含該文件但內容不一樣若是設置爲yes則強制覆蓋若是爲no則只有當目標主機的目標位置不存在該文件時才複製。默認爲yes

others全部的file模塊裏的選項均可以在這裏使用

src要複製到遠程主機的文件在本地的地址能夠是絕對路徑也能夠是相對路徑。若是路徑是一個目錄它將遞歸複製。在這種狀況下若是路徑使用"/"來結尾則只複製目錄裏的內容若是沒有使用"/"來結尾則包含目錄在內的整個內容所有複製相似於rsync

示例

ansible test -m copy -a "src=/etc/issue  dest=/tmp/issue  owner=root group=root mode=0644"

ansible nginx -m copy -a 'src=/etc/issue dest=/tmp/issue backup=yes'

八、ping 測試網絡使用的

[root@localhost ~]# ansible nginx  -m ping   

172.16.17.1 | success >> {

    "changed": false, 

    "ping": "pong"

}

172.16.17.22 | success >> {

    "changed": false, 

    "ping": "pong"

}

9.shell

切換到某個shell執行指定的指令參數與command相同。

示例

ansible test -m shell -a "somescript.sh >> somelog.txt"

 

10.service

用於管理服務

該模塊包含以下選項

arguments給命令行提供一些選項

enabled是否開機啓動 yes|no

name必選項服務名稱

pattern定義一個模式若是經過status指令來查看服務的狀態時沒有響應就會經過ps指令在進程中根據該模式進行查找若是匹配到則認爲該服務依然在運行

runlevel運行級別

sleep若是執行了restarted在則stopstart之間沉睡幾秒鐘

state對當前服務執行啓動中止、重啓、從新加載等操做started,stopped,restarted,reloaded

示例

ansible test -m service -a "name=httpd state=started enabled=yes"

ansible test -m service -a "name=foo pattern=/usr/bin/foo state=started"

ansible test -m service -a "name=network state=restarted args=eth0"

11.filesystem

在塊設備上建立文件系統

選項

dev目標塊設備

force在一個已有文件系統的設備上強制建立

fstype文件系統的類型

opts傳遞給mkfs命令的選項

12.yum

使用yum包管理器來管理軟件包

選項

config_fileyum的配置文件

disable_gpg_check關閉gpg_check

disablerepo不啓用某個源

enablerepo啓用某個源

list

name要進行操做的軟件包的名字也能夠傳遞一個url或者一個本地的rpm包的路徑

state狀態presentabsentlatest

示例

ansible test -m yum -a 'name=httpd state=latest'

ansible test -m yum -a 'name="@Development tools" state=present'

ansible test -m yum -a 'name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present'

13.mount

配置掛載點

選項

dump

fstype必選項掛載文件的類型

name必選項掛載點

opts傳遞給mount命令的參數

passno

src必選項要掛載的文件

state必選項

present只處理fstab中的配置

absent刪除掛載點

mounted自動建立掛載點並掛載之

umounted卸載

示例

name=/mnt/dvd src=/dev/sr0 fstype=iso9660 opts=ro state=present

name=/srv/disk src='LABEL=SOME_LABEL' state=present

name=/home src='UUID=b3e48f45-f933-4c8e-a700-22a159ec9077' opts=noatime state=present

 

ansible test -a 'dd if=/dev/zero of=/disk.img bs=4k count=1024'

ansible test -a 'losetup /dev/loop0 /disk.img'

ansible test -m filesystem 'fstype=ext4 force=yes opts=-F dev=/dev/loop0'

ansible test -m mount 'name=/mnt src=/dev/loop0 fstype=ext4 state=mounted opts=rw'

 

第三部分創建一個完整的劇本

一、對於ansible來講有點像現實生活中的編劇同樣。可以爲定義好須要的各類角色每一個角色在所須要的環境中所扮演的的角色及其做用範圍。先說明下一個ansible劇本所須要的劇本以及須要執行的動做

[root@node1 ~]# tree ansible_playbook/

ansible_playbook/——首先須要給整個劇本一個劇本名稱而這個就是劇本的名字

├── pcsd.yml——指定扮演角色的身份及其執行前後順序

└── roles——建立管理全部角色的目錄

    ├── pacemaker——建立角色一的目錄其中可以定義相對角色可以執行的命令

    │   ├── files——存放一些能夠在全部可以扮演相對角色能複製執行的腳步目錄

    │   ├── handlers——存放須要可以重啓的文件地

    │   ├── meta

    │   ├── tasks——這個目錄是最終要的目錄定義角色須要現實的功能以下

    │      └── main.yml——

    │   ├── templates——定義模板的目錄可以在定義全部的host中實現

    │   └── vars——定義角色鎖所能使用的變量

    └── synctime

        ├── files

        ├── handlers

        ├── meta

        ├── tasks

        │   └── main.yml

        ├── templates

        └── vars

[root@node1 ~]# 

二、對單個角色進行分析說明

對於每一個角色都須要上面定義的每一個目錄fileshandlerstemplatestasksvarsmeta

Handers此目錄中應當包含一個main.yml文件用於定義此角色用到的各handlerhandler中使用include包含的其它的handler文件也應該位於此目錄中

Tasks此目錄至少應該包含一個名爲main.yml的文件其定義了此角色的任務列表此文件可使用include包含其它的位於此目錄中的task文件

Files對於此目錄來講主要存放可以copy及其script執行的文件

Templates此目錄定義template模塊可以調用的模板此目錄中的文件以jinjia2格式定義

vars目錄應當包含一個main.yml文件用於定義此角色用到的變量

meta目錄應當包含一個main.yml文件用於定義此角色的特殊設定及其依賴關係ansible 1.3及其之後的版本才支持

三、對於一個角色所能扮演的功能進行說明

對於handers來講須要包含一個main.yml文件主要定義的以下

[root@localhost ansible_playbook]# cat roles/keepalived/handlers/main.yml 

- name: restart keepalived相對於來講- name只是書寫的方式是固定的格式主要做用在於標明須要執行的程序名稱及其所要執行的動做

  service: name=keepalived state=restarted此命令纔是真正可以執行的動做

[root@localhost ansible_playbook]# 

 

對於tasks來講主要是用來定義當前角色所可以執行的動做以下

[root@localhost ansible_playbook]# cat roles/keepalived/tasks/main.yml 

- name: install keepalived——對於name來講在ansible中是啓動一個標識的做用不會被執行。而跟在name下面的命令纔會被執行

  yum: name=keepalived state=present——經過yum進行安裝程序

- name: template configure file——

  template: src=keepalived.conf.j1 dest=/etc/keepalived/keepalived.conf——定義須要執行的模板及其模板在相對於客戶戶端可以生成的文件

  when: ansible_nodename ==  'node3.dns.com'——相對於ansible而言還可以在執行劇本的時候進行必定程度上的判斷來對管理主機進行分別的管理

  tags: conffile——標明當配置文件若是沒有發生改變即跳過執行

  notify: ——通告

  - restart keepalived——可以執行相對管理主機上的對於服務須要重啓

- name: template configure file

  template: src=keepalived.conf.j2 dest=/etc/keepalived/keepalived.conf

  when: ansible_nodename ==  'node1.dns.com'

  tags: conffile

  notify: 

  - restart keepalived

- name: start keepalived service

  service: name=keepalived state=started

四、補充的部分

tasks中的main.yml中還以使用不少的命令幾乎ansible能操做的命令都能在其中定義

當有須要重複性執行的任務時可使用迭代機制。其使用格式爲將須要迭代的內容定義爲item變量引用並經過with_items語句來指明迭代的元素列表便可。

- name: add system users

  user: name={{ item }} state=present groups=test

  with_items:

     - test1

     - test2

五、劇本定義完成以後就能夠去執行劇本猶如演繹出話劇同樣

[root@wp ansible_playbook]# ansible-palybook  keepalived.yml 

PLAY [keepalived] ************************************************************* 

GATHERING FACTS *************************************************************** 

[0;32mok: [172.16.17.3][0m

[0;32mok: [172.16.17.1][0m

TASK: [synctime | sync time from 172.16.0.1] ********************************** 

[0;32mok: [172.16.17.1][0m

[0;32mok: [172.16.17.3][0m

TASK: [keepalived | install keepalived] *************************************** 

[0;32mok: [172.16.17.3][0m

[0;32mok: [172.16.17.1][0m

TASK: [keepalived | template configure file] ********************************** 

[0;36mskipping: [172.16.17.1][0m

[0;36mskipping: [172.16.17.3][0m

TASK: [keepalived | template configure file] ********************************** 

[0;36mskipping: [172.16.17.1][0m

[0;36mskipping: [172.16.17.3][0m

TASK: [keepalived | start keepalived service] ********************************* 

[0;32mok: [172.16.17.3][0m

[0;32mok: [172.16.17.1][0m

PLAY RECAP ******************************************************************** 

  changed=4    unreachable=0    failed=0   

  changed=4    unreachable=0    failed=0   

相關文章
相關標籤/搜索