Ansible:1.簡單使用
Ansible 是什麼
Ansible 簡單的說是一個配置管理系統(configuration management system)。你只需要可以使用 ssh 訪問你的伺服器或設備就行。它也不同於其他工具,因為它使用推送的方式,而不是像 puppet 等 那樣使用拉取安裝agent的方式。你可以將代碼部署到任意數量的伺服器上!
Ansible能做什麼
ansible可以幫助我們完成一些批量任務,或者完成一些需要經常重複的工作。 - 比如:同時在100台伺服器上安裝nginx服務,並在安裝後啟動它們。 - 比如:將某個文件一次性拷貝到100台伺服器上。 - 比如:每當有新伺服器加入工作環境時,你都要為新伺服器部署某個服務,也就是說你需要經常重複的完成相同的工作。
這些場景中我們都可以使用到ansible。
Ansible特性
- 模塊化:調用特定的模塊,完成特定任務
- 有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模塊
- 支持自定義模塊
- 基於Python語言實現
- 部署簡單,基於python和SSH(默認已安裝),agentless
- 安全,基於OpenSSH
- 支持playbook編排任務
- 冪等性:一個任務執行1遍和執行n遍效果一樣,不因重複執行帶來意外情況
- 無需代理不依賴PKI(無需ssl)
- 可使用任何編程語言寫模塊
- YAML格式,編排任務,支持豐富的數據結構
- 較強大的多層解決方案
- no agents:不需要在被管控主機上安裝任何客戶端;
- no server:無伺服器端,使用時直接運行命令即可;
- modules in any languages:基於模塊工作,可使用任意語言開發模塊;
- yaml,not code:使用yaml語言定製劇本playbook;
- ssh by default:基於SSH工作;
- strong multi-tier solution:可實現多級指揮。
- 輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
- 批量任務執行可以寫成腳本,而且不用分發到遠程就可以執行;
- 使用python編寫,維護更簡單,ruby語法過於複雜;
- 支持sudo。
Ansible主要組成部分功能說明
- PLAYBOOKS:任務劇本(任務集),編排定義Ansible任務集的配置文件,由Ansible順序依次執行,通常是JSON格式的YML文件
- INVENTORY:Ansible管理主機的清單/etc/anaible/hosts
- MODULES:Ansible執行命令的功能模塊,多數為內置的核心模塊,也可自定義,ansible-doc –l 可查看模塊
- PLUGINS:模塊功能的補充,如連接類型插件、循環插件、變數插件、過濾插件等,該功能不常用
- API:供第三方程序調用的應用程序編程介面
- ANSIBLE:組合INVENTORY、 API、 MODULES、PLUGINS的綠框,可以理解為是ansible命令工具,其為核心執行工具
主控機要求
目前Ansible可以從安裝了Python 2(2.7版)或Python 3(3.5及更高版本)的任何機器上運行。控制計算機不支持Windows。
這包括Red Hat,Debian,CentOS,macOS,任何BSD等等。
受管節點要求
在受管節點上,您需要一種通信方式,通常是ssh。默認情況下,這使用sftp。如果沒有,你可以切換到scp in ansible.cfg。您還需要Python 2(2.6或更高版本)或Python 3(3.5或更高版本)。
主要文件說明
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主機清單
/etc/ansible/roles/ 存放角色的目錄
/usr/bin/ansible 主程序,臨時命令執行工具
/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具
/usr/bin/ansible-galaxy 下載/上傳優秀代碼或Roles模塊的官網平台
/usr/bin/ansible-playbook 定製自動化任務,編排劇本工具
/usr/bin/ansible-pull 遠程執行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基於Console界面與用戶交互的執行工具
輸出結果顏色說明
highlight = white 高亮 = 白色
verbose = blue 藍色
warn = bright purple 警告 = 亮紫色
error = red 錯誤 = 紅色
debug = dark gray debug = 深灰色
deprecate = purple 紫色
skip = cyan 跳過 = 青色
unreachable = red 無法到達 = 紅色
ok = green OK = 綠色
changed = yellow 目標主機有更新 = 黃色
diff_add = green 綠色
diff_remove = red 紅色
diff_lines = cyan 青色
環境
[root@centos181001 ~]# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)
[root@centos181001 ~]# ansible --version
ansible 2.7.7
config file = /etc/ansible/ansible.cfg
configured module search path = [u/root/.ansible/plugins/modules, u/usr/share/ansible/plugins/modules]
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
第一步:Ansible主控端安裝
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install ansible
第二步:/etc/ansible/hosts
主機列表文件格式說明
# This is the default ansible hosts file. 這是 一個默認``hosts``的示例文件
#
# It should live in /etc/ansible/hosts 他應該位於 /etc/ansible/hosts
#
# - Comments begin with the # character # 開頭的是注釋
# - Blank lines are ignored 空行會被忽略
# - Groups of hosts are delimited by [header] elements
# - You can enter hostnames or ip addresses 你可以使用hostname或者ip地址
# - A hostname/ip can be a member of multiple groups 一個主機名或者IP地址可以屬於多個組
# Ex 1: Ungrouped hosts, specify before any group headers.
# 示例1:未分組的主機,在任何組頭之前指定。
## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10
# Ex 2: A collection of hosts belonging to the webservers group
# 示例2:屬於``webservers``組的主機列表
## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110
# If you have multiple hosts following a pattern you can specify
# them like this:
# 如果你的多個主機遵循一定的規律,可以使用以下方式定義
## www[001:006].example.com
# Ex 3: A collection of database servers in the dbservers group
# 示例3:``[dbservers]``組示例
## [dbservers]
##
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57
# Heres another example of host ranges, this time there are no
# leading 0s:
## db-[99:101]-node.example.com
第三步:配置基於key的免密登錄
由於Ansible是基於ssh連接的,我們不用每次執行命令的時候都手動輸入密碼,顯然這樣效率太低,所以設置讓主控端可以免密登錄到被控端,方便管理。
ssh-keygen
ssh-copy-id 11.11.11.62
ssh-copy-id 11.11.11.63
第四步:常用命令演示
常用參數
--list-host 只輸出符合條件的主機列表,而並不執行命令
-vvv 顯示詳細信息
1.第一條命令
Try to connect to host, verify a usable python and return `pong on success
嘗試連接到主機,驗證可用的python並在成功時返回「pong」
ansible 11.11.11.62 -m ping
ansible db -m ping
[root@centos181001 ~]# ansible 11.11.11.62 -m ping
11.11.11.62 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[root@centos181001 ~]# ansible db -m ping
11.11.11.62 | SUCCESS => {
"changed": false,
"ping": "pong"
}
11.11.11.63 | SUCCESS => {
"changed": false,
"ping": "pong"
2.copy模塊:將文件從本地或遠程計算機複製到遠程主機
- src :指定源路徑(源路徑如果是目錄的話,最後是否已
/
結尾在很多時候會有區別,自己體會) - dest :指定目標主機的目標路徑
- content :當不使用src指定拷貝的文件時,可以使用content直接指定文件內容,src與content兩個參數必有其一,否則會報錯。
- force : 是否強制覆蓋已有文件,可選值有yes和no,默認值為yes,如果設置為no,則不會執行覆蓋拷貝操作,遠程主機中的文件保持不變。 -backup : 是否對遠程主機的已有文件進行備份,可選值有yes和no
- owner : 指定文件拷貝到遠程主機後的屬主,但是遠程主機上必須有對應的用戶,否則會報錯。
- group : 指定文件拷貝到遠程主機後的屬組,但是遠程主機上必須有對應的組,否則會報錯。
- mode : 指定文件拷貝到遠程主機後的許可權,如果你想將許可權設置為」rw-r--r--「,則可以使用mode=0644表示,如果你想要在user對應的許可權位上添加執行許可權,則可以使用mode=u+x表示。
示例:將本地/home/1
copy 到遠程/home/
目錄,指定組為:db
ansible db -m copy -a src=/home/1 dest=/home/
ansible db -m copy -a src=/home/1 dest=/home/ backup=yes
ansible db -m copy -a src=/home/1 dest=/home/ backup=yes force=no
playbook示例:
cat <<EOF >copy.yml
- hosts: db
tasks:
- name: example copying file with owner and permissions
copy:
src: /home/1/
dest: /home/
backup: yes
EOF
ansible-playbook copy.yml
3.FETCH模塊:從遠程主機複製文件到本地
此模塊只支持複製文件,而不支持複製目錄
- src 遠程源路徑
- dest 本地目標路徑
示例:
ansible db -m fetch -a src=/home/1.txt dest=/home/
ansible db -m fetch -a src=/var/log/messages dest=/home/
playbook示例:
cat <<EOF >fetch.yml
- hosts: db
tasks:
- name: test fetch
fetch:
src: /var/log/messages
dest: /home/
EOF
ansible-playbook fetch.yml
4.yum模塊
only works on Python 2.
- state 用於描述安裝包最終狀態,present/latest用於安裝包,absent用於remove安裝包
- list 列出軟體包
示例:安裝httpd
ansible db -m yum -a name=httpd
示例:卸載httpd
ansible db -m yum -a name=httpd state=absent
示例:列出某包 = yum list
ansible db -m yum -a list=wget
playbook示例:安裝httpd和vim
cat <<EOF >httpd_install.yml
- hosts: db
tasks:
- name: install httpd
yum:
name: httpd,vim
EOF
ansible-playbook httpd_install.yml
playbook示例:卸載httpd
cat <<EOF >httpd_remove.yml
- hosts: db
tasks:
- name: install httpd
yum:
name: httpd
state: absent
EOF
ansible-playbook httpd_remove.yml
5.shell模塊:
- chdir 在運行命令之前進入此目錄
- creates 一個文件名,如果這個文件存在的話,就不執行
- removes 一個文件名,如果這個文件不存在的話,就不執行
- executable 可執行文件的絕對路徑
- somescript.sh >> somelog.txt 將執行結果重定向到某文件
playbook示例:copy文件到遠程主機並執行
cat <<EOF >shell.yml
- hosts: db
tasks:
- name: copy docker install file
copy:
src: /home/Docker18.09_CentOS7.6/
dest: /home/Docker18.09_CentOS7.6/
mode: u+x
- name: install docker
shell:
chdir: /home/Docker18.09_CentOS7.6/
cmd: /home/Docker18.09_CentOS7.6/1_install_docker.sh
EOF
ansible-playbook shell.yml
附錄:命令幫助
[root@centos181001 ~]# ansible --help
Usage: ansible <host-pattern> [options]
Define and run a single task playbook against a set of hosts
針對一組主機定義並運行單個任務「playbook」
Options:
-a MODULE_ARGS, --args=MODULE_ARGS
module arguments
模塊參數
--ask-vault-pass ask for vault password
詢問保管庫密碼
-B SECONDS, --background=SECONDS
run asynchronously, failing after X seconds
(default=N/A)
非同步運行,X秒後失敗
-C, --check dont make any changes; instead, try to predict some
of the changes that may occur
不做任何改變; 相反,嘗試預測可能發生的一些變化
-D, --diff when changing (small) files and templates, show the
differences in those files; works great with --check
105/5000
更改(小)文件和模板時,顯示這些文件的差異; 與--check一起使用效果很好
-e EXTRA_VARS, --extra-vars=EXTRA_VARS
set additional variables as key=value or YAML/JSON, if
filename prepend with @
將其他變數設置為key = value或YAML / JSON,如果filename前綴為@
-f FORKS, --forks=FORKS
specify number of parallel processes to use
(default=5)
指定要使用的並行進程數
-h, --help show this help message and exit
顯示幫助信息並退出
-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY
specify inventory host path or comma separated host
list. --inventory-file is deprecated
指定庫存主機路徑或逗號分隔的主機列表。 --inventory-file已棄用
-l SUBSET, --limit=SUBSET
further limit selected hosts to an additional pattern
進一步將所選主機限制為其他模式
--list-hosts outputs a list of matching hosts; does not execute
anything else
輸出匹配主機列表; 不會執行任何其他操作
-m MODULE_NAME, --module-name=MODULE_NAME
module name to execute (default=command)
要執行的模塊名稱(default = command)
-M MODULE_PATH, --module-path=MODULE_PATH
prepend colon-separated path(s) to module library
(default=[u/root/.ansible/plugins/modules,
u/usr/share/ansible/plugins/modules])
將冒號分隔的路徑預先添加到模塊庫
-o, --one-line condense output
濃縮輸出
--playbook-dir=BASEDIR
Since this tool does not use playbooks, use this as a
subsitute playbook directory.This sets the relative
path for many features including roles/ group_vars/
etc.
手動指定playbook目錄
-P POLL_INTERVAL, --poll=POLL_INTERVAL
set the poll interval if using -B (default=15)
如果使用-B(默認值= 15),則設置輪詢間隔
--syntax-check perform a syntax check on the playbook, but do not
execute it
對playbook執行語法檢查,但不執行它
-t TREE, --tree=TREE log output to this directory
將輸出記錄到此目錄
--vault-id=VAULT_IDS the vault identity to use
要使用的保管庫標識
--vault-password-file=VAULT_PASSWORD_FILES
vault password file
保管庫密碼文件
-v, --verbose verbose mode (-vvv for more, -vvvv to enable
connection debugging)
詳細模式(-vvv表示更多,-vvvv表示啟用連接調試)
--version show programs version number and exit
顯示程序的版本號並退出
Connection Options:連接選項
control as whom and how to connect to hosts
控制誰以及如何連接到主機
-k, --ask-pass ask for connection password
詢問連接密碼
--private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE
use this file to authenticate the connection
使用此文件來驗證連接
-u REMOTE_USER, --user=REMOTE_USER
connect as this user (default=None)
以此用戶身份連接(默認=無)
-c CONNECTION, --connection=CONNECTION
connection type to use (default=smart)
要使用的連接類型(默認=智能)
-T TIMEOUT, --timeout=TIMEOUT
override the connection timeout in seconds
(default=10)
以秒為單位覆蓋連接超時
--ssh-common-args=SSH_COMMON_ARGS
specify common arguments to pass to sftp/scp/ssh (e.g.
ProxyCommand)
指定傳遞給sftp / scp / ssh的公共參數(例如ProxyCommand)
--sftp-extra-args=SFTP_EXTRA_ARGS
specify extra arguments to pass to sftp only (e.g. -f,
-l)
指定僅傳遞給sftp的額外參數(例如-f,-l)
--scp-extra-args=SCP_EXTRA_ARGS
specify extra arguments to pass to scp only (e.g. -l)
指定僅傳遞給scp的額外參數(例如-l)
--ssh-extra-args=SSH_EXTRA_ARGS
specify extra arguments to pass to ssh only (e.g. -R)
指定僅傳遞給ssh的額外參數(例如-R)
Privilege Escalation Options:特權升級選項:
control how and which user you become as on target hosts
控制您在目標主機上的身份和方式
-s, --sudo run operations with sudo (nopasswd) (deprecated, use
become)
-U SUDO_USER, --sudo-user=SUDO_USER
desired sudo user (default=root) (deprecated, use
become)
-S, --su run operations with su (deprecated, use become)
-R SU_USER, --su-user=SU_USER
run operations with su as this user (default=None)
(deprecated, use become)
-b, --become run operations with become (does not imply password
prompting)
用run運行操作(不暗示密碼提示)
--become-method=BECOME_METHOD
privilege escalation method to use (default=sudo),
valid choices: [ sudo | su | pbrun | pfexec | doas |
dzdo | ksu | runas | pmrun ]
要使用的許可權升級方法(默認= sudo),有效選擇:
--become-user=BECOME_USER
run operations as this user (default=root)
以此用戶身份運行操作(默認= root)
--ask-sudo-pass ask for sudo password (deprecated, use become)
請求sudo密碼(不推薦使用,使用成為)
--ask-su-pass ask for su password (deprecated, use become)
請求su密碼(不建議使用,使用成為)
-K, --ask-become-pass
ask for privilege escalation password
要求提供許可權提升密碼
Some modules do not make sense in Ad-Hoc (include, meta, etc)
Ad-Hoc中的某些模塊沒有意義(include,meta等)
推薦閱讀:
TAG:Linux運維 |