初識Ansible


ansible背景

1.什么是ansible?

     ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。

2.ansible的是怎么工作的?

ansible是基於模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。主要包括:
(1)、連接插件connection plugins:負責和被監控端實現通信;
(2)、host inventory:指定操作的主機,是一個配置文件里面定義監控的主機;
(3)、各種模塊核心模塊、command模塊、自定義模塊;
(4)、借助於插件完成記錄日志郵件等功能;
(5)、playbook:劇本執行多個任務時,非必需可以讓節點一次性運行多個任務。

ansible基礎

1.ansible安裝

yum install wget -y     #安裝wget
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo  #下載epel源文件

yum install ansible -y    #安裝ansible

 2.ansible的命令格式

-a MODULE_ARGS, --args=MODULE_ARGS  #模塊參數

-C, --check     #白跑一次,不做任何改變

-f FORKS, --forks=FORKS   #指定進程數,做並發用

 --list-hosts  #列出主機
 
-m MODULE_NAME #模塊名稱

 --syntax-check  #檢查語法

 -k, --ask-pass  ask for connection password   #指定密碼

3.查看ansible生成的配置文件

 rpm -ql ansible  

配置hosts文件,比如我有四台機器 ip段 192.168.220.133/134/135/136,此時安裝ansible機器為192.168.220.133,以下配置

vi /etc/ansible/hosts 
192.168.220.134 192.168.220.135 192.168.220.136 #將這3個機器ip寫入hosts文件中

4.ansible如何通過ssh與遠程服務器連接?

第一種: 密碼    ssh root@192.168.220.133 -->輸入root密碼即可

第二種:秘鑰 (推薦)

  • ssh -keygen  #生成秘鑰
  • ssh-copy-id root@192.168.220.134  #將秘鑰文件復制到遠程主機

當通過ansible控制量級比較大的機器的時候,使用秘鑰連接的方法最為快捷方便

5.ansible的第一個命令ping  

ping走的是icmp協議

ansible 192.168.220.134 -m ping 

#反饋如下便能建立連接

192.168.220.134 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

 

以此類推 ...

  ansible 192.168.220.135 -m ping

  ansible 192.168.220.136 -m ping

  ansible all -m ping  --->所有機器,hosts文件

  ansible 192.168.220.135,192.168.220.136 -m ping   --->探測部分機器

6.ansible分組查看機器

#在hosts文件中寫入以下配置

[web]
192.168.220.134
192.168.220.135

[cache]
192.168.220.135
192.168.220.136

[db]
192.168.220.134
192.168.220.135
192.168.220.136

ansible web --list-hosts     #用來獲取符合條件的主機

#反饋情況為:
[root@localhost ~]# ansible web --list-hosts
  hosts (2):
    192.168.220.135
    192.168.220.134

 

ansible web -m ping         #探測web組內的所有機器

ansible分組並集

  ansible web,cache -m ping    #探測web,cache兩個組的並集機器

[root@localhost ~]# ansible web,cache,db -m ping
192.168.220.135 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.220.134 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.220.136 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
#兩者組內所有

 

ansible分組交集 

  • ansible 'web:cache' -m ping  #獲取web cache兩個組交集的機器
  • ansible 'web:&cache' -m ping  #獲取web cache兩個組交集的機器
[root@localhost ~]# ansible 'web:&cache' -m ping 
192.168.220.135 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
#兩者分組中共有的

 

ansible分組差集

  ansible 'web:!cache' -m ping  #獲取web cache兩個組差集的機器

[root@localhost ~]# ansible 'web:!cache' -m ping 
192.168.220.134 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
#兩者分組中不一樣的,表現為前者分組中機器為后者沒有,

弱口令校驗

服務器密碼符合規則:

必須有大小寫字母,數字,特殊字符;

密碼必須12位以上;

密碼3個月輪換;

host-pattern的格式

  • 單個主機
  • 單個組
  • 多個組
    #交集   "web:&cache"
    
    #並集   "web:cache"    "web,cache"
    
    #差集   "web:!&cache"

     

  • 所有機器  all
  • 多個主機   

ansible常用模塊

獲取模塊的幫助信息

[root@localhost ~]# ansible-doc -h   # 顯示全部信息
Usage: ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]

