自動化運維管理---Ansible

一、Ansible 簡介

  1. ansible 是什麼

  ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。
  ansible是基於 paramiko 開發的,並且基於模塊化工作,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。ansible不需要在遠程主機上安裝client/agents,因爲它們是基於ssh來和遠
程主機通訊的。ansible目前已經已經被紅帽官方收購,是自動化運維工具中大家認可度最高的,並且上手容易,學習簡單。是每位運維工程師必須掌握的技能之一。

  2. ansible 特點

  1. 部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作;
  2. 默認使用SSH協議對設備進行管理;
  3. 有大量常規運維操作模塊,可實現日常絕大部分操作;
  4. 配置簡單、功能強大、擴展性強;
  5. 支持API及自定義模塊,可通過Python輕鬆擴展;
  6. 通過Playbooks來定製強大的配置、狀態管理;
  7. 輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
  8. 提供一個功能強大、操作性強的Web管理界面和REST API接口——AWX平臺。

  3. ansible 架構圖

二、Ansible 部署配置

  1. 安裝ansible

yum install epel-release -y       # 安裝epel源
yum install ansible -y            # 安裝ansible批量管理軟件
yum install libselinux-python -y  # Python依賴包

  2.  配置hosts文件

[root@m01 ~]cat /etc/ansible/hosts  # 在文件最下面配置主機列表

#定義可以管理的主機信息
[web]
172.16.1.7  ansible_ssh_user=root ansible_ssh_pass=123456
172.16.1.8  ansible_ssh_user=root ansible_ssh_pass=123456

[nfs]
172.16.1.31 ansible_ssh_user=root ansible_ssh_pass=123456

 注:如果使用SSH密鑰方式也可以不輸入密碼進行控制,SSH分發密鑰方式查看SSH分發密鑰文檔

Ansible 主機文件參數信息
參數信息 參數類型 參數說明
ansible_host 通用連接參數 將要連接的遠程主機名與想要設定的主機的別名不同的話,可通過此變量設置
ansible_port 通用連接參數 設置SSH服務端口號,如果是默認22端口可以不設置
ansible_ssh_user 通用連接參數 指定默認使用什麼用戶身份登錄
ansible_ssh_pass 通用連接參數 指定遠程連接的主機密碼信息

  3. 使用ansible管理

[root@m01 ~]# ansible web -m command -a "hostname"

172.16.1.8 | CHANGED | rc=0 >>
web02

172.16.1.7 | CHANGED | rc=0 >>
web01

三、Ansible 批量管理命令

  1. ansible語法格式

  2. 命令參數

命令參數 命令說明
-a(MODULE_ARGS) 指定使用模塊的哪些參數,一般可以接操作的命令
-c 不做任何改變,而是嘗試預測一些可能發生的變化,就是測試
-f 指定使用並行執行的進程數量(默認是5個),機器數量多時使用
-i 指定被管理主機的列表清單文件路徑信息(默認爲/etc/ansible/hosts)或者用逗號分隔主機列表
--list-hosts 輸出匹配的主機列表信息,並不執行其他操作
-m 指定使用的模塊(默認不指定,使用command)
--syntax-check 在劇本上執行語法檢測,但並不執行劇本
-k 提示輸入遠程主機SSH的密碼信息
-u 指定用戶身份遠程進行操作,此用戶在遠程主機必須存在

  3.  ansible-doc 命令

ansible-doc -l          # 列出所有ansible支持的模塊
ansible-doc -s command  # 查看某個模塊的幫助參數

四、Ansible 常用模塊

  1. command 模塊

command 模塊功能參數
選項參數 選項說明
chdir 在執行命令之前,通過cd命令進入到指定目錄中
creates 定義一個文件是否存在,如果不存在,則運行相應命令;如果存在則跳過相應命令
free_from (必有參數) 參數信息中可以輸入任何系統命令信息,實現遠程管理

removes

定義一個文件是否存在,如果存在,則運行相應命令;如果不存在則跳過相應命令
說明:命令中不能包含類似$HOME和參數類似"<",">","|",";" 和"&"等信息,如需使用請使用shell模塊

  例1:

[root@m01 ~]#ansible web -m "command" -a "uptime"

172.16.1.8 | CHANGED | rc=0 >>
 18:07:33 up 37 min,  2 users,  load average: 0.00, 0.01, 0.05

172.16.1.7 | CHANGED | rc=0 >>
 18:07:33 up  5:14,  4 users,  load average: 0.00, 0.01, 0.05

  例2:

[root@m01 ~]# ansible web -m "command" -a "removes=/tmp ls /tmp"

172.16.1.8 | CHANGED | rc=0 >>
ansible_command_payload_ZeIcUx
rsync_fail_log.sh

172.16.1.7 | CHANGED | rc=0 >>
ansible_command_payload_bzbNln
rsync_fail_log.sh

  2. shell 模塊

shell 模塊功能參數
選項參數 選項說明
chdir 在執行命令之前,通過cd命令進入到指定目錄中
creates 定義一個文件是否存在,如果不存在,則運行相應命令;如果存在則跳過相應命令
free_from (必有參數) 參數信息中可以輸入任何系統命令信息,實現遠程管理

removes

定義一個文件是否存在,如果存在,則運行相應命令;如果不存在則跳過相應命令

  例1:

[root@m01 ~]# ansible web -m shell -a "ps -ef|grep sshd|grep -v grep"

172.16.1.8 | CHANGED | rc=0 >>
root       1415      1  0 17:30 ?        00:00:00 /usr/sbin/sshd -D
root       1699   1415  0 17:33 ?        00:00:00 sshd: root@pts/0
root       2221   1415  0 18:14 ?        00:00:00 sshd: root@pts/1

172.16.1.7 | CHANGED | rc=0 >>
root       1384      1  0 12:53 ?        00:00:00 /usr/sbin/sshd -D
root       2015   1384  0 14:05 ?        00:00:02 sshd: root@pts/1
root       5268   1384  0 16:52 ?        00:00:00 sshd: root@pts/0

  例2:

[root@m01 ~]# ansible servers -m shell -a "tmp/check_disk.sh"

172.16.5.193 | CHANGED | rc=0 >>
disk_size=32%
unhealth


172.16.5.181 | CHANGED | rc=0 >>
disk_size=43%
unhealth

說明:執行腳本命令時,遠程主機必須有此腳本纔可使用

  3. script 模塊

script 模塊功能參數
選項參數 選項說明
creates 定義一個文件是否存在,如果不存在,則運行相應命令;如果存在則跳過相應命令
free_from (必有參數) 參數信息中可以輸入任何系統命令信息,實現遠程管理

removes

定義一個文件是否存在,如果存在,則運行相應命令;如果不存在則跳過相應命令

  例1:

[root@m01 ~]# ansible web -m script -a "tmp/check_disk.sh"

172.16.1.7 | CHANGED | rc=0 >>
disk_size=32%
unhealth


172.16.1.8 | CHANGED | rc=0 >>
disk_size=43%
unhealth

說明:執行腳本命令時,腳本不需要在遠程主機存在和授權

  4. copy 模塊

copy 模塊功能參數
選項參數 選項說明
src 指定源文件路徑,可以是相對路徑,也可以是絕對路徑,可以是目錄
dest (必有參數) 指定目標文件路徑,只能是絕對路徑,如果src是目錄,此項必須是目錄
owner 定義文件/目錄屬主,類似於chown

group

定義文件/目錄屬組,類似於chown
mode 定義文件/目錄權限,可以以數字指定比如0644
backup 創建備份文件並且包含時間戳信息,以便能夠還原文件。默認配置爲no,並且指定信息爲yes|no
content 當使用代替參數時,將文件的內容直接設置爲指定值。遠端創建有指定內容的文件,並且只能設置簡單值。
force

默認爲yes,如果目標主機包含該文件,但內容不同,則強制覆蓋

如果爲no,則只有當目標主機的目標位置不存在該文件時,才複製

remote_src

如果爲False,將搜索源信息在本地/管理及機器上

