Ansible自動化運維

Ansible

 

 

安裝:yum、編譯安裝、Git方式、pip安裝

配置文件:html

/etc/ansible/ansible.cfg 主配置文件,配置ansible特性node

/etc/ansible/hosts 主機清單linux

/etc/ansible/roles/ 存放角色的目錄nginx

程序web

/usr/bin/ansible 主程序,臨時命令執行工具正則表達式

/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具shell

/usr/bin/ansible-galaxy 下載/上傳優秀代碼或Roles模塊官網平臺vim

/usr/bin/ansible-playbook 定製自動化任務,編排劇本工具緩存

/usr/bin/ansible-pull 遠程執行命令工具bash

/usr/bin/ansible-vault 文件加密工具

/usr/bin/ansible-console 給予console界面與用戶交互執行工具

 

主機清單

[root@ansible ~]#vim /etc/ansible/hosts 
#能夠分組 
[websrvs] 192.168.9.101 192.168.9.102 
[dbsrvs] 192.168.9.101 192.168.9.103 
# 能夠指定連續的iP 
[appsrvs] 192.168.9.10[1:3] 
# 能夠指定端口,指定的ssh的端口 
[port] 192.168.9.103:2222

 

 

主配置文件

[defaults]

#inventory = /etc/ansible/hosts # 主機列表配置文件

#library = /usr/share/my_modules/ # 開文件存放目錄

#remote_tmp = ~/.ansible/tmp # 臨時py命令文件存放在遠程主機目錄

#local_tmp = ~/.ansible/tmp # 本機的臨時命令之星目錄

#forks = 5 # 默認併發數

#sudo_user = root # 默認併發數

#ask_sudo_pass = True # 每次執行ansible命令是否詢問密碼

#ask_pass = True

#remote_port = 22

# host_key_checking = False # 檢查對應服務器的host_key,建議取消註釋

#log_path = /var/log/ansible.log # 日誌文件

ansible命令

(ansible 兼容Centos6和Centos5請看:ansible若是兼容Centos5)

-m:指定模塊 # ansible 192.168.9.101,192.168.9.102 -m ping -u root -k //ip必須在主機清單

-v 詳細過程 -vv -vvv 更詳細

--list-hosts:顯示主機列表

[root@ansible ~]#ansible all --list-hosts

[root@ansible ~]#ansible websrvs --list-hosts

-k,--ask-pass:輸入ssh鏈接密碼,默認key驗證

-K,--ask-become-pass 提示輸入sudo時的口令

-u:用戶名

-T,--timeout=TIMEOUT 執行命令超時時間,默認10s

-u,--user=REMOTE_USER 執行遠程知心的用戶

-b,--become 代替舊版的sudo切換

 

ansible-doc

-a:列出全部模塊文檔

-l:列出可用模塊

-s 模塊名:簡單顯示模塊的使用

模塊名:查看模塊的幫助文檔

 

[root@ansible ~]#ansible dbsrvs -m command -a 'ls /root' -u xuan -k -b -K -m command // 使用的command這個模塊 -a 'ls /root' 這個是模塊的參數 -u xuan 指定用戶 -k 使用密碼驗證 -b 使用sudo -K 提示輸入sudo的密碼 
[root@ansible ~]#ansible 'all' -m ping //全部主機 
[root@ansible ~]#ansible '*' -m ping //全部主機 
[root@ansible ~]#ansible 'websrvs:dbsrvs' -m ping //在websrvs組中的和dbsrvs組中的或關係 
[root@ansible ~]#ansible 'websrvs:dbsrvs' --list 
[root@ansible ~]#ansible 'websrvs:&dbsrvs' -m ping //記載websrvs中的又在dbsrvs組中的,與關係 
[root@ansible ~]#ansible 'websrvs:&dbsrvs' --list 
[root@ansible ~]#ansible 'websrvs:!dbsrvs' --list //在websrvs裏邊,可是不在dbsrvs裏邊,此處必須爲單引號 [root@ansible ~]#ansible "~(web|db)srv" -m ping //正則表達式

 

 