-j, --json      #以json的方式返回所有模塊的信息
-l            # 列出所有的模塊
-s, --snippet # 以片段式顯示模塊的幫助信息

ansible-doc -l |wc -l     #統計ansible的模塊 2080

1.command模塊

執行命令,不支持特殊字符,如$ & < > | ;

#參數
chdir   #切換目錄 一般編譯安裝使用
    
creates   #判斷是否存在,如果存在就 不 執行,不存在,就執行

removes  #與creates正好相反

ansible web -m command -a 'pwd'      #執行web組所有機器pwd命令  ,拿到所有機器的 /root    -m表示調用模塊, -a 表示參數
ansible web -m command -a "ls /tmp"  #執行web組所有機器查看tmp目錄下的文件

ansible web -m command -a "chdir=/tmp pwd" #切換目錄到/tmp下,一般編譯安裝

ansible web -m command -a "creates=/tmp pwd"  #不被執行,直接跳過 ,因為/tmp已存在
ansible web -m command -a  "creates=/tmp2 pwd"  #執行,因為/tmp2不存在
ansible web -m command -a  "creates=/tmp2 mkdir /data" #會被執行,並且創建/data目錄,因為/tmp2不存在

ansible web -m command -a "removes=/tmp2 pwd" #不執行,因為tmp2不存在
ansible web -m command -a "removes=/tmp pwd" #執行

 補充:

#查看用戶是否被成功創建
1. ll /home
2. tail -1 /etc/passwd #查看passwd文件(存放密碼)最后一行
3. tail  /etc/shadow   #查看shadow(存放用戶信息)
4. id coco   #查詢指定用戶id

#給用戶設置密碼,不需要二次確認
先創建一個用戶 useradd Sheldon
echo "ni666" |passwd --stdin Sheldon  

#單引號和雙引號在echo命令的不同
[root@localhost ~]# name=coco
[root@localhost ~]# echo "$name"
coco
[root@localhost ~]# echo '$name'
$coco

 

2.shell模塊

執行遠程機器上的shell腳本或python腳本

ansible web -m shell -a "echo 'coco'|passwd --stdin coco " #給遠程機器設置用戶密碼,前提是遠程主機上有coco賬戶

# shell 腳本
要在文件頂部寫上#!/bin/bash
ansible 192.168.220.134 -m  shell -a "bash /data/a.sh" #執行shell a.sh腳本內容,前提是該機器有這個文件,並有內容  

#示例1
ansible 192.168.220.134 -m shell  -a "chmod u+x /data/a.sh"  #先遠程將a.sh腳本改成可執行
ansible 192.168.220.134 -m shell  -a "/data/a.sh"  #遠程執行腳本


# python腳本

開頭寫上如下兩句
#!/bin/env python 
#coding:utf-8

ansible 192.168.220.134 -m shell -a "python /root/b.py"  #調用python解釋器運行

ansible 192.168.220.134 -m shell -a " /root/b.py"  #自己將該目錄下的b.py權限設置為可執行的即可  chmod u+x /root/b.py

 

3.script模塊

執行的是管控機/本地的腳本

ansible db -m script -a "python /root/a.py"  #執行的是本地的腳本,管控機上的腳本

ansible db -m script -a "creates=/root/a.py /root/a.sh" # 判斷是遠程主機是否存在,如果存在,就不執行,如果不存在,就執行
ansible db -m script -a "removes=/root/a.py /root/a.sh" # 判斷是遠程主機是否存在,如果存在,就不執行,如果不存在,就執行

#以上也就是多了個遠程主機的條件,但是執行的是本地的腳本

 

4.copy模塊

將本地文件復制到遠程機上

#參數
backup     #創建備份文件,以時間戳結尾
content    #直接寫內容
dest       #目標地址
group      #文件的屬組
mode       #文件的權限W2 R4  X1
owner      #文件的屬主
src        #源文件 

ansible db -m copy  -a "src=/root/a.py dest=/root/a.py" #復制本地文件到遠程主機
ansible db -m copy -a "src=/root/a.py dest=/data/a.py mode=755" #復制文件到遠程主機指定路徑,並且改變文件權限
ansible db -m copy -a "src=/root/a.py dest=/data/a.py mode=755 owner=coco" #復制文件到遠程主機指定路徑,改變文件權限 屬主,根據md5值進行比對,注意coco需要在遠程主機建立該用戶.