如果爲True,將到遠程/目標主機的機器上搜索

默認爲false,目前不支持遞歸複製

  例1:
[root@m01 ~]# ansible web -m copy -a "src=./anaconda-ks.cfg  dest=/data owner=www group=www mode=0644"
172.16.1.7 | CHANGED => {
    "changed": true, 
    "checksum": "9d791df2961e299fac1206c2e1c6ab1cde2c86a2", 
    "dest": "/data/anaconda-ks.cfg", 
    "gid": 1086, 
    "group": "www", 
    "md5sum": "221e5656c9b59aec6c7596568fff8ad3", 
    "mode": "0644", 
    "owner": "www", 
    "size": 1499, 
    "src": "/root/.ansible/tmp/ansible-tmp-1548230667.08-106764271060692/source", 
    "state": "file", 
    "uid": 1086
}

  例2:

[root@m01 ~]# ansible web -m copy -a "src=/etc/hosts  dest=/data backup=yes"
172.16.1.7 | CHANGED => {
    "backup_file": "/data/anaconda-ks.cfg.4263.2019-01-23@15:52:43~", 
    "changed": true, 
    "checksum": "9d791df2961e299fac1206c2e1c6ab1cde2c86a2", 
    "dest": "/data/anaconda-ks.cfg", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "221e5656c9b59aec6c7596568fff8ad3", 
    "mode": "0644", 
    "owner": "root", 
    "size": 1499, 
    "src": "/root/.ansible/tmp/ansible-tmp-1548229931.86-180942706957431/source", 
    "state": "file", 
    "uid": 0
}

  例3:

[root@m01 ~]# ansible web01 -m copy -a "content=test  dest=/data/anaconda-ks.cfg "
172.16.1.7 | CHANGED => {
    "changed": true, 
    "checksum": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", 
    "dest": "/data/anaconda-ks.cfg", 
    "gid": 1086, 
    "group": "www", 
    "md5sum": "098f6bcd4621d373cade4e832627b4f6", 
    "mode": "0644", 
    "owner": "www", 
    "size": 4, 
    "src": "/root/.ansible/tmp/ansible-tmp-1548231000.52-150895010308573/source", 
    "state": "file", 
    "uid": 1086
}

  5. fetch 模塊

fetch 模塊功能參數
選項參數 選項說明
src 指定遠程主機源文件路徑,必須是文件,而不是目錄
dest 指定本地主機文件路徑,只能是絕對路徑,必須是目錄

  例1: 

[root@m01 ~]# ansible web -m fetch -a "src=/etc/hosts dest=/tmp"
172.16.1.7 | CHANGED => {
    "changed": true, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "dest": "/tmp/hosts", 
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e", 
    "remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "remote_md5sum": null
}

  6. file 模塊

file 模塊功能參數
選項參數 選項說明
src 要鏈接的文件路徑(只能應用state=link),創建連接文件時使用
path (必有參數) 文件路徑管理:別名方式—:dest,name
owner 定義文件/目錄屬主,類似於chown

group

定義文件/目錄屬組,類似於chown
mode 定義文件/目錄權限,可以以數字指定比如0644
state directory:所有不存在的子目錄將會被創建
file:如果文件不存在將不能被創建
link:符號鏈接文件將被創建或更改
hard:創建硬鏈接文件
touch:如果文件不存在,則會創建一個空文件,如果文件或目錄已存在,接收更新文件訪問和修改時間
absent:目錄將被遞歸刪除以及文件,而鏈接將被取消

  例1:

[root@m01 ~] ansible web -m file -a 'path=/root/test owner=www mode=755'
172.16.1.7 | CHANGED => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0700", 
    "owner": "mariadb", 
    "path": "/root/test", 
    "size": 0, 
    "state": "file", 
    "uid": 997
}

  7. yum 模塊

yum 模塊功能參數
選項參數 選項說明
name 需要安裝的軟件包名稱信息,或包的版本標識信息
state 是否安裝(present or installed latest)或者移除(absent or removed)一個包

  例1:

