一、Ansible 簡介
1. ansible 是什麼
ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。
ansible是基於 paramiko 開發的,並且基於模塊化工作,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。ansible不需要在遠程主機上安裝client/agents,因爲它們是基於ssh來和遠
程主機通訊的。ansible目前已經已經被紅帽官方收購,是自動化運維工具中大家認可度最高的,並且上手容易,學習簡單。是每位運維工程師必須掌握的技能之一。
2. ansible 特點
- 部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作;
- 默認使用SSH協議對設備進行管理;
- 有大量常規運維操作模塊,可實現日常絕大部分操作;
- 配置簡單、功能強大、擴展性強;
- 支持API及自定義模塊,可通過Python輕鬆擴展;
- 通過Playbooks來定製強大的配置、狀態管理;
- 輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
- 提供一個功能強大、操作性強的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_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 模塊
選項參數 | 選項說明 |
---|---|
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 模塊
選項參數 | 選項說明 |
---|---|
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 模塊
選項參數 | 選項說明 |
---|---|
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 模塊
選項參數 | 選項說明 |
---|---|
src | 指定源文件路徑,可以是相對路徑,也可以是絕對路徑,可以是目錄 |
dest (必有參數) | 指定目標文件路徑,只能是絕對路徑,如果src是目錄,此項必須是目錄 |
owner | 定義文件/目錄屬主,類似於chown |
group |
定義文件/目錄屬組,類似於chown |
mode | 定義文件/目錄權限,可以以數字指定比如0644 |
backup | 創建備份文件並且包含時間戳信息,以便能夠還原文件。默認配置爲no,並且指定信息爲yes|no |
content | 當使用代替參數時,將文件的內容直接設置爲指定值。遠端創建有指定內容的文件,並且只能設置簡單值。 |
force |
默認爲yes,如果目標主機包含該文件,但內容不同,則強制覆蓋 如果爲no,則只有當目標主機的目標位置不存在該文件時,才複製 |
remote_src |
如果爲False,將搜索源信息在本地/管理及機器上 如果爲True,將到遠程/目標主機的機器上搜索 默認爲false,目前不支持遞歸複製 |
[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 模塊
選項參數 | 選項說明 |
---|---|
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 模塊
選項參數 | 選項說明 |
---|---|
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 模塊
選項參數 | 選項說明 |
---|---|
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 模塊
選項參數 | 選項說明 |
---|---|
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 模塊
選項參數 | 選項說明 |
---|---|
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 模塊
選項參數 | 選項說明 |
---|---|
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 模塊
選項參數 | 選項說明 |
---|---|
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 模塊
選項參數 | 選項說明 |
---|---|
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 # 執行劇本命令