ansible 使用詳解

ansible 使用詳解

準備工作及試驗環境介紹

假設有三臺主機爲:n1,n2,n3

n1作爲mater主機,其他三臺作爲受控主機

172.16.253.30主機爲centos6系統,其他主機均爲centos7系統

ssh-keygen -t rsa 
#跳過生成私鑰和公鑰中間的填寫內容

ssh-copy-id 172.16.253.184
ssh-copy-id 172.16.254.89
ssh-copy-id 172.16.253.47
ssh-copy-id 172.16.253.30

vim /etc/ansible/ansible.cfg
#替換下面指令爲:
host_key_checking = False   #本指令的含義爲:每次在執行命令前都要檢查該主機是否已經基於key做過認證

ansible srvs -m ping

#在每臺主機上創建組group和user,並設置密碼
ansible srvs -m group -a 'name="tomcat" state="present"'
ansible srvs -m user -a 'name="tomcat" group="tomcat" password="abcd" state="present"'

#以achudk用戶的身份執行以root用戶的權限執行ping指令
su - achudk
ansible srvs -m ping --become-user=root

基本使用

  • 測試執行 ” -C ” 選項
ansible HOSTS -m MODULES -a 'DIRECTIVE' -C
#或者
ansible-playbook PLAYBOOK_NAME -C
  • 查詢所有模塊的命令
ansible-doc -l

command模塊與shell模塊的區別

shell功能全面但執行效率低

command不支持:邏輯運算符、條件判斷符號、重定向命令或管道

ansible srvs -m command -a 'echo "$HOSTNAME"'
ansible srvs -m shell -a 'echo "$HOSTNAME"'

使用command模塊會報錯

ansible srvs -m command -a 'cat /etc/issue > /tmp/issue.tmp'

使用shell模塊則不會

ansible srvs -m shell -a 'cat /etc/issue > /tmp/issue.tmp'
ansible srvs -m command -a 'cat /tmp/issue.tmp'

文件傳輸模塊:copy、fetch、template

  • copy模塊:複製本機文件,傳輸至遠程主機,並修改屬主、屬組和權限

  • ==注意:可以在參數中增加 backup=yes ,可以實現備份的功能==

實現copy功能

ansible srvs -m copy -a 'src=/etc/yum.repos.d/CentOS-Base.repo dest=/etc/yum.repos.d/CentOS-Base.repo owner=root group=root mode=0644'
ansible srvs -m command -a 'yum clean all'
ansible srvs -m command -a 'yum repolist'

實現備份功能

ansible srvs -m copy -a 'src=/root/test.txt dest=/root/ backup=yes'
  • fetch模塊:複製遠程文件,傳輸至本機(僅支持傳輸文件,如果傳輸目錄可以先歸檔或壓縮爲一個文件後傳輸)

在n2主機的/root目錄下創建文件f1,在n3主機的/root目錄下創建文件f2,假設n2主機的/root目錄下沒有f2這個文件,假設n3主機的/root目錄下沒有f1這個文件,如果我們想從n2中傳輸f1這個文件至n1的/root目錄下

  • ==注意:使用fetch模塊傳輸至本地主機的文件,全部會保存在目錄,文件實際保存路徑爲:==
  • /”dest參數指定的目錄”/”源文件所在主機的IP地址”/”執行命令的用戶名”/”傳輸的文件”
#在n1主機執行命令
ansible srvs -m fetch -a 'src=/root/f1 dest=/root/ backup=yes'
#f1文件的路徑
ls 172.16.254.89/root/f1 

cron模塊

  • 增加計劃任務

設置每天的3:15,執行磁盤空間查看命令,並將命令結果保存至指定位置

ansible srvs -m cron -a 'name="disk check loger" minute=15 hour=3 job="df -hT >> /tpm/df.log"'
#驗證結果
ansible srvs -m command -a 'crontab -l'
ansible srvs -m command -a 'cat /tmp/df.log'
  • 移除指定計劃任務
ansible srvs -m cron -a 'name="disk check loger" state=absent'
#驗證
ansible srvs -m command -a 'crontab -l'

yum模塊

安裝epel源

ansible srvs -m yum -a 'name=epel-release state=latest'

安裝應用

ansible srvs -m yum -a 'name=nginx state=latest'
ansible srvs -m yum -a 'name=ntpdate state=latest'
ansible srvs -m command -a 'ntpdate 172.16.0.1'

管理各種服務:service模塊

ansible srvs -m service -a 'name=nginx state=started'  

service模塊中的state支持的選擇有:started, stopped, restarted, reloaded

ansible srvs -m service -a 'name=nginx state=restarted'

setup 模塊

自動從遠程主機上獲取可用與playbook中的變量

  • 獲取所有可用變量
ansible srvs -m setup
  • 對變量進行過濾,僅獲取符合匹配要求的變量

查詢與系統版本相關的變量

“ansible_distribution”: “CentOS”

“ansible_distribution_major_version”: “7”

#方法1
ansible srvs -m setup -a 'filter=*distribut*'
#方法2
ansible srvs -m setup | grep -i distribut

debug 模塊

可以通過debug模塊調用變量顯示想要的信息

  tasks:
  - name: show hosts information
    tags: info
    debug: msg="{{ ansible_distribution }}-{{ ansible_distribution_major_vers
ion }}-{{ ansible_distribution_release }}"

驗證結果

ansible-playbook /root/ansible/httpd-manager-j2.yml --tags=info
#結果爲
ok: [172.16.254.89] => {
    "msg": "CentOS-7-Core"
}

script 模塊

準備測試腳本

vim /root/test.sh
#!/bin/bash
#
touch /tmp/test.log
echo `date` >> /tmp/test.log
ls -l /tmp/test.log
cat /tmp/test.log

在所有主機執行腳本

ansible srvs -m script -a '/root/test.sh'

ansible-vault 命令

  • 加密 .yml 文件
#準備一個.yml文件
ansible-vault encrypt test.yml
#輸入密碼並確認

此時無法使用普通方法查看test.yml文件

  • 查看加密的.yml文件
ansible-vault view test.yml
#輸入密碼
  • 解密.yml文件
ansible-vault decrypt test.yml
#輸入密碼

此時可以使用普通方法查看.yml文件內容

ansible-galaxy 命令

  • 文件下載至/etc/ansible/roles目錄下
  • ==注意:下載其他人共享的roles,在執行前應審覈一遍文件內容,防止危險操作==

  • 安裝並使用其他人共享的roles文件

ansible-galaxy install devops.nginx
ls /etc/ansible/roles/devops.nginx
  • 想刪除下載的roles文件,將install替換爲delete即可

ansible-console 命令

ansible的交互式命令工具

ansible-console 的命令提示符

root@all (4)[f:5]$ cd srvs
root@srvs (4)[f:5]$ forks 4
root@srvs (4)[f:4]$ list
172.16.253.184
172.16.254.89
172.16.253.47
172.16.253.30

其中:

root :當前執行用戶

@ :分隔符

all :分組的組名

(4) :當前分組內的主機數量

[f:4] :併發線程數

ansible-console 的使用

ansible-console工具可自動補全選項,使用格式爲:

模塊名 選項1=value 選項2=value

service name=nginx state=started
yum name=tree state=latest
command tree -L 1 /

ansible-playbook命令及YAML語法

YAML語法

YAML :YAML ain’t a Markup Language ,以數據爲中心、而不是以標記語言爲重點的一種語言

  • 首行以 “—” 開始,且需頂格書寫
  • 次行開始寫playbook的正文,建議寫明playbook的功能等描述信息
  • 註釋符爲 ” # “
  • 格式非常嚴格,嚴格控制縮進統一,不能和空格或Tab混用
  • 縮進級別必須一致,縮進級別相同代表同級別,級別的判斷是通過縮進結合換行實現的
  • YAML文件內容和Linux系統大小寫的判斷方式保持一致,是區分大小寫的,k/v的值均對大小寫敏感
  • k/v的值可同行寫,也可換行寫,同行書寫使用分隔符 ” : ” ,換行寫分隔符 ” - “
  • 一個完整的代碼塊所必需包含的元素:name、task
  • 一個name只能包括一個task

test.yml 示例

vim /root/test.yml
#文件內容
---

- hosts: srvs
  remote_user: root
  tasks:
  - name: adduser test
    user: name=test shell=/bin/bash home=/home/test

playbook 核心元素

  • hosts :指定運行任務的目標主機
  • tasks :任務列表
  • variables :變量
  • templates :模板
  • handlers :動作執行探測器,探測到指定條件,觸發執行動作
  • roles :按照固定目錄結構組成的playbook

playbook中tags、notify、handlers的使用

  • ==playbook實例 :httpd-manager.yml==
---

- hosts: srvs
  remote_user: root
  tasks:
  - name: install httpd
    tags: install
    yum: name=httpd state=latest

  - name: start httpd.service
    tags: start
    service: name=httpd state=started

  - name: start httpd.service
    tags: restart
    service: name=httpd state=restarted

  - name: stop httpd.service
    tags: stop
    service: name=httpd state=stopped

  - name: config httpd
    tags: config
    copy: src=/root/ansible/httpd.conf dest=/etc/httpd/conf/ backup=yes
    when: ansible_distribution_major_version == "7"
    notify: restart httpd

  handlers:
  - name: restart httpd
    service: name=httpd state=restarted
  • 實現功能:

  • 單獨調用其中一個功能

ansible-playbook httpd-server-deploy.yml --tags=start
  • 同時調用多個功能
ansible-playbook httpd-server-deploy.yml --tags="stop,config"
  • 針對某一單個成員執行某一功能
ansible-playbook httpd-server-deploy.yml --tags="start,stop" -l 172.16.253.30

playbook中變量的使用

定義變量

在/etc/ansible/hosts文件中定義變量,可針對某臺主機定義變量,也可以對整個分組定義變量

組變量和主機變量的生效優先級爲:如果針對主機定義了變量(無論是否定義了組變量),主機變量生效;如果未定義主機變量,僅定義了組變量,組變量生效。

vim /etc/ansible/hosts

#組變量
[srvs:vars]
webport=80

#主機變量
[srvs]
172.16.253.184 webport=10080 hostname=node1
172.16.254.89  webport=10180 hostname=node2
172.16.253.47  webport=10280 hostname=node3
172.16.253.30  webport=10380 hostname=node4

調用變量

調用變量的兩種方式的生效優先級:在命令行下直接定義的變量優先級高於在hosts文件中定義的變量(主機變量或分組變量)
1. 可以在命令行模式直接使用”ansible-playbook test.yml -e “webport=2000”
2. 調用在hosts文件中定義好的變量

引用變量注意:使用雙大括號 “{{ VAR-NAME }}” ,且括號前後要有空格

  • 修改主機名
ansible srvs -m hostname -a 'name=“name-{{ hostname }}-port-{{ webport }}"'
ansible srvs -m command -a 'hostname'
#執行結果
172.16.253.30 | SUCCESS | rc=0 >>
name-node4-port-10380

172.16.253.184 | SUCCESS | rc=0 >>
name-node1-port-10080

172.16.253.47 | SUCCESS | rc=0 >>
name-node3-port-10280

172.16.254.89 | SUCCESS | rc=0 >>
name-node2-port-10180

ansible-playbook 之強大的 template

  • jianja2語法格式:

支持算術運算:+ , - , * , / , **

支持比較操作符:== , >= , != , <= , > , <

支持邏輯運算符: and , or , not

支持流表達式:for , if , while

使用template在配置文件中調用變量

  • 設置template配置文件
#設置jianja2文件
cp /root/ansible/httpd.conf /root/ansible/httpd.conf.j2
vim /root/ansible/httpd.conf.j2
#修改Listen一項的值爲 "{{ webport }}"
Liten {{ webport }}

#重新設置yml文件
cp /root/ansible/httpd-manager.yml /root/ansible/httpd-manager-j2.yml
vim /root/ansible/httpd-manager-j2.yml
#修改config配置塊中的copy指令爲template指令,其他部分不變,示例如下:

  - name: config httpd
    tags: config
    template: src=/root/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    when: ansible_distribution_major_version == "7"
    notify: restart httpd
  • 執行playbook
ansible-playbook /root/ansible/httpd-manager-j2.yml --tags=config
#執行結果:對分組中不同的主機採用不同的端口
ansible srvs -m shell -a 'ss -tnlp | grep httpd'
  • template還支持算術運算

將所有端口加1

vim /root/ansible/httpd.conf.j2
#修改以下內容
Listen {{ webport+1 }}

通過template在配置文件中使用for循環和if語句

  • 定義基於不同域名的多個虛擬主機
#查找主機名變量
ansible srvs -m setup | grep hostname

#修改httpd.conf.j2文件
Listen {{ webport }}

<VirtualHost *.{{ webport }}>
        ServerName {{ ansible_hostname }}.achudk.com
        DocumentRoot /var/www/html
        <Directory "/var/www">
                Require all granted
        </Directory>
</VirtualHost>

#驗證結果
ansible-playbook /root/ansible/httpd-manager-j2.yml --tags=config
curl curl 172.16.254.89:10180
  • 使用for循環生成多個基於不同域名且不同端口的虛擬主機,並使用if判斷條件
#修改httpd.conf.j2文件
vim httpd.conf.j2
{% for vport in vports %}
        <VirtualHost *.{{ vport }}>
                ServerName {{ ansible_hostname }}.achudk.com
                DocumentRoot /var/www/html
                <Directory "/var/www">
                        Require all granted
                </Directory>
                {% if errorlog is not defined %}
                ErrorLog "{{ errorlog | default('/web/httpd/log/vh1/error_log') }}"
                {% endif %}
        </VirtualHost>
{% endfor %}


#修改httpd-manager-j2.yml文件,在起始處增加vars指令,餘下內容不變,如下:
vim httpd-manager-j2.yml
#正文如下
---

- hosts: srvs
  remote_user: root
  vars:
  - vport:
    - 80
    - 443
    - 8080
  - errorlog:
    - "/web/httpd/log/vh1/error_log"

#驗證結果
ansible-playbook /root/ansible/httpd-manager-j2.yml --tags=config
  • when條件判斷
#當系統爲CentOS7時,才啓用該配置片段
  - name: config httpd
    tags: config
    template: src=/root/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    when: ansible_distribution == "CentOS"
    when: ansible_distribution_major_version == "7"
    notify: restart httpd
  • ==when指令的多條件聯合判斷==

多個條件之間使用 “and” 連接

  tasks:
  - name: show hosts information
    tags: info
    debug: msg={{ ansible_distribution }},msg={{ ansible_distribution_major_v
ersion }}
    when: ansible_distribution == "CentOS" and ansible_distribution_major_ver
sion == "6"

==最終實例==

將所學內容綜合起來使用,形成具有管理功能的yml文件

---

- hosts: srvs
  remote_user: root
  vars:
  - vports:
    - 80
    - 443
    - 8080
  - errorlog:
    - "/web/httpd/log/vh1/error_log"

  tasks: 
  - name: show hosts information
    tags: info
    debug: msg="{{ ansible_distribution }}-{{ ansible_distribution_major_version }}-{{ ansible_distribution_release }}"


  - name: install httpd
    tags: install
    yum: name=httpd state=latest


  - name: start httpd.service
    tags: start
    service: name=httpd state=started

  - name: start httpd.service
    tags: restart
    service: name=httpd state=restarted

  - name: stop httpd.service
    tags: stop
    service: name=httpd state=stopped

  - name: config httpd
    tags: config
    template: src=/root/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    when: ansible_distribution == "CentOS" and ansible_distribution_major_ver
sion == "7"  
    notify: restart httpd

  handlers:
  - name: restart httpd
    service: name=httpd state=restarted
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章