天天看點

Ansible批量化自動化管理工具及ssh安全政策1. 概述2.生産環境下ssh登入及使用者權限政策3.安裝ansible4. 基礎應用子產品5. 使用ansible-playbook6. roles标準化playbook

文章目錄

  • 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
           

繼續閱讀