標籤:

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運維 |