一、Ansible相關(guān)
1、簡(jiǎn)介
Ansible是自動(dòng)化運(yùn)維工具,基于Python開(kāi)發(fā),分布式,無(wú)需客戶(hù)端,輕量級(jí),實(shí)現(xiàn)了批量系統(tǒng)配置、批量程序部署、批量運(yùn)行命令等功能,ansible是基于模塊工作的,本身沒(méi)有批量部署的能力。真正具有批量部署的是ansible所運(yùn)行的模塊,ansible只是提供一種框架。
2、Ansible特性
1)、no agents:不需要在被管控主機(jī)上安裝任何客戶(hù)端,更新時(shí),只需在操作機(jī)上進(jìn)行一次更新即可(不用安裝客戶(hù)端。分布式的)
2)、no server:無(wú)服務(wù)器端,使用時(shí)直接運(yùn)行命令即可
3)、modules in any languages:基于模塊工作,可使用任意語(yǔ)言開(kāi)發(fā)模塊
4)、yaml,not code:使用yaml語(yǔ)言定制劇本playbook
5)、ssh by default:基于SSH工作
6)、strong multi-tier solution:可實(shí)現(xiàn)多級(jí)指揮
3、Ansible常用模塊
語(yǔ)法結(jié)構(gòu)
## ansible <pattern> -m <module_name> -a <arguments>
pattern--主機(jī)清單里定義的主機(jī)組名,主機(jī)名,IP,別名等,all表示所有的主機(jī),支持通配符,正則
-m module_name: 模塊名稱(chēng),默認(rèn)為command
-a arguments: 傳遞給模塊的參數(shù)
-o 單行顯示
ping模塊
##ping模塊使用擴(kuò)展
1.指定單臺(tái)機(jī)器:
[root@ansible-server ~]# ansible ansible-web1 -m ping -o
2.同時(shí)指定多臺(tái)機(jī)器:
[root@ansible-server ~]# ansible ansible-web1,ansible-web2 -m ping -o
3.指定組名:
[root@ansible-server ~]# ansible webservers1 -m ping -o
[root@ansible-server ~]# ansible all -m ping -o
copy模塊
1.遠(yuǎn)程復(fù)制備份模塊:copy
模塊參數(shù)詳解:
src=:指定源文件路徑
dest=:目標(biāo)地址(拷貝到哪里)
owner:指定屬主
group:指定屬組
mode:指定權(quán)限,可以以數(shù)字指定比如0644
backup:在覆蓋之前將原文件備份,備份文件包含時(shí)間信息。有兩個(gè)選項(xiàng):yes|no
[root@ansible-server ~]# vim a.txt #創(chuàng)建一個(gè)測(cè)試文件
123123
[root@ansible-server ~]# ansible ball -m copy -a 'src=/root/a.txt dest=/opt owner=root group=root mode=644' -o
[root@ansible-server ~]# vim a.txt #追加如下內(nèi)容
123123
234234
[root@ansible-server ~]# ansible ball -m copy -a 'src=/root/a.txt dest=/opt/ owner=root group=root mode=644 backup=true' -o
注釋?zhuān)喝绻募](méi)有變化,不會(huì)備份。只有文件內(nèi)容不同,才會(huì)做備份。
登錄被控制機(jī)器其中一臺(tái)查看
[root@ansible-web1 ~]# cat /opt/a.txt.15301.2019-09-01\@00\:35\:18~
[root@ansible-server ~]# ansible weball -m shell -a 'mv /mnt/qf.txt /tmp' -o
移動(dòng)被控制節(jié)點(diǎn)的文件
yum模塊
2.軟件包管理 yum模塊
安裝apache
[root@ansible-server ~]# ansible webservers1 -m yum -a "name=httpd state=latest" -o
state= #狀態(tài)是什么,干什么
state=absent 用于remove安裝包
state=latest 表示最新的
state=removed 表示卸載
卸載軟件:
[root@ansible-server ~]# ansible webservers1 -m yum -a "name=httpd state=removed" -o
或者
[root@ansible-server ~]# ansible webservers1 -m yum -a "name=httpd state=absent" -o
service模塊
3.服務(wù)管理service模塊
[root@ansible-server ~]# ansible webservers1 -m service -a "name=httpd state=started" #啟動(dòng)
[root@ansible-server ~]# ansible webservers1 -m service -a "name=httpd state=stopped" #停止
[root@ansible-server ~]# ansible webservers1 -m service -a "name=httpd state=restarted" #重啟
[root@ansible-server ~]# ansible webservers1 -m service -a "name=httpd state=started enabled=yes" #開(kāi)機(jī)啟動(dòng)
[root@ansible-server ~]# ansible webservers1 -m service -a "name=httpd state=started enabled=no" #開(kāi)機(jī)關(guān)閉
file模塊
4.文件模塊file
模塊參數(shù)詳解:
owner:修改屬主
group:修改屬組
mode:修改權(quán)限
path=:要修改文件的路徑
recurse:遞歸的設(shè)置文件的屬性,只對(duì)目錄有效
yes:表示使用遞歸設(shè)置
state:
touch:創(chuàng)建一個(gè)新的空文件
directory:創(chuàng)建一個(gè)新的目錄,當(dāng)目錄存在時(shí)不會(huì)進(jìn)行修改
#創(chuàng)建一個(gè)文件
[root@ansible-server ~]# ansible webservers1 -m file -a 'path=/tmp/youngfit1.txt mode=777 state=touch'
[root@ansible-server ~]# ansible ansible-web2 -m file -a 'path=/tmp/youngfit2.txt mode=777 owner=nginx state=touch'
#創(chuàng)建一個(gè)目錄
[root@ansible-server ~]# ansible webservers1 -m file -a 'path=/tmp/qf mode=777 state=directory'
被控節(jié)點(diǎn)ansible-web2操作:
[root@ansible-web2 tmp]# cd /opt/
[root@ansible-web2 opt]# ll haha
total 0
-rw-r--r--. 1 root root 0 Sep 12 09:41 haha2.txt
-rw-r--r--. 1 nginx root 0 Sep 12 09:41 haha.txt
[root@ansible-server ~]# ansible ansible-web2 -m file -a "path=/opt/haha owner=nginx group=nginx state=directory recurse=yes"
被控節(jié)點(diǎn)查看:
[root@ansible-web2 opt]# ll haha
total 0
-rw-r--r--. 1 nginx nginx 0 Sep 12 09:41 haha2.txt
-rw-r--r--. 1 nginx nginx 0 Sep 12 09:41 haha.txt
setup模塊
5.收集信息模塊setup
[root@ansible-server ~]# ansible webservers1 -m setup #收集所有信息
[root@ansible-server ~]# ansible webservers1 -m setup -a 'filter=ansible_all_ipv4_addresses' #只查詢(xún)ipv4的地址
filter:過(guò)濾
模塊擴(kuò)展知識(shí)點(diǎn)
ansible的shell模塊與commend模塊的區(qū)別:
不加 -m ?默認(rèn)是 command 模塊
command模塊不是調(diào)用的shell的指令,所以沒(méi)有bash的環(huán)境變量,也不能使用shell的一些操作方式,其他和shell沒(méi)有區(qū)別
二、準(zhǔn)備環(huán)境
主機(jī):4臺(tái) 1個(gè)控制節(jié)點(diǎn) 3個(gè)被控制節(jié)點(diǎn)
解析:本地互相解析(所有機(jī)器)
## vim /etc/hosts
192.168.85.128 nsible-server (控制節(jié)點(diǎn)服務(wù)器端)
192.168.85.129 ansible-web1
192.168.85.132 ansible-web2
192.168.85.133 ansible-web3
##配置ssh公鑰認(rèn)證:控制節(jié)點(diǎn)需要發(fā)送ssh公鑰給所有被控制節(jié)點(diǎn)
[root@ansible-server ~]# ssh-keygen
[root@ansible-server ~]# ssh-copy-id -i 192.168.85.129 #所有被控節(jié)點(diǎn)機(jī)器
[root@ansible-server ~]# ssh-copy-id -i 192.168.85.132
[root@ansible-server ~]# ssh-copy-id -i 192.168.85.133
##所有機(jī)器:
systemctl stop firewalld && setenforce 0
三、安裝配置與測(cè)試(在控制節(jié)點(diǎn)上安裝即可)
1、安裝所需的擴(kuò)展yum源
[root@ansible-server ~]# yum install -y epel-release
2、安裝并查看版本
##安裝ansible
[root@ansible-server ~]# yum install -y ansible
##查看版本
[root@ansiable-server ~]# ansible --version
##看幫助
[root@ansible-server ~]# ansible --help
3、配置------inventory主機(jī)清單清單文件(默認(rèn)位置/etc/ansible/hosts)
注:inventory文件通常用于定義要管理主機(jī)的認(rèn)證信息,例如ssh登錄用戶(hù)名、密碼以及key相關(guān)信息。主配置文件:/etc/ansible/ansible.cfg ?#主要設(shè)置一些ansible初始化的信息,比如日志存放路徑、模塊、等配置信息
1)、配置
[root@ansible-server ~]# vim /etc/ansible/hosts
##1、單獨(dú)指定主機(jī),可以使用主機(jī)名稱(chēng)或IP地址
ansible-web1
##如果未解析添加ip
192.186.85.132
##如果解析添加主機(jī)名
ansible-web3
##2、使用[]標(biāo)簽指定主機(jī)組 ----標(biāo)簽自定義
[webservers1] #組一
ansible-web1
[webservers2] #組二
ansible-web2
[webservers1] #組三
ansible-web3
##3、組可以包含其他組:
[all:children] #children-照寫(xiě) #all包括三個(gè)子組
webservers1 #組一
webservers2 #組二
webservers3 #組三
##4.為一個(gè)組指定變量,組內(nèi)每個(gè)主機(jī)都可以使用該變量:
[weball:vars] #設(shè)置變量,vars--照寫(xiě)
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_private_key_file=/root/.ssh/id_rsa
##ansible_ssh_pass=test #也可以定義密碼,如果沒(méi)有互傳秘鑰可以使用密碼。
2)、擴(kuò)展(Ansible Inventory 常見(jiàn)的內(nèi)置參數(shù))
3)、使用命令查看是否聯(lián)通被控制節(jié)點(diǎn)
##語(yǔ)法:ansible 組名 --list-hosts
[root@ansible-server ~]# ansible all --list-hosts
hosts (3):
ansible-web1
ansible-web2
ansible-web3
##使用ping模塊
[root@ansible-server ~]# ansible -i all -m ping -o
##注釋?zhuān)喝绻煌?,手?dòng)連接第一次,第一次需要手動(dòng)輸入密碼。"第一次"
-i:指定清單文件
##注意:這里的ping并不是真正意義上的ping而是探測(cè)遠(yuǎn)程主機(jī)ssh是否可以連接!判斷ssh端口是否存活
-o:單行顯示
4)、測(cè)試
1.給節(jié)點(diǎn)增加用戶(hù):
[root@ansible-server ~]# ansible webservers1 -m shell -a 'useradd tom'
ansible-web1 | CHANGED | rc=0 >>
[root@ansible-server ~]# ansible webservers1 -m shell -a 'grep tom /etc/passwd'
ansible-web1 | CHANGED | rc=0 >>
tom:x:1000:1000::/home/tom:/bin/bash
重定向輸出到本地文件中:
[root@ansible-server ~]# ansible webservers1 -m shell -a 'df -Th' > /opt/a.txt
[root@ansible-server ~]# cat /opt/a.txt
ansible-web1 | CHANGED | rc=0 >>
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 18G 1.1G 17G 6% /
devtmpfs devtmpfs 226M 0 226M 0% /dev
tmpfs tmpfs 237M 0 237M 0% /dev/shm
tmpfs tmpfs 237M 4.7M 232M 2% /run
tmpfs tmpfs 237M 0 237M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 125M 890M 13% /boot
tmpfs tmpfs 48M 0 48M 0% /run/user/0
四、ansible-playbook(劇本)
1、Playbook介紹
playbook是ansible用于配置,部署,和管理被控節(jié)點(diǎn)的劇本。通過(guò)playbook的詳細(xì)描述,執(zhí)行其中的tasks,可以讓遠(yuǎn)端主機(jī)達(dá)到預(yù)期的狀態(tài)。playbook是由一個(gè)或多個(gè)”play”組成的列表。 當(dāng)對(duì)一臺(tái)機(jī)器做環(huán)境初始化的時(shí)候往往需要不止做一件事情,這時(shí)使用playbook會(huì)更加適合。通過(guò)playbook你可以一次在多臺(tái)機(jī)器執(zhí)行多個(gè)指令。通過(guò)這種預(yù)先設(shè)計(jì)的配置保持了機(jī)器的配置統(tǒng)一,并很簡(jiǎn)單的執(zhí)行日常任務(wù)。
ansible通過(guò)不同的模塊實(shí)現(xiàn)相應(yīng)的管理,管理的方式通過(guò)定義的清單文件(hosts)所管理的主機(jī)包括認(rèn)證的方式連接的端口等。所有的功能都是通過(guò)調(diào)用不同的模塊(modules)來(lái)完成不同的功能的。不管是執(zhí)行單條命令還是play-book都是基于清單文件。
playbook格式
playbook由yaml語(yǔ)言編寫(xiě),便于人理解和閱讀,同時(shí)便于書(shū)寫(xiě)。
一個(gè)劇本里面可以有多個(gè)play,每個(gè)play只能有一個(gè)tasks,每個(gè)tasks可以有多個(gè)name
2、核心元素
核心元素:
Playbooks ?
Variables ? ? #變量元素,可傳遞給Tasks/Templates使用; ?
Tasks ? ? ? ? ?#任務(wù)元素,由模塊定義的操作的列表,即調(diào)用模塊完成任務(wù); ?
Templates ? #模板元素,使用了模板語(yǔ)法的文本文件; ?
Handlers ? ? #處理器元素,通常指在某事件滿(mǎn)足時(shí)觸發(fā)的操作; ?
Roles ? ? ? ? ?#角色元素
3、與基礎(chǔ)組件
name:
? ? 定義playbook或者task的名稱(chēng)(描述信息),每一個(gè)play都可以完成一個(gè)任務(wù)。
hosts:?
? ? hosts用于指定要執(zhí)行指定任務(wù)的主機(jī).
user:
? ? remote_user則用于指定遠(yuǎn)程主機(jī)上的執(zhí)行任務(wù)的用戶(hù)
tasks:
? ? 任務(wù)列表play的主體部分是task list. task list中的各任務(wù)按次序逐個(gè)在hosts中指定的所有主機(jī)上執(zhí)行,即在所有主機(jī)上完成第一個(gè)任務(wù)后再開(kāi)始第二個(gè)。
vars:
? ?定義變量(如果不使用內(nèi)部變量需要提前定義)
vars_files:
? 調(diào)用定義變量文件
notify:
? ? 任務(wù)執(zhí)行結(jié)果如果是發(fā)生更改了的則觸發(fā)定義在handler的任務(wù)執(zhí)行
handlers:
? ? 用于當(dāng)前關(guān)注的資源發(fā)生變化時(shí)采取一定指定的操作文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-691848.html
3、案例
1)、創(chuàng)建文件
[root@ansible-server ~]# cd /etc/ansible/
[root@ansible-server ansible]# vim test.yml #創(chuàng)建文件必須以.yml/.yaml結(jié)尾
---
- hosts: webservers1
user: root
tasks:
- name: playbook_test
file: state=touch path=/tmp/playbook.txt
===================================================================================
參數(shù)解釋?zhuān)? hosts: 參數(shù)指定了對(duì)哪些主機(jī)進(jìn)行操作;
user: 參數(shù)指定了使用什么用戶(hù)登錄遠(yuǎn)程主機(jī)操作;
tasks: 指定了一個(gè)任務(wù).
name:參數(shù)同樣是對(duì)任務(wù)的描述,在執(zhí)行過(guò)程中會(huì)打印出來(lái)。
檢測(cè)語(yǔ)法:
[root@ansible-server ansible]# ansible-playbook --syntax-check test.yml
playbook: test.yml
運(yùn)行Playbook:
[root@ansible-server ansible]# ansible-playbook test.yml #加劇本名稱(chēng)
2)、handlers:由特定條件觸發(fā)的Tasks
handlers:由特定條件觸發(fā)的Tasks
handlers:處理器
notify:觸發(fā)器
語(yǔ)法:
tasks:
- name: TASK_NAME
module: arguments #1.上面任務(wù)執(zhí)行成功,然后
notify: HANDLER_NAME #2.通知他
handlers:
- name: HANDLER_NAME #3.一一對(duì)應(yīng),這里的描述與notify定義的必須一樣
module: arguments #4.執(zhí)行這個(gè)命令
=======================================================
[root@ansible-server ansible]# vim handlers.yml
- hosts: webservers1
user: root
tasks:
- name: test copy
copy: src=/root/a.txt dest=/mnt
notify: test handlers
handlers:
- name: test handlers
shell: echo "abcd" >> /mnt/a.txt
========================================================
說(shuō)明:只有 copy 模塊真正執(zhí)行后,才會(huì)去調(diào)用下面的 handlers 相關(guān)的操作,追加內(nèi)容。所以這種比較適合配置文件發(fā)生更改后,需要重啟服務(wù)的操作。
檢測(cè)語(yǔ)法:
[root@ansible-server ansible]# ansible-playbook --syntax-check handlers.yml
playbook: handlers.yml
[root@ansible-server ansible]# ansible-playbook handlers.yml
3)、循環(huán):迭代,需要重復(fù)執(zhí)行的任務(wù)
循環(huán):迭代,需要重復(fù)執(zhí)行的任務(wù);
對(duì)迭代項(xiàng)的引用,固定變量名為”item”,使用with_items屬性給定要迭代的元素;
基于字符串列表元素實(shí)戰(zhàn):
[root@ansible-server ansible]# vim list.yml
- hosts: webservers2
remote_user: root
tasks:
- name: install packages
yum: name={{ item }} state=latest #相當(dāng)于for循環(huán)里面的i
with_items: #取值 。但是不支持通配符
- httpd
- php
- php-mysql
- php-mbstring
- php-gd
##新版本格式
- hosts: ansible-web1
remote_user: root
tasks:
# - name: install soft
# yum: name={{ item }} state=latest
# with_items:
# - httpd
# - sl
- name: Install common software requirements
ignore_errors: yes
become: true
yum: pkg={{ item }} state=present
with_items:
- yum-plugin-fastestmirror
- epel-release
- git
- libyaml-devel
- libnet-devel
- libnetfilter_queue-devel
- libpcap-devel
- pcre-devel
- file-devel
檢測(cè)語(yǔ)法:
[root@ansible-server ansible]# ansible-playbook --syntax-check list.yml
playbook: list.yml
執(zhí)行:
[root@ansible-server ansible]# ansible-playbook list.yml
4)、自定義vars_files變量
變量調(diào)用語(yǔ)法:
{{ var_name }}
====================================================
創(chuàng)建變量目錄:
[root@ansible-server ~]# mkdir /etc/ansible/vars
[root@ansible-server ~]# vim /etc/ansible/vars/file.yml
src_path: /root/test/a.txt
dest_path: /opt/test/
創(chuàng)建一個(gè)測(cè)試文件
[root@ansible-server vars]# mkdir /root/test
[root@ansible-server vars]# vim /root/test/a.txt #編輯測(cè)試文件
123
創(chuàng)建play-book引用變量文件:
[root@ansible-server vars]# cd /etc/ansible/
[root@ansible-server ansible]# vim vars.yml
- hosts: ansible-web1
user: root
vars_files:
- /etc/ansible/vars/file.yml
tasks:
- name: create directory
file: path={{ dest_path }} mode=755 state=directory
- name: copy file
copy: src={{ src_path }} dest={{ dest_path }}
檢測(cè)語(yǔ)法:
[root@ansible-server vars]# cd ..
[root@ansible-server ansible]# ansible-playbook --syntax-check vars.yml
playbook: vars.yml
執(zhí)行:
[root@ansible-server ansible]# ansible-playbook vars.yml
望對(duì)大家有所幫助,點(diǎn)個(gè)贊再走吧?。?!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-691848.html
到了這里,關(guān)于自動(dòng)化運(yùn)維工具-------Ansible(超詳細(xì))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!