自動化運維-ansible

一.ansible的前戲

1.ansible與saltstack對比

  相同點:都是爲了同時在多臺機器上執行相同的命令;node

      都是python開發;python

  不一樣點:linux

       agent(salt 控制節點須要安裝salt-master,被控節點須要安裝salt-minion,而ansible不須要,它經過ssh來鏈接並控制被控節點)nginx

       配置(salt配置麻煩,ansible基本不用配置)web

       學習路線(salt比較陡峭,ansible比較平緩)redis

       第三方工具(salt比較少)docker

       開源社區的對接(salt比較少)shell

        現有用戶(salt仍是比ansible少一些)編程

     二次開發擴展的能力(ansible比較差,尤爲是2.0之後)flask

     大規模開發(200之內同樣,200以上salt會好一些,咱們也能夠對ansible作一些配置使其在200以上追上salt)

     Windows的支持(salt會很好多)

2.準備工做

  準備四臺乾淨的虛擬機,以下:

  192.168.85.132 (主控節點,下面三個爲被控節點)

  192.168.85.133

  192.168.85.134 

  192.168.85.135

3.安裝ansible(只有主控節點192.168.85.132安裝)

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo          # 下載epel源,由於ansible須要從epel源下載
yum install -y ansible         # 安裝ansible

  ansible安裝後有一下文件

     

  hosts文件詳解:

# This is the default ansible 'hosts' file.
#
# It should live in /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 #能夠寫主機名或者ip地址
#   - A hostname/ip can be a member of multiple groups # 一臺主機能夠在多個組裏面
# ......
# www[001:006].example.com   # 表示從www001到www006的機器
# ......

4.ansible鏈接並控制被控節點 

 ssh的認證方式

    -密碼鏈接:即ssh root@192.168.xx,xxx,而後輸入密碼提交

    -祕鑰提交:ssh祕鑰登陸方式以下:

ssh-keygen            #用來生成ssh的祕鑰對,一直回車便可
ssh-copy-id 192.168.85.133    #複製祕鑰到遠程主機,回車輸入yes,再回車輸入遠程主機登陸密碼
ssh 192.168.85.85.133  #經過此命令就能夠登陸遠程主機

若是想ssh鏈接被控節點,需在hosts中先添加被控制節點地址

ansible 192.168.85.133 -m ping

當想鏈接操做多臺服務器時,能夠將服務器分組添加到hosts文件中

 

5.ansible的命令幫助

ansible <host-pattern> [options]
-a MODULE_ARGS 模塊參數
-m MODULE_NAME 模塊名稱
-f forks 指定一次執行的機器,用於高併發
-C 測試
--list-host 查看運行的機器
-V 輸出詳情的信息 

獲取文檔

ansible-doc --help
-s 指定模塊名稱
-l 列出全部的模塊

操做日誌

/var/log/message

二.ansible命令相關模塊

 1.command模塊

  執行遠程命令,可是不支持特殊字符 <> |!;$&

ansible web -a 'ls /'
ansible web -a 'pwd'
ansible wen -a 'chdir=/tmp pwd'  #切換目錄執行命令,使用場景是編譯安裝時使用
ansible web -a 'creates=/tmp pwd' #用來判斷/tmp目錄是否存在,存在就不執行操做
ansible web -a 'creates=/data pwd' #由於data不存在,全部纔會執行pwd命令
 ansible web -a 'removes=/tmp pwd' #用來判斷tmp目錄是否存在,存在就執行操做
 ansible web -a 'removes=/data pwd' #由於data不存在,全部纔不會執行

  查看用戶是否建立成功

tail -1 /etc/passwd
tail -1 /etc/shadow
id wudabing  #查看用戶id
echo '123'|passwd --stdin wudabing  #設置密碼

 2.shell模塊

  執行遠程主機的python或shell腳本,支持特殊字符

 ansible web -m shell -a 'echo "123" | passwd --stdin wudabing' # 批量建立密碼
 ansible 192.168.85.133 -m shell -a 'bash a.sh' # 執行遠程文件方式一
 ansible 192.168.85.133 -m shell -a '/root/a.sh' #執行遠程文件方式二,文件必須有執行權限
 ansible 192.168.85.133 -m shell -a '/root/a.py' # 執行遠端的Python腳本

 3.script模塊

  在遠程主機執行主控端的shell/python腳本,使用相對路徑

