ansible安装及使用
一、ansible介紹
1、ansible簡介
? ? ??官方的title是“Ansible is Simple IT Automation”——簡單的自動化IT工具。
??Ansible跟其他IT自動化技術的區別在于其關注點并非配置管理、應用部署或IT流程工作流,而是提供一個統一的界面來協調所有的IT自動化功能,因此Ansible的系統更加易用,部署更快。
??Ansible可以讓用戶避免編寫腳本或代碼來管理應用,同時還能搭建工作流實現IT任務的自動化執行。IT自動化可以降低技術門檻及對傳統IT的依賴,從而加快項目的交付速度。
2、ansible優缺點
? 優點:
- 輕量級,他不需要去客戶端安裝agent,更新時,只需要在操作機上進行一次更新即可
- 批量任務執行可以寫成腳本,而且不用分發到遠程就可以執行
- 使用python編寫的,維護更簡單
- 支持sudo
? ? ? 缺點
- 對于幾千臺、上萬臺機器的操作,還不清楚性能、效率情況如何,需要進一步了解。
3、ansible架構及工作原理
? ? ?andible基本架構如下圖所示
?
ansible core : ansible 自身核心模塊
host inventory: 主機庫,定義可管控的主機列表
connection plugins: 連接插件,一般默認基于 ssh 協議連接
modules:core modules ( 自帶模塊 ) 、 custom modules ( 自定義模塊 )
playbooks :劇本,按照所設定編排的順序執行完成安排任務?
?Ansible工作原理如下圖:
?
1、管理端支持local 、ssh、zeromq 三種方式連接被管理端,默認使用基于ssh的連接---這部分對應基本架構圖中的連接模塊;
2、可以按應用類型等方式進行Host Inventory(主機群)分類,管理節點通過各類模塊實現相應的操作---單個模塊,單條命令的批量執行,我們可以稱之為 ? ? ad-hoc;
3、管理節點可以通過playbooks 實現多個task的集合實現一類功能,如web服務的安裝部署、數據庫服務器的批量備份等。playbooks我們可以簡單的理解為,系? ? ? 統通過組合多條ad-hoc操作的配置文件 。
Ansible默認是通過SSH通道來管理的,也就是它所說的免客戶端方式管理, 它底層是通過 paramiko 來實現的。 ?
ansible執行過程大體過程如下圖,其中暖色調的代表已經模塊化。
二、部署安裝
| 名稱 | 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 | ? |
| ? | ? | ? | ? |
?
?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
3、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
?
4、主機組(在hosts文件內配置)
[hangzhou]
host1
host2
[jiaxing]
host3
?
host4
5、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被管理機器不需要輸入密碼即可。
三、ansible常用模塊
3.1、ping
ansible test1 -m ping
3.2、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 模塊
- creates:一個文件名,當該文件存在,則該命令不執行
- free_form:要執行的linux指令
- chdir:在執行指令之前,先切換到該指定的目錄
- removes:一個文件名,當該文件不存在,則該選項不執行
- executable:切換shell來執行指令,該執行路徑必須是一個絕對路徑
?
注意: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 模塊
?
- arguments:給命令行提供一些選項
- enabled:是否開機啟動 yes|no
- name:必選項,服務名稱
- pattern:定義一個模式,如果通過status指令來查看服務的狀態時,沒有響應,就會通過ps指令在進程中根據該模式進行查找,如果匹配到,則認為該服務依然在運行
- runlevel:運行級別
- sleep:如果執行了restarted,在則stop和start之間沉睡幾秒鐘
- state:對當前服務執行啟動,停止、重啟、重新加載等操作(started,stopped,restarted,reloaded)
?
?
示例:[root@test ansible]#?ansible test1 -m service -a "name=httpd state=started enabled=yes"
3.10 cron 模塊
- backup:對遠程主機上的原任務計劃內容修改之前做備份
- cron_file:如果指定該選項,則用該文件替換遠程主機上的cron.d目錄下的用戶的任務計劃
- day:日(1-31,*,*/2,……)
- hour:小時(0-23,*,*/2,……) ?
- minute:分鐘(0-59,*,*/2,……)
- month:月(1-12,*,*/2,……)
- weekday:周(0-7,*,……)
- job:要執行的任務,依賴于state=present
- name:該任務的描述
- special_time:指定什么時候執行,參數:reboot,yearly,annually,monthly,weekly,daily,hourly
- state:確認該任務計劃是創建還是刪除
- user:以哪個用戶的身份執行
示例:[root@test ansible]# ansible test1 -m cron -a 'name="check dirs" hour="5,2" job="ls -alh >/dev/null"'
3.11 filesystem 模塊
- dev:目標塊設備
- force:在一個已有文件系統的設備上強制創建
- fstype:文件系統的類型
- opts:傳遞給mkfs命令的選項
3.12 yum 模塊
?
- config_file:yum的配置文件
- disable_gpg_check:關閉gpg_check
- disablerepo:不啟用某個源
- enablerepo:啟用某個源
- name:要進行操作的軟件包的名字,也可以傳遞一個url或者一個本地的rpm包的路徑
- state:狀態(present,absent,latest)
?
示例:[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同步文件
- archive: 歸檔,相當于同時開啟recursive(遞歸)、links、perms、times、owner、group、-D選項都為yes ,默認該項為開啟
- checksum: 跳過檢測sum值,默認關閉
- compress:是否開啟壓縮
- copy_links:復制鏈接文件,默認為no ,注意后面還有一個links參數
- delete: 刪除不存在的文件,默認no
- dest:目錄路徑
- dest_port:默認目錄主機上的端口 ,默認是22,走的ssh協議
- dirs:傳速目錄不進行遞歸,默認為no,即進行目錄遞歸
- rsync_opts:rsync參數部分
- set_remote_user:主要用于/etc/ansible/hosts中定義或默認使用的用戶與rsync使用的用戶不同的情況
- mode: push或pull 模塊,push模的話,一般用于從本機向遠程主機上傳文件,pull 模式用于從遠程主機上取文件
示例:[root@test ansible]# ansible test1 -m synchronize -a 'src=/tmp/helloworld dest=/var/www'
3.15 mount 模塊
- dump
- fstype:必選項,掛載文件的類型
- name:必選項,掛載點
- opts:傳遞給mount命令的參數
- src:必選項,要掛載的文件
- state:必選項
- present:只處理fstab中的配置
- absent:刪除掛載點
- mounted:自動創建掛載點并掛載之
- umounted:卸載
示例:
#創建設備
[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'
?
四、ansible-playbook
4.1 playbook 構成
- Target section: ??定義將要執行 playbook 的遠程主機組
- Variable section: ?定義 playbook 運行時需要使用的變量
- Task section: ????定義將要在遠程主機上執行的任務列表
- Handler section: ?定義 task 執行完成以后需要調用的任務
?
一般所需的目錄層有:(視情況可變化)?
- vars ????變量層
- tasks ???任務層
- handlers 觸發條件
- files ???文件
- template 模板
?
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(標簽),然后:
- 當命令ansible-playbook有-t參數時,只會執行-t指定的tag
- 當命令ansible-playbook有--skip-tags參數時,則除了--skip-tags指定的tag外,執行其他所有
?
?4.2.5 var
#變量定義在文件中
[root@test playbooks]# cat variables
port: 80
http: nginx
五、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"六、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
轉載于:https://www.cnblogs.com/sxchengchen/p/7765921.html
總結
以上是生活随笔為你收集整理的ansible安装及使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第十章 2D绘图
- 下一篇: 面试题 17.21. 直方图的水量/42