[root@m01 ~] ansible web -m yum -a "name=vsftpd state=installed"
172.16.1.7 | CHANGED => {
    "ansible_facts": {
        "pkg_mgr": "yum"
    }, 
    "changed": true, 
    "msg": "Repository 'cdrom' is missing name in configuration, using id\n", 
"rc": 0, ##rc返回值爲0代表執行成功
......

  8. service/systemd 模塊

service/systemd 模塊功能參數
選項參數 選項說明
name 定義所要管理的服務名稱
state

started/stopped 兩個參數屬於激活操作命令

restarted 重啓操作將是始終支持的服務

reloaded 表示進行平滑重啓

enable 確認是否系統啓動時運維指定的服務

  例1:

[root@m01 ~] ansible web -m service  -a 'name=httpd state=started enable=yes'
172.16.1.7 | CHANGED => {
    "changed": true, 
    "name": "httpd", 
    "state": "started", 
    "status": {
        "ActiveEnterTimestampMonotonic": "0", 
        "ActiveExitTimestampMonotonic": "0",
......

  9. cron 模塊

cron 模塊功能參數
選項參數 選項說明
minute 分鐘(0-59,*,*/2,……),不寫默認爲*
hour 小時(0-23,*,*/2,……),不寫默認爲*
day 日(1-31,*,*/2,……),不寫默認爲*
month 月(1-12,*,*/2,……),不寫默認爲*
weekday 周(0-7,*,……),不寫默認爲*
job 執行相應的命令
name 定時任務條目的描述信息
state 確認job或環境變量的開啓或者關閉;即創建定時任務或刪除定時任務
disabled

如果job應該關閉(被註釋掉)。只能影響狀態是開啓狀態的定時任務條目

user 指定修改與編寫定時任務的用戶信息

  例1:

[root@m01 ~]# ansible web -m cron -a "name='ntpdate time' minute=*/5 job='/usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null' "
172.16.1.7 | CHANGED => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "None", 
        "ntpdate time"
    ]
}

  10. mount 模塊

mount 模塊功能參數
選項參數 選項說明
src 要掛載的設備
path 掛載點
fstype 掛載的文件系統類型
opts 掛載的參數選項
state

present:不會掛載,只會修改fstab文件

mounted:會進行掛載,會修改fstab文件

unmounted:會進行卸載,不會修改fstab文件

absent:會進行卸載,也會修改fstab文件信息

  例1:

[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data/  path=/mnt fstype=nfs state=present"
#以上信息只是在/etc/fstab文件中添加了配置信息,不會真正進行掛載(mount -a)
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data/  path=/mnt fstype=nfs state=mounted"
#以上信息是在/etc/fstab文件中添加了配置信息,並且也會真正進行掛載

  11. user 模塊

user 模塊功能參數
選項參數 選項說明
create_home 創建家目錄,除非設置no,則不創建家目錄
group 創建用戶組(主組)
name 創建的用戶名
password 創建用戶的密碼
uid

創建用戶的UID

shell 創建用戶登錄的shell
state

absent,移除遠端主機的用戶

present,創建遠端的用戶

  例1:

[root@m01 ~]# ansible 172.16.1.31 -m user -a "name=rsync create_home=no  shell=/sbin/nologin"
172.16.1.7 | CHANGED => {
    "changed": true, 
    "comment": "", 
    "create_home": true, 
    "group": 1001, 
    "name": "mysql", 
    "shell": "/sbin/nologin", 
    "state": "present", 
    "system": false, 
    "uid": 1001
}

  12. group 模塊

group 模塊功能參數
選項參數 選項說明
name 指定創建的組名
gid

指定組的GID

state

absent,移除遠端主機的組

present,創建遠端的主機組(默認)

  例1:

[root@m01 ~] ansible web -m group -a 'name=tomcat state=present'
172.16.1.7 | CHANGED => {
    "changed": true, 
    "gid": 1000, 
    "name": "tomcat", 
    "state": "present", 
    "system": false
}

五、Ansible 劇本功能

  1. 基本語法

- hosts: web            # 管理的目標主機
  tasks:                # playbook所有的任務集合信息
    - name: creategroup   # 定義任務的名稱,非必須
      group: name=Tom     # 定義一個任務的具體操作動作
    - name: cretaeuser
      user: name=Andey 

  2. hosts的定義方式:

方式一:定義所管理的主機IP
- hosts: 172.16.1.7
  tasks:

方式二:定義所管理的主機名稱信息
- hosts: web01
  tasks:

方式三:定義所管理的多主機信息
- hosts: 172.16.1.6, web01
  tasks:

  3. tasks的定義方式:

方式一:採用變量格式設置任務
tasks:
  - name: make sure apache is running
    service: name=httpd state=started

方式二:採用字典格式設置任務
tasks:
  - name: make sure apache is running
    service:
           name: httpd
           state: started

  4. 變量使用方式

方式一:將變量直接寫在文件中
- hosts: nfs_server
  vars:
      Data_dir: /data
  tasks:
    - name: create data dir
      file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody

方式二:將變量寫在變量文件中
- hosts: nfs_server
  vars_files:
    - vars/server_vars.yml
  tasks:
    - name: create data dir
      file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody

  5. 劇本其他使用方式

#1. 在劇本中設置判斷信息
- hosts: oldboy
  remote_user: root
  tasks:
    - name: Check File
      file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch
      when: (ansible_hostname == "nfs") or (ansible_hostname == "backup")

#2. 在劇本中設置循環信息
- hosts: all
  remote_user: root
  tasks:
    - name: Add Users
      user: name={{ item.name }} groups={{ item.groups }} state=present
      with_items: 
	    - { name: 'testuser1', groups: 'bin' }
	    - { name: 'testuser2', groups: 'root' }

#3. 在劇本中設置忽略錯誤
- hosts: all
  remote_user: root
  tasks:
    - name: Ignore False
      command: /bin/false
	  ignore_errors: yes

#4. 在劇本中設置標籤功能
- hosts: oldboy
  remote_user: root
  tasks:
    - name: Check File
      file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch
      when: (ansible_hostname == "nfs01") or (ansible_hostname == "backup")
	  tags: t1
#指定執行哪個標籤任務: ansible-playbook --tags=t1 test.yml 
#跳過指定標籤任務:     ansible-playbook --skip-tags=t1 test.yml

#5. 在劇本中設置觸發功能
- hosts: backup
  remote_user: root
  tasks:
    - name: Install rsync
      yum: name=rsync state=present
      notify: restart rsync server

  handlers:
    - name: restart rsync server
      service: name=rsyncd state=restarted 

  6. 劇本整合

方式一:include_tasks: f1.yml  
- hosts: all
  remote_user: root
  tasks:
    - include_tasks: f1.yml
    - include_tasks: f2.yml

方式二:- import_playbook:
[root@m01 ansible-playbook]# cat main.yml 
- import_playbook: base.yml     
- import_playbook: rsync.yml    
- import_playbook: nfs.yml      
- import_playbook: oxxx.yml
- import_playbook: rsync.yml
- import_playbook: nfs.yml

  7. 規範劇本目錄

[root@m01 nfs]mkdir /etc/ansible/roles/nfs/{vars,tasks,templates,handlers,files}  --- 創建角色目錄下面的子目錄
[root@m01 nfs]# tree
    .
    ├── files         # 存放需要傳輸的文件
    │   └── exports
    ├── handlers      # 保存觸發器配置文件信息
    │   └── main.yml
    ├── tasks         # 保存要執行的動作信息文件
    │   └── main.yml
    ├── templates     # 保存需要分發模板文件 模板文件中可以設置變量信息
    └── vars
        └── main.yml  # 保存變量信息文件

  8. 執行劇本

ansible-playbook --syntax-check  rsync_server.yaml  # 檢查劇本的語法格式命令
ansible-playbook -C rsync_server.yaml   # 模擬執行劇本命令
ansible-playbook rsync_server.yaml      # 執行劇本命令

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章