ansible web -m script -a '/root/m.sh' #執行本地的文件,執行管控機上的文件
ansible web -m script -a 'removes=/root/m.sh /root/m.sh' #用來判斷被管控機上是否是存在文件,若是存在就執行,不存在就不執行
ansible web -m script -a 'creates=/root/a.sh /root/m.sh' #用來判斷被管控機上是否是存在文件,若是存在,就不執行

三.ansible文件相關模塊

 1.copy模塊

backup 備份,以時間戳結尾
dest 目的地址
group 文件的屬組
mode 文件的權限 r 4 w 2 x 1
owner 文件的屬主
src 源文件
# 經過md5碼來判斷是否須要複製
ansible db -m copy -a 'src=/root/m.sh dest=/tmp/a.sh' #複製本地文件的到遠程主機
ansible db -m copy -a 'src=/root/m.sh dest=/tmp/a.sh mode=755' #修改文件的權限
 ansible web -m copy -a 'src=/root/m.sh dest=/tmp/a.sh mode=755 owner=wudabing' 修改文件的屬主
 ansible web -m copy -a 'src=/etc/init.d dest=/tmp/ mode=755 owner=wudabing' # 複製本地目錄到遠程主機,若是改變文件的屬性,則文件夾內的文件也會被改變
 ansible web -m copy -a 'src=/etc/init.d/ dest=/tmp/ mode=755 owner=wudabing' # 複製本地目錄內的全部文件到遠程主機
 ansible web -m copy -a "content='月光光照大牀\n' dest=/tmp/b.txt" # 直接將文本內容注入到遠程主機的文件中

 2.file模塊

  當源文件變化時,軟連接和硬連接文件都會跟着變化

inode    #硬盤的地址
id         #獲取到的時內存的地址
ln -s a.py b.py #建立軟連接
ln a.py c.py     #建立硬連接

  file的使用

ansible db -m file -a 'path=/lzmly2  state=directory' #在遠程機器上建立文件夾
ansible db -m file -a 'path=/root/q.txt  state=touch' #用來在遠程機器上建立文件
ansible db -m file -a 'path=/tmp/f src=/etc/fstab state=link' #建立軟鏈接src是源地址,path是目標地址
ansible db -m file -a 'path=/tmp/f state=absent' #用來刪除文件或者文件夾

 3.fetch模塊

dest 目的地址
src 源地址
ansible web -m fetch -a 'src=/var/log/cron dest=/tmp' # 下載被控節點的文件,每臺機器建立一個文件夾,並保留原來的目錄結構

四.ansible軟件相關模塊

 1.yum模塊

  rpm和yum的區別

    rpm:redhat package manage

    yum:能夠解決依賴關係

  yum源配置

