〇、Ansible整體介紹
Ansible是一個(gè)當(dāng)時(shí)最為流行的集群部署與配置工具渗饮,在服務(wù)器配置和運(yùn)維管理的過程中有重要的作用和優(yōu)勢(shì)但汞。本文主要為結(jié)合個(gè)人的學(xué)習(xí)心得,向?qū)nsible有興趣的朋友盡可能深入簡(jiǎn)出互站、詳盡的介紹這個(gè)工具的原理和用法私蕾。
Ansible是由Ansible Inc.和Red Hat共同開發(fā)的一款開源集群配置軟件,編寫語言為python胡桃,使用時(shí)的配置文件語言為yaml踩叭。核心組件使用了paramiko和PyYaml。其中paramiko是python的ssh支持庫翠胰,而PyYaml則用于支持yaml配置文件的使用和playbook的應(yīng)用容贝。
Ansible有著非常突出的優(yōu)點(diǎn),從而使其在saltstack等集群配置工具中脫穎而出亡容。優(yōu)勢(shì)如下:
- 僅需管理主機(jī)安裝并配置即可嗤疯,所有的配置工作都通過ssh連接下發(fā)至被管理主機(jī)。
- 輕量化
- Python編寫闺兢,源代碼可讀性強(qiáng)茂缚。同時(shí)playbook使用yml配置戏罢,容易上手
- 對(duì)于集群和ECS的支持非常完美。
- 支持大量API接入脚囊,并且對(duì)于python的擴(kuò)展支持良好龟糕。
- 由于架構(gòu)出色,理論上在管理主機(jī)性能到位的情況下可以同時(shí)配置近乎無限的主機(jī)悔耘。
一讲岁、Ansible基本配置和受管主機(jī)接入
1、安裝和基本配置
- 首先是Ansible的安裝配置衬以,以CentOS為例:
$ yum install -y ansible
- 其次配置宿主機(jī)對(duì)受管機(jī)的免密登錄缓艳,如果已經(jīng)配置可以直接跳過
$ ssh-keygen -t rsa ##如果之前已經(jīng)生成過秘鑰了則不需要這一步
$ ssh-copy-id root@<agent_ip> ##向受管機(jī)配置管理機(jī)的公鑰,這一步可能需要輸入受管機(jī)密碼
- 在配置完公鑰之后記得把受管機(jī)的IP信息記錄到
/etc/ansible/hosts
文件中看峻,如果你需要使用的是之后的ansible-playbook阶淘,則需要在對(duì)應(yīng)的工作文件夾內(nèi)創(chuàng)建一個(gè)hosts文件記錄受管機(jī)IP。以下為一個(gè)標(biāo)準(zhǔn)的ansible hosts文件的格式:
172.26.0.81 ##不分組直接聲明IP
172.26.0.82:54208 ##申明特殊的ssh端口
[fangwei-test] ##申明了受管機(jī)的列表和分類名
172.26.0.83 ##直接聲明IP
Printer ansible_ssh_host=172.26.0.84 ##定義別名和IP
EMR-master ansible_ssh_host=172.26.0.85
Snipe-it ansible_ssh_host=172.26.0.86
Kubernetes ansible_ssh_host=172.26.0.87
[fangwei-test:vars] ##配置對(duì)應(yīng)的用戶等ansible變量
ansible_user=root
這里順便介紹一下hosts文件中常用的ansible變量聲明:
ansible_ssh_host ##連接目標(biāo)主機(jī)的地址
ansible_ssh_port ##連接目標(biāo)主機(jī)的端口互妓,默認(rèn) 22 時(shí)無需指定
ansible_ssh_user ##連接目標(biāo)主機(jī)默認(rèn)用戶
ansible_ssh_pass ##連接目標(biāo)主機(jī)默認(rèn)用戶密碼
ansible_ssh_connection ##目標(biāo)主機(jī)連接類型溪窒,可以是 local 、ssh 或 paramiko
ansible_ssh_private_key_file ##連接目標(biāo)主機(jī)的 ssh 私鑰冯勉,用于安全要求高的機(jī)器澈蚌。可以使用其他管理主機(jī)的公鑰來登錄特定的主機(jī)灼狰。
ansible_*_interpreter ##指定采用非 Python 的其他腳本語言
- 在這一切都配置完畢后宛瞄,可以對(duì)這個(gè)類的受管機(jī)進(jìn)行ping測(cè)試,具體為:
$ ansible fangwei-test -m ping
2. Ansible命令參數(shù)介紹
ansible本身自帶非常多的參數(shù)選項(xiàng)伏嗜,可以適配幾乎任何集群部署的需求和各種測(cè)試需求坛悉。
這些參數(shù)在ansible-playbook等延伸指令中往往也通用伐厌。
$ ansible --help
Usage: ansible <host-pattern> [options]
Define and run a single task 'playbook' against a set of hosts ##單純的ansible指令用于對(duì)一個(gè)或者一組受管機(jī)執(zhí)行一個(gè)playbook任務(wù)
普通參數(shù):
-a MODULE_ARGS, --args=MODULE_ARGS
#[重要]模塊參數(shù)
--ask-vault-pass # 要求輸入管理密碼
-B SECONDS, --background=SECONDS
#異步運(yùn)行承绸,X秒后失敗(默認(rèn)關(guān)閉)
-C, --check #不對(duì)受管機(jī)執(zhí)行任何改變,但是假設(shè)已執(zhí)行語句并返回結(jié)果(用于測(cè)試)
-D, --diff #當(dāng)改變小體積文件的時(shí)候挣轨,顯示兩者的區(qū)別军熏,常常和-C參數(shù)一起用(用于測(cè)試)
-e EXTRA_VARS, --extra-vars=EXTRA_VARS
#將其他變量設(shè)置為key = value或YAML / JSON,如果filename前綴為@
-f FORKS, --forks=FORKS
#指定要使用的并行進(jìn)程數(shù)(默認(rèn)值= 5)
-h, --help #顯示此幫助消息并退出
-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY
#指定庫存主機(jī)路徑或逗號(hào)分隔的主機(jī)列表卷扮。PS: --inventory-file已棄用
-l SUBSET, --limit=SUBSET
#進(jìn)一步將所選主機(jī)限制為其他模式
--list-hosts #輸出匹配主機(jī)列表;不會(huì)執(zhí)行任何其他操作
-m MODULE_NAME, --module-name=MODULE_NAME
##[重要]要執(zhí)行的模塊名稱(默認(rèn)為command)
-M MODULE_PATH, --module-path=MODULE_PATH
##將冒號(hào)分隔的路徑預(yù)先添加到模塊庫(默認(rèn)為[u'/root/.ansible/plugins/modules',u'/usr/share/ansible/plugins/modules'])
-o, --one-line ##壓縮輸出荡澎。
--playbook-dir=BASEDIR
##由于此工具不使用playbooks,因此將其用作替代playbook目錄晤锹。這將設(shè)置許多功能的相對(duì)路徑摩幔,包括roles/group_vars/etc. 也就是變相實(shí)現(xiàn)部分playbook功能。
-P POLL_INTERVAL, --poll=POLL_INTERVAL
##如果使用-B(默認(rèn)值= 15)鞭铆,則設(shè)置輪詢間隔或衡。
--syntax-check ##對(duì)playbook執(zhí)行語法檢查,但不執(zhí)行它.
-t TREE, --tree=TREE ##將輸出記錄到此目錄
--vault-id=VAULT_IDS ##顯示要使用的保管庫標(biāo)識(shí)
--vault-password-file=VAULT_PASSWORD_FILES
##保管庫密碼文件
-v, --verbose ##詳細(xì)模式(-vvv表示更多,-vvvv表示啟用連接調(diào)試)
--version ##顯示ansible版本并退出
連接相關(guān)參數(shù):
主要關(guān)于控制哪些受管機(jī)以及如何連接到主機(jī)封断。
-k, --ask-pass ##要求輸入受管機(jī)密碼
--private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE
##使用特點(diǎn)文件來認(rèn)證鏈接
-u REMOTE_USER, --user=REMOTE_USER
##以特定user來進(jìn)行連接斯辰。
-c CONNECTION, --connection=CONNECTION
##要使用的連接類型(默認(rèn)=智能)
-T TIMEOUT, --timeout=TIMEOUT
##以秒為單位覆蓋連接超時(shí)(默認(rèn)值= 10)
--ssh-common-args=SSH_COMMON_ARGS
##指定傳遞給sftp / scp / ssh的公共參數(shù)(例如ProxyCommand)
--sftp-extra-args=SFTP_EXTRA_ARGS
##指定僅傳遞給sftp的額外參數(shù)(例如-f,-l)
--scp-extra-args=SCP_EXTRA_ARGS
##指定僅傳遞給scp的額外參數(shù)(例如-l)
--ssh-extra-args=SSH_EXTRA_ARGS
##指定僅傳遞給ssh的額外參數(shù)(例如-R)
特權(quán)升級(jí)參數(shù):
控制你在目標(biāo)主機(jī)上如果成為或者成為哪個(gè)用戶
-s, --sudo ##用sudo(nopasswd)運(yùn)行操作(不推薦坡疼,推薦使用--become-method)
-U SUDO_USER, --sudo-user=SUDO_USER
##所需的sudo用戶(默認(rèn)= root)(不建議使用彬呻,推薦使用--become-method)
-S, --su ##用su運(yùn)行操作 (不建議使用,推薦使用--become-method)
-R SU_USER, --su-user=SU_USER
##以su作為此用戶運(yùn)行操作(默認(rèn)=無)(不建議使用柄瑰,推薦使用--become-method)
-b, --become ##用run運(yùn)行操作(不顯示密碼提示)
--become-method=BECOME_METHOD
##要使用的權(quán)限升級(jí)方法(默認(rèn)= sudo)闸氮,可選項(xiàng)有: [ sudo | su | pbrun | pfexec | doas | dzdo | ksu | runas | pmrun | enable | machinectl ]
--become-user=BECOME_USER
##以此用戶身份運(yùn)行操作(默認(rèn)= root)
--ask-sudo-pass ##請(qǐng)求sudo密碼(不推薦使用,推薦使用--become-method)
--ask-su-pass ##請(qǐng)求su密碼 (不推薦使用教沾,推薦使用--become-method)
-K, --ask-become-pass
##要求提供權(quán)限提升密碼
二湖苞、Ansible模塊介紹與使用
Ansible內(nèi)置了海量的原生模塊和大量的用于連接第三方API的支持模塊,熟練掌握基礎(chǔ)模塊详囤,并且活用各種擴(kuò)展模塊财骨,是熟練掌握Ansible的必經(jīng)之路。這一章里面我們會(huì)對(duì)Ansible的模塊進(jìn)行基礎(chǔ)的介紹和使用案例分析藏姐。至于詳細(xì)的模塊介紹可以查看我寫的Ansible支持模塊詳表隆箩。
在ansible中查看所有的模塊只需要一個(gè)命令:
$ ansible-doc -l
如果需要查看某一個(gè)特定的模塊的詳細(xì)解釋則可以直接查詢,以ping模塊為例:
[root@Host ~]# ansible-doc ping
> PING (/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)
A trivial test module, this module always returns `pong' on successful contact. It does not make sense in playbooks, but it is useful from
`/usr/bin/ansible' to verify the ability... ##之后省略
模塊的重要性除了本身的強(qiáng)大功能外羔杨,熟練地掌握模塊也是之后playbook部分的基礎(chǔ)捌臊。一個(gè)優(yōu)秀的playbook使用者必然對(duì)常用模塊的參數(shù)了如指掌。
0兜材、Ping模塊
ping這個(gè)模塊主要用來測(cè)試能否連通目標(biāo)服務(wù)器理澎。
$ ansible test -m ping
1. Command模塊
Command模塊自如其名,就是一個(gè)很純粹的命令執(zhí)行模塊曙寡,用于在受管機(jī)上進(jìn)行命令的執(zhí)行糠爬,其本身也可以配合很多二級(jí)參數(shù)和指令進(jìn)行功能的擴(kuò)展。不支持管道功能举庶。例如最簡(jiǎn)單的查看hostname功能:
[root@Printer ~]# ansible fangwei -m command -a 'hostname'
EMRtest | CHANGED | rc=0 >>
EMR-master
Snipeit | CHANGED | rc=0 >>
localhost.localdomain
需要注意的是执隧,在沒有特地指定ansible的-m
參數(shù)的時(shí)候,默認(rèn)調(diào)用的Module就是command
户侥。
下面是command常用的幾個(gè)二級(jí)參數(shù):
- creates:判斷镀琉,當(dāng)該文件存在時(shí),則該命令不執(zhí)行
- free_form:需要執(zhí)行的Linux指令
- chdir:在執(zhí)行命令之前蕊唐,先切換到該指定的目錄
- removes:判斷屋摔,當(dāng)該文件不存在時(shí),則該選項(xiàng)不執(zhí)行
- executable:切換shell來執(zhí)行命令替梨,該執(zhí)行路徑必須是一個(gè)絕對(duì)路徑
下面為chdir的用法舉例钓试,其他的指令也是類似的用法署尤,可以自行嘗試。具體的格式為:
ansible $目標(biāo)host -a '$二級(jí)參數(shù)=$目標(biāo)文件或路徑 $待執(zhí)行指令'
[root@Printer ~]# ansible fangwei -a 'chdir=/etc/ansible ls -l'
EMRtest | CHANGED | rc=0 >>
總用量 28
-rw-r--r-- 1 root root 20277 12月 14 13:57 ansible.cfg
-rw-r--r-- 1 root root 1070 12月 26 11:26 hosts
drwxr-xr-x 2 root root 4096 12月 14 13:57 roles
2. Shell模塊(或者Raw模塊)
這個(gè)模塊的主要特點(diǎn)就是囊括了所有的command的功能和二級(jí)參數(shù)支持亚侠,并且支持管道曹体。
[root@Printer ~]# ansible fangwei -m shell -a 'ps -ef | grep crond | grep -v grep'
EMRtest | CHANGED | rc=0 >>
root 6030 1 0 2018 ? 00:00:13 /usr/sbin/crond -n
Snipeit | CHANGED | rc=0 >>
root 1042 1 0 2月12 ? 00:00:04 /usr/sbin/crond -n
3. File模塊
File模塊主要是對(duì)于文件的一些簡(jiǎn)單操作,主要是創(chuàng)建或者權(quán)限設(shè)定硝烂,已經(jīng)文件的存在判斷等箕别。
- force:在兩種情況下強(qiáng)制創(chuàng)建軟鏈接。1滞谢、源文件不存在但之后會(huì)建立的情況串稀;2、目標(biāo)軟件已存在狮杨,需要先取消之前的軟鏈接母截,然后創(chuàng)建新的軟鏈接。選項(xiàng):yes|no
- group:定義文件/目錄的屬組
- mode:定義文件/目錄的權(quán)限
- path:必選項(xiàng)橄教,定義文件/目錄的路徑
- recurse:遞歸的設(shè)置文件的屬性清寇,只對(duì)目錄有效
- src:要被鏈接到的路徑,只應(yīng)用于state=link的情況
- dest:被鏈接到的路徑护蝶,只應(yīng)用于state=link的情況
- state:
directory:如果目錄不存在华烟,創(chuàng)建目錄
file:即使文件不存在,也不會(huì)被創(chuàng)建
link:創(chuàng)建軟鏈接持灰;hard:創(chuàng)建硬鏈接
touch:如果文件不存在盔夜,則會(huì)創(chuàng)建一個(gè)新的文件,如果已存在堤魁,則更新其最后修改時(shí)間
absent:刪除目錄/文件或者取消鏈接文件
[root@Printer ~]# ansible fangwei -m file -a 'path=/root/ninngenn.cfg state=touch'
Snipeit | CHANGED => {
"changed": true,
"dest": "/root/ninngenn.cfg",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"size": 0,
"state": "file",
"uid": 0
}
EMRtest | CHANGED => {
"changed": true,
"dest": "/root/ninngenn.cfg",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"size": 0,
"state": "file",
"uid": 0
}
4. Copy模塊
Copy模塊主要用于復(fù)制文件到遠(yuǎn)程主機(jī)喂链。具體參數(shù)如下:
- backup:在覆蓋之前將源文件備份,備份文件包含時(shí)間信息妥泉,選項(xiàng):yes|no
- content:用于替代”src”椭微,可以直接設(shè)定文件的值
- directory_node:遞歸的設(shè)定目錄權(quán)限,默認(rèn)為系統(tǒng)默認(rèn)權(quán)限
- force:如果目標(biāo)主機(jī)包含該文件涛漂,但內(nèi)容不同赏表,如果設(shè)置為yes检诗,則強(qiáng)制覆蓋匈仗;如果設(shè)置為no,則只有當(dāng)目標(biāo)主機(jī)的目標(biāo)位置不存在該文件時(shí)逢慌,才復(fù)制悠轩。默認(rèn)為yes
- others:所有file模塊里的選項(xiàng)都可以在這里使用
- src:要復(fù)制到遠(yuǎn)程主機(jī)的文件在本地的地址,可以是絕對(duì)路徑攻泼,也可以是相對(duì)路徑火架。如果路徑是一個(gè)目錄鉴象,它將遞歸復(fù)制。在這種情況下何鸡,如果路徑使用“/”來結(jié)尾纺弊,則只復(fù)制目錄里的內(nèi)容,如果沒有使用“/”來結(jié)尾骡男,則包含目錄在內(nèi)的整個(gè)內(nèi)容全部復(fù)制淆游,類似于rsync
[root@Printer ~]# ansible fangwei -m copy -a 'src=/root/ninngenn.cfg dest=/root/ninngenn.cfg force=yes'
EMRtest | CHANGED => {
"changed": true,
"checksum": "458bd6a39e16bc1e00255b66c67b5cb92180166b",
"dest": "/root/ninngenn.cfg",
"gid": 0,
"group": "root",
"md5sum": "cf35206b8cca3e51082bb32ce278ed8d",
"mode": "0644",
"owner": "root",
"size": 56,
"src": "/root/.ansible/tmp/ansible-tmp-1551949966.41-24885251361529/source",
"state": "file",
"uid": 0
}
Snipeit | CHANGED => {
"changed": true,
"checksum": "458bd6a39e16bc1e00255b66c67b5cb92180166b",
"dest": "/root/ninngenn.cfg",
"gid": 0,
"group": "root",
"md5sum": "cf35206b8cca3e51082bb32ce278ed8d",
"mode": "0644",
"owner": "root",
"size": 56,
"src": "/root/.ansible/tmp/ansible-tmp-1551949966.4-190980703709511/source",
"state": "file",
"uid": 0
}
5. Service模塊
用于受管機(jī)服務(wù)的配置與管理,類似于systemd隔盛,常用選項(xiàng):
- arguments:為命令提供一些附加參數(shù)
- enabled:是否開機(jī)啟動(dòng)犹菱,選項(xiàng) yes|no
- name:必選項(xiàng),服務(wù)名稱
- pattern:定義一個(gè)模式吮炕,如果通過status指令來查看服務(wù)狀態(tài)時(shí)腊脱,沒有響應(yīng),它會(huì)通過ps命令在進(jìn)程中根據(jù)該模式進(jìn)行查找龙亲,如果匹配到陕凹,則認(rèn)為該服務(wù)依然運(yùn)行
- runlevel:運(yùn)行級(jí)別
- sleep:如果執(zhí)行了restarted,則在stop和start之間等待幾秒鐘
- state:對(duì)當(dāng)前服務(wù)執(zhí)行啟動(dòng)/停止/重啟/重新加載等操作(started/stopped/restarted/reloaded)
[root@Printer ~]# ansible fangwei -m service -a 'name=sshd state=restarted enabled=yes'
Snipeit | CHANGED => {
"changed": true,
"enabled": true,
"name": "sshd",
"state": "started"
}
EMRtest | CHANGED => {
"changed": true,
"enabled": true,
"name": "sshd",
"state": "started"
}
6. Cron模塊
類似于Linux的Crontab功能鳄炉,用來控制服務(wù)或者進(jìn)程的定時(shí)執(zhí)行功能捆姜。常用參數(shù):
- backup:對(duì)遠(yuǎn)程主機(jī)上的原計(jì)劃任務(wù)內(nèi)容修改之前做備份
- cron_file:如果指定該選項(xiàng),則用該文件替換遠(yuǎn)程主機(jī)上cron.d目錄下的用戶的任務(wù)計(jì)劃
- day:日(1-31,,/2,…)
- hour:小時(shí)(0-23,,/2,…)
- minute:分鐘(0-59,,/2,…)
- month:月(0-12,*,…)
- weekday:周(0-7,*,…)
- job:要執(zhí)行的任務(wù)迎膜,依賴于state=present
- name:該任務(wù)的描述
- special_time:指定什么時(shí)候執(zhí)行泥技,參數(shù):reboot,yearly,annually,monthly,weekly,daily,hourly
- state:確認(rèn)該任務(wù)計(jì)劃是創(chuàng)建還是刪除
- user:以哪個(gè)用戶身份執(zhí)行
[root@Printer ~]# ansible fangwei -m cron -a 'name="check home directory" minute=*/10 job="ls -lht /home"'
Snipeit | CHANGED => {
"changed": true,
"envs": [],
"jobs": [
"check home directory"
]
}
EMRtest | CHANGED => {
"changed": true,
"envs": [],
"jobs": [
"check home directory"
]
}
7. FileSystem
FileSystem模塊用于配置受管機(jī)的文件系統(tǒng)。改模塊涉及高位操作磕仅,請(qǐng)務(wù)必小心珊豹,常用參數(shù)為:
- dev:目標(biāo)塊設(shè)備
- force:在一個(gè)已有文件系統(tǒng)的設(shè)備上強(qiáng)制創(chuàng)建
- fstype:文件系統(tǒng)的類型
- opts:傳遞給mkfs命令的選項(xiàng)
[root@Printer ~]# ansible test_hosts -m filesystem -a 'dev=/dev/sdb fstype=ext4'
172.26.0.84 | SUCCESS => {
"changed": true
}
8. Mount模塊
Mount模塊用于配置受管機(jī)的磁盤掛載,高危模塊榕订,請(qǐng)慎重使用店茶,下面為常用參數(shù):
- dump:存儲(chǔ)(見fstab文件第5列)。注意劫恒,如果設(shè)置為null并且狀態(tài)設(shè)置為present贩幻,它將停止工作,并且將在后續(xù)運(yùn)行中進(jìn)行重復(fù)條目两嘴。對(duì)Solaris系統(tǒng)沒有影響丛楚。
- fstype:必選項(xiàng),文件系統(tǒng)類型憔辫,要求狀態(tài)是present或mounted
- name:必選項(xiàng)趣些,掛載點(diǎn)
- opts:傳遞給mount命令的參數(shù)
- src:必選項(xiàng),要掛載的設(shè)備路徑贰您。要求狀態(tài)是present或mounted
- state:必選項(xiàng)坏平。選項(xiàng)如下:
present:只處理fstab中的配置
absent:刪除掛載點(diǎn)
mounted:自動(dòng)創(chuàng)建掛載點(diǎn)并掛載
unmounted:卸載
[root@Ansible ~]# ansible test_hosts -m mount -a 'name=/mnt src=/dev/sdb1 fstype=ext4 state=mounted opts=rw'
172.26.0.84 | SUCCESS => {
"changed": true,
"dump": "0",
"fstab": "/etc/fstab",
"fstype": "ext4",
"name": "/mnt",
"opts": "rw",
"passno": "0",
"src": "/dev/sdb1"
9. Yum模塊
如果熟悉CentOS的朋友應(yīng)該就會(huì)知道拢操,這是使用yum包管理器來管理軟件包的模塊,參數(shù)如下:
- conf_file:yum的配置文件
- disable_gpg_check:關(guān)閉gpg_check
- disablerepo:不啟用某個(gè)源
- enablerepo:?jiǎn)⒂媚硞€(gè)源
- list:查看yum列表
- name:要進(jìn)行操作的軟件包名字舶替,也可以傳遞一個(gè)url或者一個(gè)本地的rpm包的路徑
- state:狀態(tài)(present/installed/absent/removed/latest)
[root@Printer ~]# ansible fangwei -m yum -a 'name=sl state=latest'
Snipeit | CHANGED => {
"ansible_facts": {
"pkg_mgr": "yum"
},
"changed": true,
"msg": "",
"obsoletes": {
"grub2": {
"dist": "x86_64",
"repo": "@anaconda",
"version": "1:2.02-0.65.el7.centos.2"
},
"grub2-tools": {
"dist": "x86_64",
"repo": "@anaconda",
"version": "1:2.02-0.65.el7.centos.2"
}
},
"rc": 0,
"results": [
"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * ius: dfw.mirror.rackspace.com\n * webtatic: uk.repo.webtatic.com\nResolving Dependencies\n--> Running transaction check\n---> Package sl.x86_64 0:5.02-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n sl x86_64 5.02-1.el7 epel 14 k\n\nTransaction Summary\n================================================================================\nInstall 1 Package\n\nTotal download size: 14 k\nInstalled size: 17 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : sl-5.02-1.el7.x86_64 1/1 \n Verifying : sl-5.02-1.el7.x86_64 1/1 \n\nInstalled:\n sl.x86_64 0:5.02-1.el7 \n\nComplete!\n"
]
}
EMRtest | CHANGED => {
"ansible_facts": {
"pkg_mgr": "yum"
},
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\nResolving Dependencies\n--> Running transaction check\n---> Package sl.x86_64 0:5.02-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n sl x86_64 5.02-1.el7 epel 14 k\n\nTransaction Summary\n================================================================================\nInstall 1 Package\n\nTotal download size: 14 k\nInstalled size: 17 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : sl-5.02-1.el7.x86_64 1/1 \n Verifying : sl-5.02-1.el7.x86_64 1/1 \n\nInstalled:\n sl.x86_64 0:5.02-1.el7 \n\nComplete!\n"
]
}
10. User模塊
User模塊顧名思義就是用于用戶參數(shù)設(shè)置的模塊令境。常用參數(shù):
- home:指定用戶家目錄
- group:設(shè)置用戶主組
- groups:設(shè)置用戶的附屬組
- uid:設(shè)置用戶的UID
- password:設(shè)置用戶的密碼,密碼必須為加密后的值
- name:創(chuàng)建用戶的用戶名
- createhhome:選項(xiàng)yes|no顾瞪,值為yes時(shí)才創(chuàng)建用戶家目錄
- system:選項(xiàng)yes|no展父,默認(rèn)為no,值為yes時(shí)創(chuàng)建的用戶為系統(tǒng)用戶
- remove:當(dāng)state=absent時(shí)玲昧,remove=yes則表示連同家目錄一起刪除栖茉,等價(jià)于userdel -r
- state:選項(xiàng)present|absent,創(chuàng)建用戶或刪除用戶
- shell:設(shè)置用戶的shell環(huán)境
[root@Ansible ~]# ansible test_hosts -m user -a 'name=user1 uid=1001 group=yfshare createhome=yes home=/home/user1 password="P@ssw0rd" shell=/bin/bash state=present'
172.26.0.84 | SUCCESS => {
"changed": true,
"comment": "",
"createhome": true,
"group": 1000,
"home": "/home/user1",
"name": "user1",
"password": "NOT_LOGGING_PASSWORD",
"shell": "/bin/bash",
"state": "present",
"system": false,
"uid": 1001
}
11. Group模塊
顧名思義用于配置Group信息的模塊孵延,參數(shù)如下:
- gid:設(shè)置組的GID
- name:組名
- state:選項(xiàng)為present|absent吕漂,創(chuàng)建組或刪除組
- system:選項(xiàng)為yes|no,值為yes尘应,則創(chuàng)建系統(tǒng)組
用法與User模塊雷同惶凝,不再舉例。
12. get_url模塊
主要用于從http犬钢、ftp苍鲜、https服務(wù)器上下載文件(類似于wget),主要參數(shù)如下:
- checksum:文件下載完成后進(jìn)行校驗(yàn)
- timeout:請(qǐng)求超時(shí)時(shí)間玷犹,默認(rèn)為10s
- url:文件下載地址
- url_username:用戶名混滔,基于HTTP的基本認(rèn)證
- url_password:密碼
- -use_proxy:選項(xiàng)yes|no,默認(rèn)為yes歹颓,即使用代理
- dest:下載文件存儲(chǔ)的絕對(duì)路徑
[root@Printer ~]# ansible fangwei -m get_url -a 'dest=/root url=http://172.26.0.84/file/drivers/Canon/mac-10-14-canon.dmg'
EMRtest | CHANGED => {
"changed": true,
"checksum_dest": null,
"checksum_src": "eff3bd83c5966373f04d8c4576cbbe610ba0d638",
"dest": "/root/mac-10-14-canon.dmg",
"gid": 0,
"group": "root",
"md5sum": "59b6a0a3dcb9dd3e6e46d1e8374d9c43",
"mode": "0644",
"msg": "OK (23166785 bytes)",
"owner": "root",
"size": 23166785,
"src": "/root/.ansible/tmp/ansible-tmp-1551951882.53-86480089864174/tmp_7guIp",
"state": "file",
"status_code": 200,
"uid": 0,
"url": "http://172.26.0.84/file/drivers/Canon/mac-10-14-canon.dmg"
}
Snipeit | CHANGED => {
"changed": true,
"checksum_dest": null,
"checksum_src": "eff3bd83c5966373f04d8c4576cbbe610ba0d638",
"dest": "/root/mac-10-14-canon.dmg",
"gid": 0,
"group": "root",
"md5sum": "59b6a0a3dcb9dd3e6e46d1e8374d9c43",
"mode": "0644",
"msg": "OK (23166785 bytes)",
"owner": "root",
"size": 23166785,
"src": "/root/.ansible/tmp/ansible-tmp-1551951882.52-38856232211770/tmpPLN4Wf",
"state": "file",
"status_code": 200,
"uid": 0,
"url": "http://172.26.0.84/file/drivers/Canon/mac-10-14-canon.dmg"
13. Setup模塊
playbooks自動(dòng)收集遠(yuǎn)程主機(jī)上可用變量坯屿,這些變量用于playbooks配置。
[root@Ansible ~]# ansible test_hosts -m setup
172.26.0.84 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"172.26.0.84"
],
"ansible_all_ipv6_addresses": [
"fe80:****:****:fe5c:dc6d"
],
"ansible_architecture": "x86_64",
14. Script模塊
這個(gè)模塊用于在受管機(jī)上執(zhí)行sh腳本巍扛。
[root@Ansible ~]# ansible test_hosts -m script -a '/tmp/script.sh'
Enter passphrase for key '/root/.ssh/id_rsa':
172.26.0.84 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 172.26.0.84 closed.\r\n",
"stdout": "",
"stdout_lines": []
三领跛、神器ansible-playbook的使用
1、Yaml語言
Yaml語言是一種配置語言撤奸,主要用于配置文件的設(shè)定和數(shù)據(jù)塊的儲(chǔ)存吠昭,作為一種xml語言的進(jìn)化形態(tài)出現(xiàn)。起主要的優(yōu)勢(shì)在于:
- YAML的可讀性好胧瓜。
- YAML和腳本語言的交互性好矢棚。
- YAML使用實(shí)現(xiàn)語言的數(shù)據(jù)類型。
- YAML有一個(gè)一致的信息模型贷痪。
- YAML易于實(shí)現(xiàn)幻妓。
上面5條也就是XML不足的地方。同時(shí)劫拢,YAML也有XML的下列優(yōu)點(diǎn):
- YAML可以基于流來處理肉津;
- YAML表達(dá)能力強(qiáng),擴(kuò)展性好舱沧。
總之妹沙,YAML試圖用一種比XML更敏捷的方式,來完成XML所完成的任務(wù)熟吏。
更多的內(nèi)容及規(guī)范參見yaml官網(wǎng)距糖。
語法結(jié)構(gòu)通過空格來展示岭皂。Sequence里的項(xiàng)用"-"來代表挥萌,Map里的鍵值對(duì)用":"分隔。
這幾乎就是所有的語法了机断。以下為一個(gè)標(biāo)準(zhǔn)的ansible-playbook的yaml配置文件:
---
- hosts: rotest2
roles:
- sshd
- snmp
- hostname
- vim
- parted
- authorized_keys
2帽氓、playbook模塊
<b>roles:角色</b>(主模塊趣斤,和主yaml文件、ansible配置文件黎休、host文件同在playbook根目錄浓领,同時(shí)在roles文件夾下則是各種自定義的role。在role文件夾下才包括了后續(xù)的其他次級(jí)模塊)
root@Ansible ~/ansible-test $ ls
ansible.cfg hosts roles main.yml
root@Ansible ~/ansible-test/roles $ ls
audit authorized_keys hostname megacli nrpe parted snmp sshd telegraf vim
在role文件夾下势腮,會(huì)調(diào)用下面的各個(gè)子模塊联贩,但是除了task以外都不是必須,而是可選項(xiàng)捎拯。例如這個(gè)telegraf的部署role泪幌,下面只包含了files、handlers署照、tasks三個(gè)子模塊座菠。在子模塊中我們可以調(diào)用任何ansible支持的模塊功能,尤其是<b>上一章我們介紹的那些重要功能模塊</b>藤树。
root@Ansible ~/ansible-test/roles/telegraf $ ls
files handlers tasks
- tasks:任務(wù)
- variables:變量
- templates:模板
- handlers:處理器
- files:需要的文件
3浴滴、如何使用playbook
ansible-playbook的使用基本和ansible類似,哪怕調(diào)用--help
指令查看岁钓,也是一樣的參數(shù)結(jié)果升略。一般來說由于playbook調(diào)用的模塊較多,配置的內(nèi)容較豐富屡限,后續(xù)的部署影響較大品嚣,所以在使用的時(shí)候請(qǐng)務(wù)必先調(diào)用-D -C
兩個(gè)參數(shù)進(jìn)行結(jié)果測(cè)試,排查報(bào)錯(cuò)钧大,確認(rèn)一切無誤后再進(jìn)行推送和部署翰撑。例如:
~$ ansible-playbook -i hosts ro.yml -t authorized_keys -DC
~$ ansible-playbook -i hosts ro.yml -t authorized_keys
4、使用案例
這里我們就用一個(gè)案例來對(duì)ansible-playbook進(jìn)行詳細(xì)的解釋啊央。這個(gè)案例比較完整眶诈,有助于我們方便理解涨醋。
這個(gè)案例的文件架構(gòu)為:
root@Ansible ~/ansible-test $ ls
ansible.cfg hosts roles main.yml
具體的main.yml
文件為:
root@Ansible ~/ansible-test $ cat main.yml
---
- hosts: test
roles:
- sshd
- snmp
- hostname
- vim
- parted
- authorized_keys
- telegraf
- audit
我們進(jìn)入roles
文件夾,查看具體的role內(nèi)容逝撬。
root@Ansible ~/ansible-test/roles $ ls
audit authorized_keys hostname megacli nrpe parted snmp sshd telegraf vim
<b>如果我們需要在受管機(jī)上安裝某個(gè)軟件浴骂,以telegraf這個(gè)role為例:</b>
root@Ansible ~/ansible-test/roles/telegraf $ tree
.
├── files
│ ├── telegraf-1.8.0-1.x86_64.rpm #安裝包rpm文件
│ ├── telegraf.conf #自定義的配置文件
│ └── telegraf.conf.bak #原始默認(rèn)配置文件(非必須)
├── handlers
│ └── main.yml #處理器配置
└── tasks
└── main.yml #role的任務(wù)主配置
3 directories, 5 files
-------------------------------------
root@Ansible ~/ansible-test/roles/telegraf $ cat ./tasks/main.yml
---
- name: install telegraf #配置npm的下載地址
yum: name=https://dl.influxdata.com/telegraf/releases/telegraf-1.8.0-1.x86_64.rpm state=present
tags: telegraf
- name: copy telegraf config #配置文件的復(fù)制
copy: src=telegraf.conf dest=/etc/telegraf/
notify: reload telegraf
tags: telegraf
- name: ensure service telegraf is started and enabled
service: name=telegraf state=started enabled=yes
tags: telegraf #確保在受管機(jī)上開機(jī)啟動(dòng)telegraf服務(wù)
-------------------------------------
root@Ansible ~/ansible-test/roles/telegraf $ cat ./handlers/main.yml
---
- name: reload telegraf #異常狀況重新加載
service: name=telegraf state=reloaded
而對(duì)于部分復(fù)雜的配置需求,我們甚至可以使用shell腳本來對(duì)受管機(jī)進(jìn)行相關(guān)的處理宪潮,例如磁盤掛載或者分配等系統(tǒng)級(jí)別的任務(wù)溯警。
root@Ansible ~/ansible-test/roles/parted $ ls
files tasks
-------------------------------------
root@Ansible ~/ansible-test/roles/parted $ tree
.
├── files
│ ├── parted.sh #shell腳本文件
│ └── parted.sh.bak
└── tasks
└── main.yml #主task配置
2 directories, 3 files
-------------------------------------
root@Ansible ~/ansible-test/roles/parted $ cat files/parted.sh
#!/bin/bash
OPTS="noatime,nobarrier,errors=remount-ro,nofail"
x=b
#for x in
#do
echo "mkpart /dev/vd${x}"
parted /dev/vd${x} -s mklabel gpt
parted /dev/vd${x} -s mkpart primary 1 100%
echo ">>> mkfs.ext4 /dev/vd${x}1"
mkfs.ext4 -q /dev/vd${x}1
if [ $? -eq 0 ]; then
UUID=$(blkid /dev/vd${x}1 | sed -e 's/.*\(UUID=.*\) TYPE.*/\1/')
echo -e "${UUID}\t\t/data\t\text4\t\t${OPTS}\t\t0 0" >> /etc/fstab
fi
seq=$(($seq+1))
#done #通過shell腳本進(jìn)行磁盤的分區(qū)與掛載
-------------------------------------
root@Ansible ~/ansible-test/roles/parted $ cat tasks/main.yml
---
#parted
- name: copy parted config
copy: src={{ item }} dest=~ owner=root group=root mode="0777"
with_items: #復(fù)制腳本到受管機(jī)并配置chown權(quán)限
- parted.sh #執(zhí)行shell腳本
tags: parted
關(guān)于playbook的其他功能大家可以通過實(shí)踐和閱讀其他案例來學(xué)習(xí)喳挑,ansible非常靈活,請(qǐng)務(wù)必善于使用氧敢。