1、ansible介紹javascript
一、ansible簡介java
官方的title是「Ansible is Simple IT Automation」——簡單的自動化IT工具。node
Ansible跟其餘IT自動化技術的區別在於其關注點並不是配置管理、應用部署或IT流程工做流,而是提供一個統一的界面來協調全部的IT自動化功能,所以Ansible的系統更加易用,部署更快。python
Ansible可讓用戶避免編寫腳本或代碼來管理應用,同時還能搭建工做流實現IT任務的自動化執行。IT自動化能夠下降技術門檻及對傳統IT的依賴,從而加快項目的交付速度。linux
二、ansible優缺點nginx
優勢:web
缺點docker
三、ansible架構及工做原理shell
andible基本架構以下圖所示數據庫
ansible core : ansible 自身核心模塊
host inventory: 主機庫,定義可管控的主機列表
connection plugins: 鏈接插件,通常默認基於 ssh 協議鏈接
modules:core modules ( 自帶模塊 ) 、 custom modules ( 自定義模塊 )
playbooks :劇本,按照所設定編排的順序執行完成安排任務
Ansible工做原理以下圖:
一、管理端支持local 、ssh、zeromq 三種方式鏈接被管理端,默認使用基於ssh的鏈接---這部分對應基本架構圖中的鏈接模塊;
2、能夠按應用類型等方式進行Host Inventory(主機羣)分類,管理節點經過各種模塊實現相應的操做---單個模塊,單條命令的批量執行,咱們能夠稱之爲 ad-hoc;
3、管理節點能夠經過playbooks 實現多個task的集合實現一類功能,如web服務的安裝部署、數據庫服務器的批量備份等。playbooks咱們能夠簡單的理解爲,系 統經過組合多條ad-hoc操做的配置文件 。
Ansible默認是經過SSH通道來管理的,也就是它所說的免客戶端方式管理, 它底層是經過 paramiko 來實現的。
ansible執行過程大致過程以下圖,其中暖色調的表明已經模塊化。
2、部署安裝
名稱 |
IP |
操做系統 |
用途 |
ansible-server |
192.168.95.10/24 |
CentOS7.1 |
管理端 |
client-1 |
192.168.95.11/24 |
CentOS7.1 |
|
client-2 |
192.168.95.12/24 |
CentOS7.1 |
|
|
|
|
一、ansible安裝方式有、源碼、pip、yum。
1.1 源碼安裝
源碼安裝須要python2.6以上版本,其依賴模塊paramiko、PyYAML、Jinja2、httplib2、simplejson、pycrypto模塊,以上模塊能夠經過pip或easy_install 進行安裝
1.2pip安裝
pip是專門用來管理Python模塊的工具,Ansible會將每次正式發佈都更新到pip倉庫中。因此經過pip安裝或更新Ansible,會比較穩妥的拿到最新穩定版。
1.3 yum安裝
1)安裝epel源
yum install http://mirrors.163.com/centos/7.4.1708/extras/x86_64/Packages/epel-release-7-9.noarch.rpm
2)查看epel源並安裝ansible
[root@node2 ~]ll /etc/yum.repos.d/epel*
[root@node2 ~]yum install ansible -y
3)查看ansible版本
ansible --version
2 ansible組成介紹
tree /etc/ansible/
/etc/ansible/
├── ansible.cfg # ansible的配置文件
├── hosts # ansible的主倉庫 用來存儲須要管理的遠程主機的相關信息
└── roles
三、ansible七個命令
ansible
經常使用參數:-m 模塊
-i PATH, --inventory=PATH 指定庫存主機文件的路徑,默認爲/etc/ansible/hosts.
-a (arguments) 命令行參數
示例:ansible test1 -m copy -a "src=/tmp/test.txt dest=/tmp/test.txt "
ansible-doc
//列出全部已安裝的模塊
# ansible-doc -l
//查看具體某模塊的用法,這裏如查看command模塊
# ansible-doc -s command
absible-galaxy
ansible-galaxy 指令用於方便的從https://galaxy.ansible.com/ 站點下載第三方擴展模塊,咱們能夠形象的理解其相似於centos下的yum、python下的pip或easy_install 。以下示例:
ansible-galaxy install aeriscloud.docker
ansible-link
ansible-lint是對playbook的語法進行檢查的一個工具。用法是ansible-lint playbook.yml 。
ansible-playbook
該指令是使用最多的指令,其經過讀取playbook 文件後,執行相應的動做。
ansible-pull
適用於如下場景:你有數量巨大的機器須要配置,即便使用很是高的線程仍是要花費不少時間;你要在一個沒有網絡鏈接的機器上運行Anisble,好比在啓動以後安裝。
ansible-vault
注意:重點是ansible和ansible-playbook
四、主機組(在hosts文件內配置)
[hangzhou]
host1
host2
[jiaxing]
host3
host4
五、ansible默認配置文件
Ansible默認安裝好後有一個配置文件/etc/ansible/ansible.cfg
ansible簡單使用
[root@test ansible]# ansible test1 -m ping -k
SSH password:
192.168.147.101 | FAILED => Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host.
報錯處理辦法:
在ansible.cfg配置文件中,也會找到以下部分:
# uncomment this to disable SSH key host checking
host_key_checking = False
默認host_key_checking部分是註釋的,經過找開該行的註釋,一樣也能夠實現跳過 ssh 首次鏈接提示驗證部分。
可見採用密碼方式比較麻煩,實際應用中採用ssh 互信方式。
配置ssh 互信時,只須要管理主機能ssh被管理機器不須要輸入密碼便可。
3、ansible經常使用模塊
3.一、ping
ansible test1 -m ping
3.二、setuop
setup模塊,主要用於獲取主機信息,在playbooks裏常常會用到的一個參數gather_facts就與該模塊相關。setup模塊下常用的一個參數是filter參數,具體使用示例以下:
#查看主機內存信息
[root@test ~]# ansible test1 -m setup -a 'filter=ansible_*_mb'
#查看網卡信息
[root@test ~]# ansible test1 -m setup -a 'filter=ansible_eth0'
#將全部主機的信息輸入到/tmp/facts目錄下,每臺主機的信息輸入到主機名文件中(/etc/ansible/hosts裏的主機名)
[root@test ~]# ansible all -m setup --tree /tmp/facts
3.3 file 模塊
file模塊主要用於遠程主機上的文件操做。
(group、mode、owner):定義文件/目錄
path:定義文件路徑
recurse:遞歸的設置,只對目錄有效。
src:要被連接的源文件路徑,只應用於state=link的狀況
dest:被鏈接的路徑,只應用於state=link的狀況
state:directory:若是目錄不存在,建立目錄
file:即便文件不存在,也不會建立
link:建立軟鏈接
hard:建立硬連接
touch:文件不存在,則會建立。若是存在則會,則更新最後修改的時間。
absent:刪除目錄、文件或取消連接。
示例:
[root@test ~]# ansible test1 -m file -a "src=/etc/fstab dest=/tmp/fstab state=link"
[root@test ~]# ansible test1 -m file -a "path=/tmp/fstab state=absent"
[root@test ~]# ansible test1 -m file -a "path=/tmp/fstab state=touch"
3.4 cop模塊
backup:在覆蓋以前將原文件備份,備份文件包含時間信息。有兩個選項:yes|no
content:用於替代"src",能夠直接設定指定文件的值
directory_mode:遞歸的設定目錄的權限,默認爲系統默認權限
force:若是目標主機包含該文件,但內容不一樣,若是設置爲yes,則強制覆蓋,若是爲no,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes
others:全部的file模塊裏的選項均可以在這裏使用
src:要複製到遠程主機的文件在本地的地址,能夠是絕對路徑,也能夠是相對路徑。若是路徑是一個目錄,它將遞歸複製。在這種狀況下,若是路徑使用"/"來結尾,則只複製目錄裏的內容,若是沒有使用"/"來結尾,則包含目錄在內的整個內容所有複製,相似於rsync。
示例:
[root@test ~]# ansible test1 -m copy -a "src=/tmp/test.txt dest=/tmp/test.txt owner=foo group=foo mode=0644"
3.5 command 模塊
注意:command模塊不是調用的shell的指令,因此沒有bash的環境變量,也不能使用shell的一些操做方式,其餘和shell沒有區別
示例:[root@test ansible]# ansible test1 -a 'df -h'
3.6 shell 模塊
用法其本和command同樣,不過的是其是經過/bin/sh進行執行,因此shell 模塊能夠執行任何命令,就像在本機執行同樣。
示例:[root@test ansible]# ansible test1 -m shell -a 'ps -ef | grep sshd'
3.7 raw 模塊
用法和shell 模塊同樣 ,其也能夠執行任意命令,就像在本機執行同樣
注:raw模塊和comand、shell 模塊不一樣的是其沒有chdir、creates、removes參數,chdir參數的做用就是先切到chdir指定的目錄後,再執行後面的命令,這在後面不少模塊裏都會有該參數 。
3.8 script 模塊
將管理端的shell 在被管理主機上執行,其原理是先將shell 複製到遠程主機,再在遠程主機上執行,原理相似於raw模塊。
3.9 service 模塊
示例:[root@test ansible]# ansible test1 -m service -a "name=httpd state=started enabled=yes"
3.10 cron 模塊
示例:[root@test ansible]# ansible test1 -m cron -a 'name="check dirs" hour="5,2" job="ls -alh >/dev/null"'
3.11 filesystem 模塊
3.12 yum 模塊
示例:[root@test ansible]# ansible test1 -m yum -a 'name=httpd state=latest'
3.13 user和group 模塊
user模塊是請求的是useradd, userdel, usermod三個指令,goup模塊請求的是groupadd, groupdel, groupmod 三個指令。
示例:
建立用戶:[root@test ~]# ansible test1 -m user -a 'createhome=yes home=/home/user1 password=123456 name=user1 shell=/bin/bash state=present'
刪除用戶:[root@test ~]# ansible test1 -m user -a 'remove=yes name=user1 state=absent'
3.14 synchronize 模塊
使用rsync同步文件
示例:[root@test ansible]# ansible test1 -m synchronize -a 'src=/tmp/helloworld dest=/var/www'
3.15 mount 模塊
示例:
#建立設備
[root@test ansible]# ansible test1 -a 'dd if=/dev/zero of=/disk.img bs=4k count=1024'
#與/dev/loop1關聯
[root@test ansible]# ansible test1 -a 'losetup /dev/loop1 /disk.img'
#格式化
[root@test ansible]# ansible test1 -m filesystem -a 'fstype=ext3 force=yes opts=-F
#掛載
[root@test ansible]# ansible test1 -m mount -a 'name=/mnt src=/dev/loop1 fstype=ext3 state=mounted opts=rw'
4、ansible-playbook
4.1 playbook 構成
通常所需的目錄層有:(視狀況可變化)
4.2.1host和user
playbook中的每個play的目的都是爲了讓某個或某些主機以某個指定的用戶身份執行任務。
hosts 用於指定要執行指定任務的主機其能夠是一個或多個由冒號分隔主機組。
user 執行該任務組的用戶
remote_user 則用於指定遠程主機上的執行任務的用戶,與user相同。
sudo 若是設置爲yes,執行該任務組的用戶在執行任務時,獲取root權限。
4.2.2 任務列表和action
play的主體部分是task list
示例:
tasks:
- name: make sure apache is running
service: name=httpd state=running
4.2.3 handlers
在notify中列出的操做稱爲handler也即notify中調用 handler中定義的操做。
注意:在 notify 中定義內容必定要和tasks中定義的 - name 內容同樣,這樣才能達到觸發的效果,不然會不生效。
4.2.4 tags
ansible中能夠對play、role、include、task打一個tag(標籤),而後:
4.2.5 var
#變量定義在文件中
[root@test playbooks]# cat variables
port: 80
http: nginx
5、playbook經常使用模板
template
template模塊和copy相似,不一樣在於template會作變量替換。
經常使用參數:
backup:若是原目標文件存在,則先備份目標文件
dest:目標文件路徑
force:是否強制覆蓋,默認爲yes
group:目標文件屬組
mode:目標文件的權限
owner:目標文件屬主
src:源模板文件路徑
validate:在複製以前經過命令驗證目標文件,若是驗證經過則複製
示例:
- template: src=/mytemplates/foo.j2 dest=/etc/file.conf owner=bin group=wheel mode=0644 - template: src=/mytemplates/foo.j2 dest=/etc/file.conf owner=bin group=wheel mode="u=rw,g=r,o=r"
set_face
set_fact模塊可讓你在遠程受管機器上去執行腳本的過程來計算咱們須要的值,這些值能夠被用在模板或者變量中。這些值有點相似setup模塊中的參數,只不過setup模塊是以單臺主機爲單位的。
示例:
tasks:
-name: Calculate InnoDB buffer pool size
set facl: innodb_buffer_pool_size_mb=」{{ ansible_mentotal_mb /2 }}」
pause
暫停模塊可讓咱們在playbooks中暫停一段時間,能夠知道一個時間段,或者提示用戶繼續。在命令行中沒生麼有,但在playbook中,頗有用處。
示例:
# Pause for 5 minutes to build app cache.
- pause: minutes=5
# Pause until you can verify updates to an application were successful.
- pause:
# A helpful reminder of what to look out for post-update.
- pause: prompt="Make sure org.foo.FooOverload exception is not present"
wait_for
wait_for模塊用來檢測一個tcp端口是否準備好接收遠程鏈接,這是由遠程主機來完成的。
示例:
# 10秒後在當前主機開始檢查8000端口,直到端口啓動後返回
- wait_for: port=8000 delay=10
# 檢查path=/tmp/foo直到文件存在後繼續
- wait_for: path=/tmp/foo
# 直到/var/lock/file.lock移除後繼續
- wait_for: path=/var/lock/file.lock state=absent
-name: Wait for Tomcat to start
wait_for: port=8080 state=started
assemble
assemble組裝模塊把多個受管主機的文件合併成一個文件,當配置文件不容許包含的時候,很是有用。特別在設置root用戶的authorized_keys文件的時候。
示例:
# Example from Ansible Playbooks
- assemble: src=/etc/someapp/fragments dest=/etc/someapp/someapp.conf
# When a delimiter is specified, it will be inserted in between each fragment
- assemble: src=/etc/someapp/fragments dest=/etc/someapp/someapp.conf delimiter='### START FRAGMENT ###'
add_host
add_host添加主機模塊是playbook中一個強大的模塊,它可讓你動態的添加受管主機到一個play中。
示例:
# add host to group 'just_created' with variable foo=42
- add_host: name={{ ip_from_ec2 }} groups=just_created foo=42
group_by
group_by模塊可讓咱們根據主機的真實特性進行分組,真實特性能夠經過add_fact來實現。Group_by模塊只接受一個參數,key,一樣組名的機器被分到一個組裏面。
示例:
# Create groups based on the machine architecture
- group_by: key=machine_{{ ansible_machine }}
# Create groups like 'kvm-host'
- group_by: key=virt_{{ ansible_virtualization_type }}_{{ ansible_virtualization_role }}
get_url
該模塊主要用於從http、ftp、https服務器上下載文件(相似於wget),主要有以下選項:
sha256sum:下載完成後進行sha256 check;
timeout:下載超時時間,默認10s
url:下載的URL
url_password、url_username:主要用於須要用戶名密碼進行驗證的狀況
use_proxy:是事使用代理,代理需事先在環境變動中定義
示例:
- name: download foo.conf
get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf mode=0440
- name: download file with sha256 check
get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf sha256sum=b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c
debug
調試模塊,用於在調試中輸出信息
經常使用參數:
msg:調試輸出的消息
var:將某個任務執行的輸出做爲變量傳遞給debug模塊,debug會直接將其打印輸出
verbosity:debug的級別(默認是0級,所有顯示)
fail
用於終止當前playbook的執行,一般與條件語句組合使用,當知足條件時,終止當前play的運行。能夠直接由failed_when取代。
選項只有一個:
msg:終止前打印出信息
示例:
- fail: msg="The system may not be provisioned according to the CMDB status." when: cmdb_status != "to-be-staged"
6、playbook的roles和include
include
1、包含task文件
---
# possibly saved as tasks/foo.yml
- name: placeholder foo
command: /bin/foo
- name: placeholder bar
command: /bin/bar
2、包含handle文件
---
# this might be in a file like handlers/handlers.yml
- name: restart apache
service: name=apache state=restarted
在play末尾包含上面的handler文件:
handlers:
- include: handlers/handlers.yml
3、直接包含playbook文件
roles(角色)
roles用來組織playbook結構,以多層目錄和文件將playbook更好的組織在一塊兒
角色容許你將變量、文件、任務、模板、handlers放到一個文件夾中,而後包含它們。在創建好一個有效的依賴關係以後,還能夠在一個角色中包含另一個角色。
roles組織的playbook結構:
site.yml
webservers.yml
fooservers.yml
roles/
common/ #下面的子目錄都不是必須提供的,沒有的目錄會自動忽略,不會出現問題,因此你能夠只有tasks/子目錄也沒問題
files/
templates/
tasks/
handlers/
vars/
meta/
webservers/
而後在playbook文件中包含common和webservers這兩個role:
---
- hosts: user_group1
roles:
- common
- webservers