[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch #名字
baseurl=http://mirrors.aliyun.com/epel/7/$basearch  #rpm源的地址,能夠寫http,https,ftp,Samba,file:
failovermethod=priority
enabled=1 # 是否開啓,1表明開啓,0表示關閉
gpgcheck=0  #是否校驗簽名,1表明校驗,0表示校驗
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

  

disablerepo #禁用源
enablerepo #啓用源
name #包名
state install (`present' or `installed', `latest'), or remove (`absent' or `removed')

ansible web -m yum -a 'name=wget' # 安裝wget
ansible web -m yum -a 'name=python2-pip' # 安裝python2-pip
ansible web -m yum -a 'name=wget state=absent' # 卸載軟件包
 ansible web -m yum -a 'name="@Development Tools"' # 安裝包組

 2.pip模塊

pip install  #安裝包
pip freeze > a.txt #將python的環境打包到文件中
pip install -r a.txt  #安裝文件中的包
pip list  #查看全部的已安裝成功的包

 ansible web -m pip -a 'name=flask' # 安裝flask模塊

 3.service模塊

ps -ef|grep nginx #查看進程
ss -tnlp #查看端口信息
systemctl start nginx #centos7
service nginx start    #centos6
systemctl enable nginx  #centos7 開機自啓動
chkconfig nginx on # centos6開機自啓動
ansible web -m service -a 'name=nginx state=started' # 啓動nginx
ansible web -m service -a 'name=nginx state=stopped' # 關閉nginx 

 4.計劃任務cron模塊

*   *   *   *   *   job
分 時  日  月  周   任務
0 */2 *  * *  job  每隔兩個小時
0 12,13 * * * job 12點和13點
0 12-17 * * * job 12點到17點
0 12-17/2 * * 1,3,6,0 周1,周3,周6,周7 12點到17點每隔兩個小時 
crontab -e # 編輯計劃任務
crontab -l # 查看計劃任務
crontab -r # 刪除計劃任務  ***請勿使用*****來表示時間

  ansible中cron的參數及使用

day  天
disabled 禁用
hour 小時
job 任務
minute 分鐘
month 月
name 任務名字
weekday 周

ansible db -m cron -a 'minute=26 job="touch /tmp/xzmly.txt" name=touchfile' # 新建一個計劃任務
ansible db -m cron -a 'name=touchfile state=absent' # 刪除一個計劃任務
ansible db -m cron -a 'minute=26 job="touch /tmp/xzmly.txt" name=touchfile disabled=yes'  # 禁用計劃任務,以#表示禁用

五.ansible用戶相關模塊

  在linux中的正常運維操做

用戶:
	管理員  root 0
	普通用戶
		系統用戶  不能登陸  1-999 centos7 1-499 centos6
		登陸用戶  能夠登陸  1000-65535 centos7 500-65535 centos6
用戶組:
    管理員組 root 0
    系統用戶組 1-999 centos7 1-499 centos6
    登陸用戶組 1000-65535 centos7 500-65535 centos6 
    
 -d  指定用戶的家目錄
 -g  指定用戶的組
 -G  執行用戶的附加組
 -s  指定登陸後使用的shell
 -r 建立一個系統組
 useradd -r wusir  建立系統用戶, 從999倒序
 useradd -s /sbin/nologin liu 建立的是普通用戶,從1000開始升序
  useradd -d /opt/liu liu 建立用戶時指定用戶的家目錄
   useradd -u 3000 liu # 建立用戶並指定用戶的uid
  userdel liu 刪除用戶
  userdel -r liu 刪除用戶並刪除用戶的家目錄
  
  groupadd wudabing 建立用戶組
  groupdel wudabing 刪除用戶組

 1.use模塊

group 組
groups 附加組
home 家目錄
name 用戶名
password 密碼
remove ?
shell 用戶登陸後使用的shell
system 建立一個系統用戶
uid 用來指定用戶的id
state 狀態
ansible db -m user -a 'name=wulaoshi uid=4000 home=/opt/wulaoshi groups=root shell=/sbin/nologin' #建立一個用戶,並指定用戶的id,用戶的家目錄,用戶的附加組,用戶的shell
ansible db -m user -a 'name=wulaoshi state=absent' #刪除用戶可是不刪除用戶的家目錄
ansible db -m user -a 'name=wulaoshi3 state=absent remove=yes' # 刪除用戶並刪除用戶的家目錄

 2.group模塊

gid 組的id
name 組名
system 系統組
state
ansible db -m group -a 'name=wulaoshi system=yes' #建立系統組
ansible db -m group -a 'name=wulaoshi state=absent' # 刪除組

六.ansible-playbook劇本

在使用ansible-playbook時,咱們會應用到一個編程語言--yaml,ansible-playbook應用的就是.yanl.yml的文件,和寫配置文件的xml,ini語言相似.

其中表達字典:key:value;列表:[ ] -

 1.ansible-playbook命令格式

  文件執行順序:從上往下

  特性:冪等性,無論執行多少遍,結果都是同樣的.

ansible-playbook [options] playbook.yml [playbook2 ...] 
-C, --check   # 檢查,白跑,幹跑
-f FORKS, --forks=FORKS #用來作併發
--list-hosts # 列出主機列表
--syntax-check # 語法檢查

  簡單用法

- hosts: web                     #web爲被控節點機組
  tasks:
  - name: creategroup               #任務名
    group: name=liuqingyang      #此行,group爲模塊名,對應的value爲命令
  - name: createuser                 #任務名
    user: name=wudabing           #user爲模塊名 

 2.傳參

vi p1.yml
- hosts: web
  tasks:
  - name: create{{ user }}  #參數  
    user: name={{ user}}

   第一種方式

ansible-play -e 'user=wudabing' p1.yml   #直接傳參運行

   第二種方式

[web]
192.168.85.133 user=wudabing1
192.168.85.134 user=wudabing2  #在hosts文件,機組中直接設置參數值

   第三種方式

[web;vars] #表示組的參數
user=wudabing3 

   第四種方式

- hosts: web
  vars:
  - user: wudabing4   #在要運行的yml文件中設置參數值
  tasks:
  - name: create{{ user }}  #參數  
    user: name={{ user}}

  第五種方式

- hosts: web
  tasks:
  - name: sum
    shell: echo 5
    register: user
  - name: createuser
    user: name={{user.stdout}}    #繼承其餘運行結果做爲參數值

  傳參方式的優先級

-e > playbook yum文件 > hosts文件

3.條件判斷

能夠判斷如下狀況,不一樣條件作出不一樣操做

不一樣的系統;
不一樣的版本;
不一樣的環境;
不一樣的用戶.
- hosts: db
  remote_user: root
  tasks:
  - name: createfile
    copy: content="寶塔鎮河妖" dest=/tmp/a.txt
    when: a=="3"
  - name: cratefile
    copy: content="月光光,照大牀" dest=/tmp/a.txt
    when: a=="4"

4.tags

在anible-playbook -t 指定tag

- hosts: web
  tasks:
  - name: installnginx
    yum: name=nginx
    tags: installnginx       #爲任務添加標籤
  - name: copyfile
    copy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf
    tags: copyfile             #爲任務添加標籤
  - name: start
    service: name=nginx state=started
    tags: start                 #爲任務添加標籤
ansible-playbook -t copyfile p.yml  #只運行標籤爲copyfile的任務

5.循環with_item

  一般你想在一個任務中幹不少事,好比建立一羣用戶,安裝不少包,或者重複一個輪詢步驟直到收到某個特定結果.

標準循環:

- hosts: web
  tasks:
  - name: createuser
    user: name={{item}}
    with_items:
    -liu1
    -liu2
    -liu3
  -name: creategroup
   group: name={{item}}
   with_items:
   -wu1
   -wu2
   -wu3

嵌套循環:

- hosts: all
  remote_user: root
  tasks:
  - name: add user
    user: name={{ item[0] }} groups={{ item[1] }}
    with_items:
    - ["old1","old2"]
    - ["nginx,docker"]

6.template模塊

- hosts: web
  tasks:
  - name: installredis
    yum: name=redis
  - name: copyfile
    template: src=/etc/redis.conf dest=/etc/redis.conf
  - name: start
    service: name=redis state=started
  配置文件: bind {{ ansible_default_ipv4.address }} 

 之因此在拷貝配置文件用template模塊不用copy,由於copy模塊不能代替bind後的參數,template模塊能夠代替.

ps:寫相對路徑:在當前目錄下新建一個templates目錄,而後把文件放在templates目錄裏面,好比src=templates.j2

7.handlers

Handlers 也是一些 task 的列表,經過名字來引用,它們和通常的 task 並無什麼區別。

Handlers 是由通知者進行 notify, 若是沒有被 notify,handlers 不會執行。

無論有多少個通知者進行了 notify,等到 play 中的全部 task 執行完成以後,handlers 也只會被執行一次。

Handlers 最佳的應用場景是用來重啓服務,或者觸發系統重啓操做.除此之外不多用到了。

- hosts: web
  tasks:
  - name: installredis
    yum: name=redis
  - name: copyfile
    template: src=redis.conf dest=/etc/redis.conf
    tags: copyfile
    notify: restart
  handler:
  - name: restart
    service: name=redis state=restarted

8.roles

 特色:目錄清晰;能夠相互調用

roles文件夾:

  文件夾裏面要是建立的每個角色,每個角色一個文件夾,每個角色裏面都有tasks(必須的),templates,files,handlers,vars目錄,每一個目錄都要有main.yml文件,經過import_tasks來調用,其中templates文件夾中的文件能夠經過相對路徑來調用.

相關文章
相關標籤/搜索