anseble命令執行過程

ansible命令執行過程

①加載子本身的配置文件,默認/etc/ansible/ansiblecfg

②加載本身對應的模塊文件,如command

③經過ansible將模塊或命令生成對用的臨時py文件,並將該文件傳輸至遠程服務器的對應執行用戶$HOME/ansible/tmp/ansible-tmp-數字/XXX.py文件

④ 給文件x權限

⑤執行並返回結果

⑥刪除臨時py文件,sleep 0 退出

執行狀態,在/etc/ansible/ansible.cfg文件中有說明,475行,[colors]模塊

綠色:執行成功而且不須要作改變的操做

黃色:執行成功並對目標主機作變動

紅色:執行失敗

 

 2、常見模塊

ansible常見模塊

{ping,command,shell,script,fetch,copy,hostname,cron,file,yum,service,user,group}

command

chdir:切換目錄

  [root@ansible ~]#ansible all -a 'chdir=/media ls' //查看/media目錄

creates:後邊的文件存在就不執行

  [root@ansible ~]#ansible all -a 'creates=/media/cdrom mkdir /media/cdrom' //若是存在/media/cdrom,就建立/media/cdrom

removes:若是存在就執行

  [root@ansible ~]#ansible all -a 'removes=/media/cdrom ls -l -d /media/cdrom/' //若是存在/media/cdrom,就查看該文件

 

shell模塊:由於command模塊不支持重定向、管道、變量等特殊場景,因此須要shell模塊

chdir:切換目錄

creates:後邊的文件存在就不執行

removes:若是存在就執行

[root@ansible ~]#ansible all -m shell -a 'echo $HOSTNAME' //查看每臺機器的主機名 
[root@ansible ~]#ansible all -m shell -a 'echo aptech1! | passwd --stdin root' //批量改密碼

 

 

Script:能夠將本地的腳本在全部主機上執行

chdir:切換目錄

creates:後邊的文件存在就不執行

removes:若是存在就執行

[root@ansible ansible]#vim script1 #!/bin/bash hostname 
[root@ansible ansible]#ansible all -m script -a '/root/ansible/script1'

 

copy:將本地的文件推送到目標文件

backup:將原有文件備份

content:直接編輯內容

dest:目標文件的位置

mode:權限

owner:全部者

src:源文件

[root@ansible ansible]#ansible all -m copy -a 'src=/root/ansible/selinux dest=/etc/selinux/config backup=yes mode=000 owner=xuan' 

#content 
[root@ansible ansible]#ansible all -m copy -a 'content="hello\n軒\n軒" dest=/tmp/f1'

 

 

Fetch:從客戶端提取文件至服務器端,與copy相反

dest:目標文件的位置

src:源文件

[root@ansible ~]#ansible all -m fetch -a 'src=/etc/sysconfig/network dest=/data' 

[root@ansible ~]#tree /data/
/data/
├── 192.168.9.101
│   └── etc
│       └── sysconfig
│           └── network
├── 192.168.9.102
│   └── etc
│       └── sysconfig
│           └── network
└── 192.168.9.103
    └── etc
        └── sysconfig
            └── network

9 directories, 3 files

 

 

file:設置文件屬性

[root@ansible ansible]#ansible all -m file -a 'name=/data/f3 state=touch' #在/datax下建立文件f3 
[root@ansible ansible]#ansible all -m file -a 'dest=/data/f3 state=absent' #刪除/data/f3 
[root@ansible ansible]#ansible all -m file -a 'path=/data/dir1 state=directory' #在/data下建立dir1文件夾 
[root@ansible ansible]#ansible all -m file -a 'path=/data/dir1 state=absent' #刪除/data/dir1文件夾 
[root@ansible ansible]#ansible all -m file -a 'src=/etc/fstab dest=/data/f.link state=link' #將/etc/fstab軟鏈接到/data/f.link文件 
[root@ansible ansible]#ansible all -m file -a 'dest=/data/f.link state=absent' #刪除軟鏈接

 

 