ansible db -m copy -a "src=/etc/init.d dest=/tmp/" #復制文件夾
ansible db -m copy -a "src=/etc/init.d/ dest=/tmp/" #復制文件夾下面的所有文件
ansible db -m copy -a "src=/etc/init.d dest=/tmp/ owner=coco " #復制文件夾,並改變文件夾的屬性,文件夾的文件的屬性也會跟着改變

ansible  db -m copy -a "content='生活需要勇氣' dest=/tmp/a.sh"   #覆蓋寫入文字,慎用

ansible db -m copy -a "src=/root/a.py dest=/data/a.py mode=755 owner=coco backup=yes"  #注意: 備份文件,如果遠程機器上沒有要備份的文件,即使指定了backup=yes也不會去備份文件

 

5.file模塊

在遠程主機上創建文件,文件夾,軟連接,硬鏈接

#參數
access_time   #訪問事件
group         #屬組
mode          #權限
owner         #屬主
path          #路徑
src           #原文件,link和hard的時候使用
state:
    directory  文件夾
    file
    touch      空文件
    link       軟連接:
    hard       硬鏈接
    absent     刪除

補充:
#軟連接:windows的快捷方式 ln -s 原文件 目標文件     源文件改變,目標文件也改變,可以跨越分區,源文件刪除,鏈接失效

#硬鏈接:指向同一個硬盤的地址 ln 原文件  目標文件    原文件改變,目標文件也改變,不可以跨越分區,原文件刪除,不會受影響

#軟連接類似於python中的淺拷貝,硬鏈接則是像極了深拷貝

 示例

ansible db -m file -a "path=/data/temp state=directory" #在遠程機上創建一個目錄

ansible db -m file -a "path=/data/task state=directory owner=coco mode=644"  #在遠程機上創建一個屬主為coco 且權限為drw - r -r 權限的目錄

ansible db -m file -a "path=/data/aiqing.txt state=touch owner=coco mode=644" #在遠程機上創建一個屬主為coco 的文件

ansible db -m file -a "path=/tmp/fffff src=/data/aiqing.txt state=link"  #在遠程機創建一個軟連接

ansible db -m file -a "path=/tmp/fffff state=absent"  #刪除軟連接

------------ 平常心 ------------ 面對 ------------ ALL DIFFICULTIES ------------ 勤能補拙,熟能生巧 ------------

1- 獲取db組/opt目錄下文件

2- 創建icon用戶,並設置密碼為xiaokeai

3- 在/tmp目錄下生成aa.txt文件,文件的內容為"大弦嘈嘈如急雨,小弦切切如私語,嘈嘈切切錯雜彈,大珠小珠落玉盤"

4- 將本地的網卡配置文件復制到遠程機器上,並命名為network,用戶為icon,用戶組為icon,權限為744

5- 在/opt目錄下創建ab.py文件,並指定用戶為icon,用戶組為icon,權限為744

6- 在/opt目錄下創建canglaoshi目錄
小小練習
1. ansible db -m command -a "ls /opt"

2. [root@localhost ~]# ansible db -m command -a "useradd icon"

[root@localhost ~]# ansible db -m shell -a "echo 'xiaokeai'|passwd --stdin 'icon' "   #由於command模塊不支持特殊字符,因此需要shell模塊支持

3. [root@localhost ~]# ansible db -m copy -a "content='大弦嘈嘈如急雨,小弦切切如私語,嘈嘈切切錯雜彈,大珠小珠落玉盤' dest=/tmp/aa.txt"

4.[root@localhost ~]# ansible db -m copy -a "src=/etc/sysconfig/network-scripts/ifcfg-ens33 dest=/opt/network group=icon owner=icon mode=744"

5. ansible db -m file -a "path=/opt/ab.py state=touch group=icon owner=icon mode=744"

6. ansible db -m file -a "path=/opt/canglaoshi state=directory"
小小練習答案

 6.fetch模塊   

fetch (英 /fetʃ/ vt.取來) 將遠程主機器上的文件拉取到本地/管控機,以ip或者主機名生成目錄,並保留原先目錄結構

