文章目錄
- 1. 概述
- 2.生産環境下ssh登入及使用者權限政策
-
- 2.1 安全政策
- 2.2 具體配置
- 2.3 配置ansible管理伺服器sudo審計日志
- 3.安裝ansible
-
- 3.1 實驗環境配置
- 3.2 安裝ansible及配置
-
- 3.2.1 安裝ansible
- 3.2.2 配置主機清單
- 3.2.3 設定ssh免密碼登入
- 3.3 Ansible伺服器簡單的綜合安全管理政策
- 4. 基礎應用子產品
-
- 4.1 指令基本文法:
- 4.2 ping子產品
- 4.3 command子產品
- 4.4 shell子產品
- 4.5 cron子產品
- 4.6 copy子產品
- 4.7 script子產品
- 4.8 yum子產品
- 4.9 service子產品
- 4.10 user子產品
- 4.11 setup子產品
- 4.12 fetch子產品
- 4.13 檢視CPU,mem,IO的指令
- 5. 使用ansible-playbook
-
- 5.1 執行腳本的格式:
- 5.2 Python的資料格式
- 6. roles标準化playbook
-
- 6.1 roles原型目錄結構
- 6.2 入口觸發配置檔案
- 6.3 roles中,tasks下各ansible子產品的使用
1. 概述
- 基于Python開發的一款的批量管理工具,實作了批量運作指令,部署程式,配置系統等功能
- 預設通過ssh協定,以root使用者登入目标伺服器,通過各種子產品實作不同的功能
-
ansible及其他自動化工具有:
管理工具|管理伺服器數量|優缺點
-|
ansible|<500台|
saltstack|1000~4w台|
puppet|
2.生産環境下ssh登入及使用者權限政策
2.1 安全政策
禁止密碼登入:
工作環境中,通常禁止使用者使用密碼登入,是以在ansible管理機中,需要生成秘鑰(ssh-keygen),給所有被管理的伺服器分發公鑰,使ansible連接配接被管理伺服器時,采用秘鑰登入不留下鍵盤輸入,增強安全性
禁止root使用者遠端登入:
防止惡意破壞主機,可以指定一個普通使用者,通過visudo授權ALL權限,使普通使用者通過提權來獲得高權限,這樣防止root使用者遠端登入,又保證了對伺服器所擁有的高權限
普通使用者密鑰登入:
在該使用者家目錄下,放公鑰,配置xshell以密鑰登入
- 關閉GSSAPI認證
- 修改ssh連接配接端口,通常設定在1w以上,避免nmap指令掃描出來
- 注意.ssh目錄權限是700,屬主屬組是該家目錄使用者,公鑰檔案權限是600
2.2 具體配置
- 修改配置檔案為以下狀态
cat -n /etc/ssh/sshd_config | sed -n '17p;38p;43p;47p;65p;79p;115p'
Port 22221 #修改端口,切記配置好密鑰後再進行
PermitRootLogin yes #yes表示開啟root遠端登入,非大規模伺服器可以圖友善開啟,關閉改成no
PubkeyAuthentication yes #開啟公鑰連接配接認證,預設是注釋的
AuthorizedKeysFile .ssh/authorized_keys #指定公鑰存放位置
PasswordAuthentication no #允許密碼認證方式,no代表關閉,預設是yes
GSSAPIAuthentication no #關閉GSSAPI認證,提高ssh連接配接速度
UseDNS no #關閉DNS反向解析,提高ssh連接配接速度
2.3 配置ansible管理伺服器sudo審計日志
開啟sudo日志,rsyslog服務時所有日志記錄的服務程序
echo "local1.debug /var/log/sudo.log" >> /etc/rsyslog.conf
echo "Defaults logfile=/var/log/sudo.log" >> /etc/sudoers
visudo -c #手動檢測visudo文法是否正确
systemctl restart rsyslog
#執行一次sudo提權,sudo su -,再檢視sudo日志
cat /var/log/sudo.log
3.安裝ansible
3.1 實驗環境配置
linux及核心版本
CentOS Linux release 7.5.1804
3.10.0-862.3.3.e17.x86_64
-
ansible版本
ansible 2.8.1
- 配置好epel源yum
3.2 安裝ansible及配置
3.2.1 安裝ansible
#通過yum方式安裝:
yum -y install ansible
#通過Python的pip方式安裝ansible(pip是一個Python包管理工具,查找Python相關的包)
yum -y install python2-pip
pip install ansible
#我們用yum安裝ansible
ansible --version
#檢視ansible版本
3.2.2 配置主機清單
vim /etc/ansible/hosts
#添加子產品,子產品中添加主機
[nginx]
web01 ansible_ssh_host=192.168.200.172
web02 ansible_ssh_host=192.168.200.173
-
參數說明:
ansible_ssh_host:被管理主機IP
ansible_ssh_user:指定登入使用者
ansible_ssh_pass:指定登入使用者的密碼
ansible_sudo_pass:被管理主機使用者sudo時的密碼
3.2.3 設定ssh免密碼登入
使用ssh-keygen産生密鑰對,通過ssh-copy-id發送公鑰給被管理的主機
ssh-copy-id 192.168.200.172
ssh-copy-id 192.168.200.173
3.3 Ansible伺服器簡單的綜合安全管理政策
禁止非root使用者檢視ansible管理伺服器端/etc/hosts檔案,和主機清單檔案
chmod 600 /etc/hosts
chmod 600 /etc/ansible/hosts
4. 基礎應用子產品
4.1 指令基本文法:
ansible <被操控的主機|主機組|all>[-m 子產品名][-a ‘具體指令’]
4.2 ping子產品
檢測指定主機的連通性
ansible webA -m ping
#或者指定[nginx],webB
4.3 command子產品
在遠端主機執行指令,不支援管道符和重定向
ansible webA -m command -a ‘uptime’
4.4 shell子產品
也是遠端執行指令,并支援管道符和重定向等複雜指令
ansible all -m shell -a ‘echo “ansible 192.168.200.170” >> /etc/hosts’
4.5 cron子產品
-
定義定時任務,包含兩種狀态:
crontab時間周期(不設定預設為*):
minute:分鐘
hour:小時
day:日期
month:月份
weekday:周期
- job:指定運作的指令
- name:定時任務描述,不可缺少,是清除時的依據
-
state狀态:
present:添加定時任務,不寫狀态預設添加
absent:移除定時任務,移除時,隻需要指定name描述
-
user:指定定時任務以哪個使用者身份執行,不指定預設root
ansible all -m cron -a ‘minute="*/10" job="/bin/echo hello" name=“test cron job” state=present’
4.6 copy子產品
- 批量分發檔案
- src=:檔案路徑
- dest=:目标路徑,加檔案名可改名
- backup=yes:有同名檔案時,先備份再覆寫
- owner:分發檔案時,指定檔案的屬主
- mode:指定權限
-
等,使用該子產品時,可檢視所有參數
ansible all -m copy -a ‘src=/etc/hosts dest=/tmp/yun owner=yunjisuan mode=640 backup=yes’
4.7 script子產品
将本地腳本複制到被管理主機的記憶體中并執行,不會在被管理主機中留下腳本檔案
ansible all -m script -a ‘/tmp/test.sh’
-
也可以使用copy子產品先将腳本檔案複制到目标伺服器,然後執行:
ansible all -m copy -a ‘src=/tmp/test.sh dest=/tmp/test.sh’
ansible all -m script -a '/bin/bash /tmp/test.sh
4.8 yum子產品
- 利用yum安裝軟體包,能用shell替代
- name:指定軟體包名
-
state狀态
present:安裝軟體包,不指定則預設安裝
absent:解除安裝軟體包
#解除安裝webA上的namp
ansible webA -m yum -a ‘name=namp state=absent’
4.9 service子產品
- 管理服務程式,能被shell替代
- name:指定服務名
-
state狀态:
started:啟動
stopped:停止
restarted:重新開機
reloaded:平緩重載
-
enabled開機自啟動:
true:設定開機自啟
false:設定開機不啟動
#示例:
ansible webA -m service -a ‘name=firewalld state=started enabled=true’
4.10 user子產品
- 管理使用者賬号
- name:指定使用者名
- comment:使用者描述,可以不用
- createhome:是否建立家目錄
- uid:指定uid
- groups:指定gid,不指定預設建立同uid的組
- password:指定密碼
- update_password:更新使用者密碼
-
shell:指定使用者登入方式
/bin/bash
/sbin/nologin
-
home:指定家目錄路徑
-state狀态:
present:建立,不指定預設建立
absent:删除
-
remove:删除是,确認是否删除家目錄
=true或=false
-
需要注意這樣建立使用者,密碼是明文,無法使用,是以需要通過一些操作來獲得想要的密文
#安裝Python2的pip工具,通過pip工具安裝python的加密子產品來給密碼加密
yum -y install python2-pip
pip install passlib
python -c “from passlib.hash import sha512_crypt;import getpass;print sha512_crypt.encrypt(getpass.getpass())”
#然後輸入想加密的密碼,系統會輸出加密後的密碼,然後複制到password參數後面,這樣建立使用者就是密文了
4.11 setup子產品
收集,檢視被管理主機的facts(ansible采集被管理主機裝置資訊的一個功能),每個被管理主機在接收并運作管理指令之前,都會将自己相關資訊(作業系統版本,IP位址等)發送給控制主機
ansible webA -m setup | less
#輸出資訊會非常多,也可以指定127.0.0.1檢視本機内置參數
4.12 fetch子產品
從遠端主機拉取檔案到ansible機器上,會保留遠端主機的目錄結構
- src:要複制的遠端主機的檔案路徑
- dest:拉取到本地此路徑下
4.13 檢視CPU,mem,IO的指令
- top 可檢視目前CPU占用率,MEN剩餘量,由于該指令占用記憶體大,可以重定向到某個檔案再檢視
- iostat 檢視系統分區的IO使用情況,也可以檢視CPU的平均負荷,通過安裝sysstat安裝iostat指令
- iotop,動态顯示各個程序的IO情況,可以定位IO操作重的程序
5. 使用ansible-playbook
5.1 執行腳本的格式:
1. 執行劇本檔案:
ansible-playbook test_shell.yaml
2. 具體格式範例:
cat test_shell.yaml #劇本檔案固定以.yaml結尾
#内容為:
--- #固定三個 - 頂格寫
- hosts: web1 #執行範圍,hosts前有兩個占位
gather_facts: True #使用ansible内置變量
vars: #啟用自定義變量
- AGE: 3 #用大寫避免和内置變量沖突
PORT: 100
tasks: #具體任務
#調用shell子產品
- name: shell #任務名,相對于tasks,多縮進兩格
shell: echo "welcome" >> /tmp/yun.txt
#copy子產品
- name: copy
copy: src=/tmp/nginx.j2 dest=/usr/local/nginx/conf/nginx.conf backup=yes
#利用template下發可變配置檔案,檔案内容看下文
- name: template
template: src=/tmp/test.j2 dest=/tmp/test222
notify:
- reload nginx #觸發notify後執行的動作
handlers: #定義動作,和tasks同級
- name: reload nginx #動作名
shell: /usr/local/nginx/sbin/nginx -s reload
#利用notify通知,目前面的指令執行成功,檔案發生改變後,執行reload nginx
#測試變量,引用變量需要在雙引号中引用,并且用兩對大括号引用,變量名兩頭空格
- name: vars
shell: echo "myage {{ AGE }},ip {{ ansible_all_ipv4_addresses[0] }}"
#利用register子產品将檢測nginx配置檔案的結果儲存在自定義變量print_result中,在debug中輸出變量的值,- debug:var= 是固定格式,需要注意的是debug隻輸出目前name任務指令的結果
- name: register
shell: /usr/local/nginx/sbin/nginx -t
register: print_result
- debug: var=print_result
3. 自定可變配置檔案
cat /tmp/test.j2
#内容為下,加入了if判斷
{% if PORT %}
ip=0.0.0.0:{{ PORT }}
{% else %}
ip=0.0.0.0:80
{% else %}
my age is {{ AGE }}
my ip is {{ ansible_all_ipv4_addresses[0] }}
5.2 Python的資料格式
- 輸入python進入Python環境
-
變量指派:
num = “yunjisuan” 或
num = 123
等号兩邊空格,字母需要雙引号指派會變成字元串,用數字識别為整性int
-
清單取值:
num = [1,3,5]
類型為list,根據索引取值,從0開始輸入name[0]結果為1,name[2]這裡和name[-1]一樣,取最後的值
-
字典/鍵值型:
num = {“user1”:123,“user2”:“abc”,“user3”:[1,2,3]}
鍵需要用雙引号,值可以使用清單,取值方式為
num[“user1”]=123
num[“user3”][0]=1
6. roles标準化playbook
6.1 roles原型目錄結構
/myroles/
├── nginx.yaml #入口觸發配置檔案
└── roles #playbook的原型配置目錄
└── nginx #nginx相關模組配置目錄
├── files #copy模快,script子產品檔案的源路徑
│ ├── test
│ └── test.sh
├── handlers #notify通知調用的配置檔案
│ └── main.yaml #檔案内容包含了可調用的動作
├── tasks #存放ansible主任務檔案
│ └── main.yaml #寫了所有執行的任務name
├── templates #存放可變配置檔案的
│ └── test.j2 #内容中引用變量
└── vars #存放變量檔案
└── main.yaml #自定義變量的指派
6.2 入口觸發配置檔案
指定調用執行roles下的某個模組
cat /myroles/nginx.yaml
#内容為
---
- hosts: all #執行的主機範圍
gather_facts: True #開啟系統内置變量
roles: #啟用roles原型配置
- nginx #執行nginx原型模組
6.3 roles中,tasks下各ansible子產品的使用
- roles的本質,就是将tasks任務單獨寫了,前文指定的nginx,就相當于整個tasks集合
- 自定義變量vars模組的配置檔案,格式如下
cat roles/nginx/vars/main.yaml
---
my_name: yunjisuan
phone: 12345
- copy子產品需要推送的檔案
cat roles/nginx/files/test
welcone to yunjisuan
- script子產品執行的腳本
cat roles/nginx/files/test.sh
echo "aaa" >> /tmp/test
- template可變配置檔案的使用,通常檔案名以.j2結尾
cat roles/nginx/template/test.j2
#内容為
my name is {{ my_name }},my phone is {{ phone }}
my ipaddress is {{ ansible_all_ipv4_addresses[0] }}
- notify通知子產品的配置檔案格式如下
cat roles/nginx/handlers/main.yaml
#内容為
---
- name: start_nginx
shell: /usr/local/nginx/sbin/nginx
- name: stop_nginx
shell: /usr/local/nginx/sbin/nginx
- name: reload_nginx
shell: /usr/local/nginx/sbin/nginx
- tasks檔案範例:
cat roles/nginx/tasks/main.yaml
#内容為
---
- name:
ping:
- name:
shell: ls /
register: ls_result
- debug: var=ls_result
- name:
shell: echo my phone is {{ phone }}
register: echo_result
- debug: var=echo_result
- name:
copy: src=test dest=/root/
- name:
script: test.sh
- name:
template: src=test.j2 dest=/root/test2
notify: start_nginx