hostname:更改主機名,由於每一個主機不該該同樣,因此後期使用變量批量更改

  [root@ansible ansible]#ansible 192.168.9.101 -m hostname -a 'name=node01'

 

Cron:計劃任務

disabled=true、yes、y、fales、no、n.... 禁用或啓用

[root@ansible ansible]#ansible all -m cron -a 'minute=* weekday=2,4,6 job="/usr/bin/wall FBI warning" name=xuan'   # 計劃任務,在周2、4、六每分鐘報警一次 

[root@ansible ansible]#ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=xuan'   # 禁用計劃任務,job不加會報錯,name不加會新建一個計劃任務並註釋,原來的並不會被禁用 

[root@ansible ~]#ansible all -m cron -a 'job="/usr/bin/wall" name=xuan state=absent'   # 刪除計劃任務 

 

 

Yum:管理包

state=latest:安裝,默認就是安裝

installed:查看已經安裝過的

removed:卸載

disable_gpg_check=yes:忽略key驗證

update_cache=yes:更新緩存

[root@ansible ~]#ansible all -m yum -a 'name=ftp'   #安裝ftp客戶端軟件,默認爲安裝,因此默認不須要state=latest 

[root@ansible ~]#ansible websrvs -m yum -a 'list=installed'   #查看已經安裝過的軟件 

[root@ansible ~]#ansible websrvs -m yum -a 'name=ftp state=removed'   # 卸載ftp客戶端軟件 # 同時安裝多個包 

[root@ansible ~]#ansible websrvs -m yum -a 'name=ftp,vsftpd,httpd' # 同時卸載多個包,absent和removed均可以 
[root@ansible ~]#ansible websrvs -m yum -a 'name=ftp,vsftpd,httpd state=absent' 

#安裝rpm單個包,先使用copy,在使用yum   ①copy複製   [root@ansible
~]#ansible all -m copy -a 'src=/media/cdrom/Packages/dstat-0.7.2-12.el7.noarch.rpm dest=/root'   ②yum安裝,而且忽略key驗證    [root@ansible ~]#ansible all -m yum -a 'name=/root/dstat-0.7.2-12.el7.noarch.rpm disable_gpg_check=yes' [root@ansible ~]#ansible websrvs -m yum -a 'update_cache=yes' # 更新緩存
 

 

 

Service

enabled:開機啓動

name:指定服務名

state:started、stopped、restarted、reloaded

[root@ansible ~]#ansible websrvs -m service -a 'state=started enabled=yes name=vsftpd'   # 啓動vsftpd,設置爲開機啓動
 
[root@ansible ~]#ansible websrvs -m service -a 'state=stopped enabled=no name=vsftpd  # 關閉vsftpd,取消開機啓動

 

'

 

User:管理用戶

comment:註釋

create_home:是否建立家目錄

expires:過時時間

group:主組

groups:附加組

home:家目錄

name:用戶名

password:加密口令

remove:刪除,並且刪除家目錄

system:制定系統帳號

shell:shell類型

[root@ansible ~]#ansible websrvs -m user -a 'name=nginx shell=/sbin/nologin system=yes create_home=no groups=wheel uid=80 comment="Nginx server"'    # 建立nginx用戶,shell爲nologin,是一個系統帳戶,不建立家目錄,uid爲80,commend描述

[root@ansible ~]#ansible websrvs -m user -a 'name=nginx shell=/sbin/nologin home=/home/nginx system=yes create_home=yes groups=wheel uid=80 comment="Nginx server"'    # home指定家目錄 

[root@ansible ~]#ansible websrvs -m user -a 'name=nginx state=absent remove=yes'   # 刪除nginx用戶,若是有家目錄,也將家目錄刪除 

 

 

Group

system:是不是系統組

gid:

state

name

[root@ansible ~]#ansible websrvs -m group -a 'name=nginx system=y gid=80' # 系統組,gid爲80