#fetch ---參數
dest   #目標地址
src     #源地址

ansible web -m fetch -a "dest=/data src=/data/a.py"  
#注意拉取遠程主機文件的時候如果只獲取到目錄,無文件無效

 

7.yum模塊

① yum與rpm的區別

  rpm適用於所有環境,而yum要搭建本地yum源才可以使用;

  yum是上層管理工具,自動解決依賴關系,而rpm是底層管理工具。

② yum 源的配置

#配置信息  /etc/yum.repos.d/epel.repo
[epel]  #名稱
name=Extra Packages for Enterprise Linux 7 - $basearch  #描述信息
baseurl=http://mirrors.aliyun.com/epel/7/$basearch      #yum源的地址
failovermethod=priority 
enabled=1    #指定yum源是否可用,1表示可用,0則相反
gpgcheck=0   #是否檢查gpgkey文件,0表示不檢查,1表示檢查
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

 ③ 包組

  linux  --> lib     | windows ---> dll

yum grouplist  #查看包組

yum groupinstall   #安裝包組

 ④查看包安裝狀態

yum list|grep redis     #出現 @ 代表安裝成功
rpm -q redis   

rpm -qa   #查看所有安裝包
rpm -ql    #查看安裝包生成的文件

 ⑤ 參數以及使用

#yum 參數
disable_gpg_check     #是否檢查key
disablerepo                #禁用repo
name         #包名
state          #狀態    installed removed

#注意:在給遠程機器安裝包組的時候要確保遠程機器上有epel.repo 文件
ansible db -m copy -a "src=/etc/yum.repos.d/epel.repo dest=/etc/yum.repos.d/"

ansible web -m yum -a "name=python2-pip"  #安裝一個包
ansible web -m yum -a "name='@Development Tools'" # 安裝包組
ansible web -m yum -a "name=redis,python2-pip" # 同時安裝多個包
ansible web -m yum -a "name=redis state=absent" # 卸載

 

8.pip模塊

①pip命令

pip list  #查看所有的python第三方包

pip freeze > requirements.txt   #導出所有第三方包到 requirements.txt
pip install -r requirements.txt    #安裝這些包
 

 ②參數以及使用

#參數
virtualenv     #虛擬環境
name         #包名

ansible web -m pip -a "name=django==1.11.18"  
ansible web -m pip -a "name=flask"

 

9.service模塊

①相關linux常用命令

ps -ef|grep redis   #查看redis進程

ss -tnlp    #查看端口信息

#啟動服務,停止和重啟分別為stop,restart
systemctl start redis    #Centos7啟動方式
service redis start        #Centos6啟動方式

#開機自啟動
systemctl enable redis   #Centos7啟動方式
chkconfig  redis on          #Centos6啟動方式

 ②參數以及使用

enabled   #設置開機自啟動
name      #名稱
state       #狀態
    started
    stopped
    restarted    #重啟
    reload        #重新加載

ansible web -m service -a "name=redis state=strarted"  #開啟遠程機器redis
ansible web -m service -a "name=redis state=stopped"  #關閉
ansible web -m service -a "name=redis state=started enabled=yes"   #給遠程機器設置開機自啟redis

 

10.crontab模塊

crontab模塊 --->定時任務

①linux常用命令

crontab 用途:收集日志,備份數據,同步時間

* * * * * job
分 時 日 月 周 任務
0-59 0-23 1-31 1-12 0-7 job

1 * * * * job   #代表每個小時的第一分鍾執行job
2/ * * * * * job  #代表每隔2分鍾執行job
1 10-19 * * * job   #代表10到19點的第一分鍾執行job
#注意: 分鍾不要用*,最好是指定時間

crontab -l   #查看計划任務
crontab -r   # 刪除所有計划任務
crontab -e  #編輯計划任務

 ②參數以及使用

#注意 ansible中沒有crontab  它表現的為cron模塊 如下參數
day   
huor
job     #任務
minute  #分鍾
month   #
name     
state   #狀態
user   #執行計划任務的用戶
weekday  #
disabled  #禁止

