天天看點

Ansible-01-基礎一、基本介紹二、基本原理三、安裝四、配置被管理節點五、管理節點和被管理節點建立免密登入六、基本文法

一、基本介紹

Ansible 是一個 IT 自動化工具。它能配置系統、部署軟體、編排更複雜的 IT 任務,如連續部署或零停機時間滾動更新。

Ansible 用 Python 編寫,盡管市面上已經有很多可供選擇的配置管了解決方案(例如 Salt、Puppet、Chef等),但它們各有優劣,而Ansible的特點在于它的簡潔。

讓 Ansible 在主流的配置管理系統中與衆不同的一點便是,它并不需要你在想要管理的每個機器上安裝自己的用戶端元件,就可以對所要管理的機器進行管理,管理伺服器和被管理機器之間使用的是 SSH 協定進行通信的。

同時提供的另一個優點,如果需要的話,你可以在不止一個地方控制你的整個基礎架構。

二、基本原理

Ansible-01-基礎一、基本介紹二、基本原理三、安裝四、配置被管理節點五、管理節點和被管理節點建立免密登入六、基本文法

1、在ANSIBLE 管理體系中,存在"管理節點" 和 “被管理節點” 兩種角色。

2、被管理節點通常被稱為"資産"

3、在管理節點上,Ansible将 AdHoc 或 PlayBook 轉換為Python腳本。

并通過SSH将這些Python 腳本傳遞到被管理伺服器上。

在被管理伺服器上依次執行,并實時的将結果傳回給管理節點。

三、安裝

Ansible-01-基礎一、基本介紹二、基本原理三、安裝四、配置被管理節點五、管理節點和被管理節點建立免密登入六、基本文法

1 先決條件

管理節點

  • 确儲存在OpenSSH
  • 確定Python 版本 >= 2.6
  • 確定安裝ansible

被管理節點

  • 确儲存在OpenSSH
  • 確定Python 版本 >= 2.4 //若為2.4 版本,確定安裝了python-samplesjson 擴充
  • 不需要安裝 ansible

2 安裝

使用官方 epel 源

yum install -y epel-release
yum install -y ansible
           

使用阿裡 epel-7 源

cat >/etc/yum.repos.d/epel-7.repo<<EOF
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=http://mirrors.aliyun.com/epel/7/$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=http://mirrors.aliyun.com/epel/7/$basearch/debug
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0

[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=http://mirrors.aliyun.com/epel/7/SRPMS
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0
EOF
           
yum  install -y ansible
           

四、配置被管理節點

1 Inventory 資産清單介紹

被管理節點的資訊需要寫到一個

ini

風格的配置檔案中, 這樣的檔案成為資産清單(Inventory)。

這個檔案預設的路徑是

/etc/ansible/hosts

一行一個,可以是被管理主機的 IP 位址

192.168.122.10

也可以是被管理主機的主機名

aoliao

或者是被管理主機的 FQDN

aoliao.sharkyun.com

示例:

192.168.122.10
192.168.122.20
           

分組

當然也可以對所要管理的節點進行分組,當然,這也是生産環境中的最佳實戰。

格式如下

[組名]
主機1
主機2

           

組名中隻能是:

大小寫字母、數字和下劃線

最佳實戰:

  • 字母全部用小寫
  • 不用數字開頭
  • 不同的單詞之間用下劃線隔開或者使用小駝峰命名法

    [web_servers]

    [webServers]

    小駝峰

分組建議:

  • 以開發語言進行分組

    [java]

    [php]

    [go]

  • 以服務類型區分

    [nginx]

    [tomcat]

    [slb]

    [dbServer]

  • 加上主機所在的城市、機房等位置資訊

    [bjYzDbServer]

    [ShangHaiTomcat]

  • 加上項目字首

    [ZFB_SH_SLB]

2 資産清單配置

清空預設的清單檔案内容

> /etc/ansible/hosts
           

根據自己的情況添加所要管理的機器資訊

假設場景:

目前計劃搭建一個高并發叢集

  • SLB 使用 Nginx 實作
  • 後端 Real Server 也是要 Nginx 實作
[slb]
192.168.122.10

[webNginx]
192.168.122.20
192.168.122.30

           

子組

可以看出以上資産清單, 3 台主機都需要安裝 Nginx, 但是他們又被配置設定了不同的角色,這樣它們的配置檔案肯定不一樣。為了友善操作,這裡可以使用子組。

[slb]
192.168.122.10

[webNginx]
192.168.122.20
192.168.122.30

[nginx]
[nginx:children]
slb
webNginx
           

3 更多寫法

[someGroup]
1.1.1.1
2.2.2.2
3.3.3.[1:15]
test01.qfedu.com
test03.qfedu.com
test[05:09].qfedu.com

           

4 擷取資産清單資訊

擷取某個組的主機清單

[[email protected] ~]# ansible nginx --list
  hosts (3):
    192.168.122.10
    192.168.122.20
    192.168.122.30
[[email protected] ~]# ansible webNginx --list
  hosts (2):
    192.168.122.20
    192.168.122.30
           

五、管理節點和被管理節點建立免密登入

均在管理節點上操作

1 確定執行 ansible 指令的使用者有密鑰對

  • -f 指定建立的私鑰路徑。
  • -N 給建立的私鑰再加一個密碼,

    ""

    表示不加密碼。

2 向被管理節點傳送公鑰

修改配置檔案 /etc/ansible/ansible.cfg

host_key_checking = False
           

執行如下指令

  • user=test

    指定的的被管理主機的使用者,需要和下面的

    ansible_ssh_user

    的使用者一緻
  • ansible_ssh_user

    被管理主機的使用者
  • ansible_ssh_pass

    被管理主機的使用者密碼

3 測試

執行如下指令:

六、基本文法

ansible 資産比對模式 -m 功能子產品 -a "功能子產品的參數"

一句話:ansible 讓誰做什麼,具體如何去做

  • 誰–》 資産比對模式
  • 做什麼 --》功能子產品
  • 如何去做 --》功能子產品的參數

1 資産比對模式

資産比對模式就是針對哪些被管理節點。可以是:

  • 具體的一個主機:

    192.168.122.20

    注意:這裡些的條目必須和資産清單中的一緻,清單中是 IP,這裡就寫 IP,清單中是主機名,這裡也必須是主機名。
  • 資産清單中的一個組名

    webNginx

2 功能子產品

Ansible 把希望被管理節點具體做什麼任務,都開發成具體的子產品了。

比如,希望執行被管理節點執行一條 shell 指令,就可以使用 shell 這個子產品。

類似的還有:

  • copy
  • file
  • user
  • group

目前 ansible 的功能子產品已經達到三千多個了。

可以使用如下指令擷取目前安裝版本的具體子產品數量。

ansible-doc -l |wc -l
           

列出目前系統中所有的子產品

ansible-doc -l
           

擷取某個子產品的幫助文檔

ansible-doc 子產品名

ansible-doc copy
           

3 常用的幾個子產品

4. 1 command & shell 子產品

兩個子產品都是在遠端伺服器上去執行指令。

但command子產品是ad-hoc的預設子產品,在執行ad-hoc時,若不指定子產品的名字則預設使用此子產品。

# ansible webNginx -a "echo 'hello'"
192.168.122.20 | CHANGED | rc=0 >>
hello
192.168.122.30 | CHANGED | rc=0 >>
hello
# ansible webNginx -m shell -a "echo 'hello'"
192.168.122.20 | CHANGED | rc=0 >>
hello
192.168.122.30 | CHANGED | rc=0 >>
hello
           

兩個子產品的差異

  • shell 子產品可以執行SHELL 的内置指令和 特性(比如管道符)。
  • command 子產品無法執行SHELL 的内置指令和特性

Example

執行:

輸出:

192.168.122.20 | CHANGED | rc=0 >>
e
192.168.122.30 | CHANGED | rc=0 >>
e
           

執行:

輸出:

192.168.122.20 | CHANGED | rc=0 >>
hello|grep -o e
192.168.122.30 | CHANGED | rc=0 >>
hello|grep -o e
           

4.2 script 子產品

将管理節點上的腳本傳遞到被管理節點(遠端伺服器)上進行執行。

Example

管理節點上的一個腳本

腳本

/root/a.sh

内容如下:

touch /tmp/testfile
           

執行

驗證

4.3 copy 子產品

copy 子產品的主要用于管理節點和被管理節點之間的檔案拷貝。

常用參數:

  • src 要複制到遠端伺服器的檔案的本地路徑。

    這可以是絕對的,也可以是相對的。

    如果路徑是一個目錄,則遞歸地複制它。

    在這種情況下,如果路徑以“/”結尾,則隻有該目錄的内部内容被複制到目标。

    否則,如果不以“/”結尾,則複制包含所有内容的目錄本身。

    此行為類似于rsync指令行工具。

  • dest 檔案應複制到的遠端絕對路徑。

    如果src是一個目錄,那麼它也必須是一個目錄。

    如果dest是不存在的路徑,則建立dest。

    如果dest是相對路徑,則起始目錄由遠端主機确定。

    如果src和dest是檔案,則不建立dest的父目錄,如果父級目錄不存在,則任務失敗。

  • backup 拷貝檔案前,若原目标檔案發生了變化,則對目标檔案進行備份
  • woner 指定新拷貝檔案的所有者
  • group 指定新拷貝檔案的所有組
  • mode 指定新拷貝檔案的權限

Example

  • copy 管理節點上的

    nginx.repo

    到被管理節點上
# cat nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
           

執行:

  • copy 前, 在被管理節點上對原檔案進行備份
  • copy 檔案的同時對檔案進行使用者及使用者組設定

all 是資産清單中的預設組

  • copy 檔案的同時對檔案進行權限設定

4.5 yum 子產品

等同于 Linux 上的YUM 指令, 對遠端伺服器上RPM包進行管理。

常用參數:

  • name 要安裝的軟體包名, 多個軟體包以英文逗号(,) 隔開
  • state 對目前指定的軟體安裝、移除操作(present installed latest absent removed)

    支援的參數

    - present 确認已經安裝,但不更新

    - installed 确認已經安裝

    - latest 確定安裝,且更新為最新

    - absent 和 removed 确認已移除

Example

  • 安裝一個軟體包
    ansible webNginx -m yum -a "name=nginx state=present"
    ansible webNginx  -m yum -a "name=nginx state=latest"
    ansible webNginx -m yum -a "name=nginx state=installed"
               
  • 移除一個軟體包
    ansible webNginx -m yum -a "name=nginx state=absent"
    ansible webNginx -m yum -a "name=nginx state=removed"
               
  • 安裝一個軟體包組

4.5 systemd 子產品

Centos6 之前的版本使用

service

子產品。

請使用

ansible-doc service

指令自行檢視幫助資訊。

管理遠端節點上的 systemd 服務,就是由 systemd 所管理的服務。

常用參數:

  • daemon_reload 重新載入 systemd,掃描新的或有變動的單元
  • enabled 是否開機自啟動 yes|no
  • name 必選項,服務名稱 ,比如 httpd vsftpd
  • state 對目前服務執行啟動,停止、重新開機、重新加載等操作(started,stopped,restarted,reloaded)

Example

  • 重新加載 systemd
  • 啟動 Nginx 服務
  • 關閉 Nginx 服務
  • 重新開機 Nginx 服務
  • 重新加載 Nginx 服務
  • 将 Nginx 服務設定開機自啟動

4.6 group 子產品

在被管理節點上,對組進行管理。

常用參數:

  • name 組名稱, 必須的
  • system 是否為系統組, yes/no , 預設是 no
  • state 删除或這建立,present/absent ,預設是present

Example

  • 建立普通組 db_admin

4.7 user 子產品

用于在被管理節點上對使用者進行管理。

常用參數:

  • name 必須的參數, 指定使用者名
  • password 設定使用者的密碼,這裡接受的是一個加密的值,因為會直接存到 shadow, 預設不設定密碼
  • update_password 假如設定的密碼不同于原密碼,則會更新密碼. 在 1.3 中被加入
  • home 指定使用者的家目錄
  • shell 設定使用者的 shell
  • comment 使用者的描述資訊
  • create_home 在建立使用者時,是否建立其家目錄。預設建立,假如不建立,設定為 no。2.5版本之前使用 createhome
  • group 設定使用者的主組
  • groups 将使用者加入到多個其他組中,多個用逗号隔開。
    預設會把使用者從其他已經加入的組中删除。
               
  • append yes|no 和 groups 配合使用,yes 時,
    不會把使用者從其他已經加入的組中删除
               
  • system 設定為 yes 時,将會建立一個系統賬号
  • expires 設定使用者的過期時間,值為時間戳,會轉為為天數後,放在 shadow 的第 8 個字段裡
  • generate_ssh_key 設定為 yes 将會為使用者生成密鑰,這不會覆寫原來的密鑰
  • ssh_key_type 指定使用者的密鑰類型, 預設 rsa, 具體的類型取決于被管理節點
  • state 删除或添加使用者, present 為添加,absent 為删除;
    預設值 present
               
  • remove 當與 state=absent 一起使用,删除一個使用者及關聯的目錄,
    比如家目錄,郵箱目錄。可選的值為: yes/no
               

Example

  • 建立使用者并設定密碼

    先生成加密密碼

    執行 ansible 指令 建立使用者 foo 并設定密碼

  • 建立使用者 yangge, 并且為其建立密鑰對,并且密鑰類型為: ecdsa
  • 建立用 tom, 并且設定其有效期到 2020年4月15日, 加入到組 db_admin 中, 不改變使用者原有假如的組。

file 子產品

file 子產品主要用于遠端主機上的檔案操作。

常用參數:

  • owner 定義檔案/目錄的屬主
  • group 定義檔案/目錄的屬組
  • mode 定義檔案/目錄的權限
  • path 必選項,定義檔案/目錄的路徑
  • recurse 遞歸的設定檔案的屬性,隻對目錄有效
  • src 連結(軟/硬)檔案的源檔案路徑,隻應用于state=link的情況
  • dest 連結檔案的路徑,隻應用于state=link的情況
  • state
    • directory 如果目錄不存在,建立目錄
    • file 檔案不存在,則不會被建立,存在則傳回檔案的資訊,

      常用于檢查檔案是否存在。

    • link 建立軟連結
    • hard 建立硬連結
    • touch 如果檔案不存在,則會建立一個新的檔案,如果檔案或目錄已存在,則更新其最後修改時間
    • absent 删除目錄、檔案或者取消連結檔案

Example

// 建立一個檔案
ansible all -m file -a "path=/tmp/foo.conf state=touch"
// 改變檔案所有者及權限
ansible all  -m file -a "path=/tmp/foo.conf owner=nobody group=nobody mode=0644"
// 建立一個軟連接配接
ansible all  -m file -a "src=/tmp/foo.conf dest=/tmp/link.conf state=link"
// 建立一個目錄
ansible all  -m file -a "path=/tmp/testdir state=directory"
// 取消一個連接配接
ansible all  -m file -a "path=/tmp/link.conf state=absent"
// 删除一個檔案
ansible all -m file -a "path=/tmp/foo.conf state=absent"
           

4.9 cron 子產品

管理遠端節點的CRON 服務。等同于Linux 中的 計劃任務。

注意:使用 Ansible 建立的計劃任務,是不能使用本地

crontab -e

去編輯,否則 Ansible 無法再次操作此計劃任務了。

常用參數:

  • name 指定一個cron job 的名字。一定要指定,便于日之後删除。
  • minute 指定分鐘,可以設定成(0-59, *, */2 等)格式。 預設是 * , 也就是每分鐘。
  • hour 指定小時,可以設定成(0-23, *, */2 等)格式。 預設是 * , 也就是每小時。
  • day 指定天, 可以設定成(1-31, *, */2 等)格式。 預設是 * , 也就是每天。
  • month 指定月份, 可以設定成(1-12, *, */2 等)格式。 預設是 * , 也就是每周。
  • weekday 指定星期, 可以設定成(0-6 for Sunday-Saturday, * 等)格式。預設是 *,也就是每星期。
  • job 指定要執行的内容,通常可以寫個腳本,或者一段内容。
  • state 指定這個job的狀态,可以是新增(present)或者是删除(absent)。 預設為新增(present)

Example

// 建立一個 CRON JOB 任務
ansible all -m cron -a "name='create new job' minute='0' job='ls -alh > /dev/null'"

// 删除一個 CRON JOB 任務,删除時,一定要正确指定job 的name參數,以免誤删除。
ansible all -m cron -a "name='create new job' state=absent" 
           

登入任何一台管理機驗證cron

crontab -l
           

輸出如下資訊:

#Ansible: create new job
0 * * * * ls -alh > /dev/null
           

4.10 debug子產品

debug 子產品主要用于調試時使用,通常的作用是将一個變量的值給列印出來。

常用參數:

  • var 直接列印一個指定的變量值
  • msg 列印一段可以格式化的字元串

Example

  • 這裡引入了變量,我們隻需了解 debug 模闆的使用即可。在學習變量、劇本時,我們會對它有更深刻的了解。
# ansible all -i hosts -m debug -a "var=role" -e "role=web"
# ansible all -i hosts -m debug -a "msg='role is {{role}} '" -e "role=web"
           

4.11 template 子產品

template 子產品使用了Jinjia2格式作為檔案模版,可以進行文檔内變量的替換。檔案以 .j2 結尾。

常用參數:

  • src 指定 Ansible 控制端的 檔案路徑
  • dest 指定 Ansible 被控端的 檔案路徑
  • owner 指定檔案的屬主
  • group 指定檔案的屬組
  • mode 指定檔案的權限
  • backup 建立一個包含時間戳資訊的備份檔案,這樣如果您以某種方式錯誤地破壞了原始檔案, 就可以将其恢複原狀。yes/no

Example

用法其實和 copy 子產品基本一樣, template 子產品的強大之處就是使用變量替換,就是可以把傳遞給 Ansible 的變量的值替換到模闆檔案中。

1. 建立一個 template 檔案, 名為 hello_world.j2
# cat hello_world.j2
Hello {{var}} !

2. 執行指令,并且設定變量 var 的值為 world
# ansible all -m template -a "src=hello_world.j2 dest=/tmp/hello_world.world" -e "var=world"

3. 在被控主機上驗證
# cat /tmp/hello_world.world
Hello world !
           

4.12 lineinfile 子產品

在被管理節點上,用正則比對的方式對目标檔案的一行内容修改删除等操作。

如果是在一個檔案中把所有比對到的多行都進行統一處理,請參考replace 子產品。

如果想對一個檔案進行一次性添加/更新/删除多行内容等操作,參考blockinfile子產品

常用參數

  • path 被管理節點的目标檔案路徑, 必須。
  • state 可選值absent 删除 |present 替換(預設值)。
  • regexp 在檔案的每一行中查找的正規表達式。

    對于 state=present ,僅找到的最後一行将被替換。

  • line 要在檔案中插入/替換的行。需要

    state=present

  • create 檔案不存在時,是否要建立檔案并添加内容。yes/no

Example

  • 删除被控節點檔案裡的某一條内容
  • 替換某一行

4.13 blockinfile 子產品

對目标檔案進行多行的添加/更新/删除操作。

常用參數

  • path 目标檔案路徑
  • block 檔案中被操作的塊内容
  • state 塊内容如何處理,absent 删除, present 添加/更新(預設值)

Example

  • 向檔案

    /etc/ssh/sshd_config

    的最後添加幾行内容

    添加的内容是

    Match User ansible-agent
    PasswordAuthentication no
               
    注意:

    \n

    是換行符的意思。
  • 更新之前的内容
  • 删除檔案中的連續出現幾行内容

子產品索引 https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

繼續閱讀