[root@ansible ~]#ansible websrvs -m group -a 'name=nginx state=absent'  # 刪除組

 

 

3、ansible的小命令與Playbook的編寫

ansible-galaxy

下載galaxy

  [root@ansible ~]#ansible-galaxy install geerlingguy.nginx

 

查看galaxy

  [root@ansible ~]#ansible-galaxy list //查看全部角色

  [root@ansible ~]#ansible-galaxy list geerlingguy.nginx //查看單個角色

  [root@ansible ~]#cp -ar .ansible/roles/{geerlingguy.nginx,xuan.nginx} //就等於又建立了一個角色

 

刪除galaxy

  [root@ansible ~]#ansible-galaxy remove geerlingguy.nginx

 

ansible-pull(push拉,pull推)

速度較快

 

ansible-playbook(後邊還有更多介紹)

後綴建議爲yml

#第一個plabook
[root@ansible ansible]#vim hello.yml              
---        //第一行的---是一個習慣
- hosts: websrvs      //必需要注意空格,對空格很敏感,hosts表明遠程主機,websrvs是以前建立愛你的主機清單組
  remote_user: root   // 在遠程使用什麼身份執行

  tasks:
    - name: xuan       //playbook的名字
      command: hostname    //command是模塊,hostname是命令

 

ansible-vault:用於加密ansible-playbook

[root@ansible ansible]#ansible-vault encrypt hello.yml # 將hello.yml加密

[root@ansible ansible]#ansible-vault view hello.yml # 查看加密後的文件內容,須要輸入解密密碼

[root@ansible ansible]#ansible-vault edit hello.yml    # 編輯加密後的文件

[root@ansible ansible]#ansible-vault rekey hello.yml  # 修改口令

[root@ansible ansible]#ansible-vault create hello2.yml  # 建立一個新的,加密的文件

[root@ansible ansible]#ansible-vault decrypt hello.yml  # 將hello.yml解密

ansible-console:2.0+新增,可交互式執行命令,支持tab

[root@ansible ansible]#ansible-console
# 遠程執行命令的用戶@針對的主機 (3個主機) [f:
5]表明併發數 root@all (3)[f:5]$ # 切換針對的主機爲websrvs組 root@all (3)[f:5]$ cd websrvs # 修改併發數爲10 root@websrvs (2)[f:5]$ forks 10 # 調用command模塊 root@websrvs (2)[f:10]$ command hostname

 

 

Playbook:YAML語言編寫

 

YAML介紹

 

 

 

YAML語法簡介

 

 

 

 

YAML語法

 

 

 

Playbood核心元素

Hosts 指定的遠程主機列表(支持)

Tasks 任務集

tasks中的一個name只能對應一個模塊的執行任務,只會執行後邊定義的

Varniables 內置變量或自定義變量在playbook中調用

Tempplates 模板,可替換模板文件中的變量並實現一些簡單邏輯的文件

Handlers 和 notity集合使用,由特定條件觸發的操做,知足條件方執行,不然不執行

[root@ansible ansible]#cat http.yml 
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: install httpd Package
      yum: name=httpd
    - name: copy conf file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=y
      notify: restart service      //當文件發生改變時,使用notify調用handlers的restart server
    - name: start service
      service: name=httpd state=started enabled=y

  handlers:
    - name: restart service     # 這裏的名字用於tasks裏邊的調用
      service: name=httpd state=restarted

 

tags 標籤 指定某條任務執行,用於選擇運行playbook 中的部分代碼

  多個name公用一個標籤,執行的那個標籤的時候,都會被執行

[root@ansible ansible]#cat http.yml 
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: install httpd Package
      yum: name=httpd
      tags: install
    - name: copy conf file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=y
    - name: start service
      service: name=httpd state=started enabled=y
      tags: startservice
# 查看文件中定義了哪些模塊
[root@ansible ansible]#ansible-playbook --list-tags http.yml
# 使用-t單獨指定執行的tags
[root@ansible ansible]#ansible-playbook -t install http.yml

 

ansible-playbook

-C,--check:不執行,檢查與法

--list-hosts:列出運行任務的主機

--list-tags:列出tags

--list-tasks :列出tasks中定義的內容,列出的同時也會有tags信息

--limit:指定運行的主機,前提是主機必須在文件中定義

-t:指定執行的tahs

-v -vv -vvv

 

Playbook執行失敗後續怎麼繼續執行

不管如何返回true方法

tasks:

- name: test1

shell: /aaa || /bin/true

使用playbook自帶的忽略錯誤

tasks:

- name: test2

shell: /aaa

ignore_errors:True

 

 

ShellScripts VS Playbook

 

 

 

Playbook示例

# 相對路徑
[root@ansible ansible]#cat playbook1.yml 
---
- hosts: websrvs
  remote_user: root

  tasks:
   - name: cppy index
     copy: src=files/index.html dest=/var/www/html/    # 相對路徑是相對的當前目錄

 

 

 5、變量

變量:字母、數字、下劃線組成,字母開頭

變量來源

  ①ansible setup facts 遠程主機的全部變量能夠直接調用

    setup是一個模塊,這個模塊能夠不添加任何參數直接執行,會返回對方主機的不少信息,而且使用變量進行保存

 

 

# 顯示全部變量
[root@ansible ~]#ansible websrvs -m setup 

# 也可使用-a 加參數,過濾其中的某些參數
[root@ansible ~]#ansible websrvs -m setup -a 'filter=ansible_fqdn'     //顯示FQDN主機名
[root@ansible ~]#ansible websrvs -m setup -a 'filter=*address*'    //顯示地址,會顯示包含address關鍵字的相關信息
[root@ansible ~]#ansible websrvs -m setup -a 'filter=ansible_eth*'   //也能夠看某個網卡的參數

  setup在playbook中的示例

 

[root@ansible ansible]#cat var4.yml 
---
- hosts: websrvs
  remote_user: root

  tasks:
  - name: create log file
    file: name=/data/{{ansible_fqdn}}.log state=touch mode=600 owner=xuan  # ansible_fqdn就是一個setup中的變量

  ②在主機清單中定義

    普通變量:主機組中主機單獨定義,優先級高於公共變量

    公共(組)變量:針對主機組中全部主機定義統一變量

 

[root@ansible ansible]#cat /etc/ansible/hosts
[websrvs]
192.168.9.101 host_port=81       # 普通變量
192.168.9.102 host_port=82

[websrvs:vars]    # 公共(組)變量
nodename=www
domainname=p-pp.cn

# 在playbook中調用
[root@ansible ansible]#cat var3.yml           
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: set hostname
      hostname: name={{nodename}}{{host_port}}.{{domainname}}

 

  ③經過命令行指定變量,優先級最高
[root@ansible ~]#cat ansible/var1.yml
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: install package
      yum: name={{ pkname1 }}
    - name: install package
      yum: name={{ pkname2 }}
# 在執行時定義
[root@ansible ansible]#ansible-playbook -e "pkname1=httpd pkname2=vsftpd" var1.yml -C

 

  ④在playbook中定義
[root@ansible ansible]#cat var2.yml 
---
- hosts: websrvs
  remote_user: root
  vars:
    - pkname1: httpd
    - pkname2: vsftpd

  tasks:
    - name: install package1
      yum: name={{ pkname1 }}
    - name: install package2
      yum: name={{ pkname2 }}

 

  ⑤也可使用vars_files指定文件

 

[root@ansible ansible]#cat vars.yml 
var1: httpd
var2: vsftpd

[root@ansible ansible]#cat var5.yml  
---
- hosts: websrvs
  remote_user: root
  vars_files:      //調用文件中的變量
    - vars.yml    //vars.yml是文件的名字
  tasks:
  - name: install package
    yum: name={{var1}},{{var2}}
  - name: create file
    file: name=/data/{{var2}}.log state=touch

在rule中定義

 

命令行變量 > playbook > 主機清單

相關文章
相關標籤/搜索