ansible web -m cron -a "minute=21 job='touch /tmp/cron.txt' name=touchfile" # 設置計划任務
ansible web -m cron -a "minute=23 job='touch /tmp/cron.txt' name=touchfile4 disabled=yes" # 禁用計划任務,表現為加注釋
ansible web -m cron -a "name=touchfile4 state=absent" # 刪除計划任務

 

11.user模塊

①常用命令

關於user,必須聊聊用戶的分類

超級用戶  --- root     uid :0

其他用戶

  • 系統用戶  ---啟動服務來專門設置的用戶  1-999  Centos7    | 1-499 Centos6
  • 登錄用戶  ---普通的登錄用戶   1000-65535  Centos     | 500-65535 Centos6
#useradd 命令參數
 -d      # 指定家目錄
 -g      # 組id
 -G, --groups GROUPS  # 附加組
 -r, --system            # 創建系統用戶
 -s, --shell SHELL    # 登陸shell
 -u, --uid UID      #用戶id

useradd -s /sbin/nologin -u 2000 -d /opt/coco coco #創建用戶,指定用戶的登錄shell為不登錄, id 2000,家目錄在/opt/coco
useradd -s /sbin/nologin -G root,na  -d /opt/na na #指定附加組,最大的后面+1
useradd -r feige # 創建系統用戶,從999倒序
userdel  feige # 刪除用戶
userdel -r fei # 刪除用戶並刪除用戶的家目錄 

②參數以及使用

#參數
group   #
groups  #附件組
home    #家目錄
name    #用戶名
password    #密碼
shell    #登錄shell
remove   #刪除用戶並且刪除用戶家目錄
state    #狀態
system  #系統用戶
uid        #用戶id

ansible db -m user -a "name=dafei shell=/sbin/nologin home=/opt/dafei uid=2001 group=root"  #創建用戶,指定用戶家目錄,登錄shell情況,uid,組 

#解釋: /sbin/nologin 作用
指的是不允許login當前Linux系統。當用戶配置成/sbin/nologin時,如果再使用該用戶ssh到linux操作系統,會提示如下內容:This account is currently not available。該功能類似於封掉某個帳戶。

ansible db -m user -a "name=dafei system=yes" #創建系統用戶
ansible db -m user -a "name=xiaofei state=absent"  #刪除用戶
ansible db -m user -a "name=xiaofei state=absent remove=yes" #刪除用戶並且刪除其家目錄

 

12.group模塊

①linux常用命令

#用戶組的分類
超級組   root                      uid 0
其他組  
    系統組  uid  1-999 centos7  |  1-499 centos6
    普通組  uid  1000-65535centos7   |  500-65535 centos6
 
-g    #指定組的id
-r     #指定系統組

cat /etc/group    #查看所有組
groupadd -g 3000 xiaofei  #創建一個組id為3000的組
groupdel  xiaofei    #指定刪除改組

②參數以及使用

# 常用參數 
gid    #組id
name   #組名
state    #狀態
system    #系統組

ansible db -m group -a "name=xiaoliu"    #創建普通組
ansible db -m group -a  "name=xiaowang system=yes" #創建系統組
ansible db -m group -a "name=xiaowang state=absent" #刪除組

 

#web組操作

1 - 創建yuanyaun用戶,指定用戶的家目錄為/opt/,指定用戶的id為3000,指定用戶的附加組為root
2 - 創建tiantian用戶組
3 - 將本地的/etc/fstab 復制到遠程,並指定屬主是yuanyuan,屬組是tiantian
4 - 安裝redis並啟動,設置開機自啟動
5 - 安裝django
6 - 設置計划任務每天凌晨2點半備份/etc/目錄,tar
小小練習啦
1. ansible web -m user -a "name=yuanyuan home=/opt/ uid=3000 groups=root"

2. ansible web -m user -a "name=tiantian"

3.ansible web -m copy -a "src=/etc/fstab dest=/etc/ owner=feige group=feige" 

4.ansible web -m yum -a "name=redis"
  ansible web -m service -a "name=redis state=started enabled=yes"

5.absible web -m pip -a "name=django"

6. 30 2 * * *   tar -zvcf  alletc.tar.gz   /etc/* 
ansible web -m cron -a "minute=30 hour=2 job='tar a.tar.gz /etc/*' name=aaa"
小小練習啦答案

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM