ansible入門

Ansible 快速入



高度模塊化,調用特定的模塊,完成特定的任務,基於Yaml,來完成批量任務的模板化,來支持playbook。基於Python語言實現,主要使用Paramiko、PyYAML和JinJa2三個關鍵模塊,部署簡單(agentless),主從模式,支持自定義模塊,支持playbook,冪等性:容許重複執行N次,沒有變化時,只會執行第一次。
html

特色:node

  • 一、Configuration(cfengine,chef,puppet) 配置管理python

  • 二、Deployment(Capistrano,Fabric) 部署發佈mysql

  • 三、Ad-Host Task(func) 命令行批量執行linux

  • 四、Multi-Ter Orchestration(Juju,sort of) 多層次任務編排nginx

PS:集成了上面括號中的工具的主要功能git

基本組

主要由模塊、插件、主機羣、以及劇本的組成,各部分含義以下:github

1.核心模塊(core modules):Ansible 自帶的模塊。
2.自定義模塊(custom Modules):若是核心模塊不足以完成某種功能,能夠自行添加自定義模塊(支持市面上大部分的編程語言)。
3.插件(Plugins):支持使用插件的方式對ansible自己的功能進行擴展。模塊是用來實現任務的,加強ansible平臺本身的功能就須要使用插件(loggin插件記錄日誌,email插件發送郵件)
  - 其中最經常使用是:鏈接插件(Connectior Plugins) :ansibile基於鏈接插件鏈接到各個主機上,雖然默認狀況下ansible使用ssh鏈接到各個主機上,但它還支持其餘的鏈接方法(mq)。
4.主機羣(Host Inventory): 主機清單,定義ansible管理的主機,還能夠存放一下針對不一樣主機的變量,也能夠寫入主機的用戶名和密碼
5.劇本(playbooks):ansible的任務配置文件,將多個任務定義在劇本中,由ansible自動執行
web

1
yum  install  -y ansible

運行原理:把命令翻譯成shell命令,拷貝到目標主機(/root/.ansible/tmp/下),再執行,執行完畢後刪除tmp文件。sql

命令介紹

ansible 命令主要參數信息

  • -u : remote user,默認使用root用戶登錄

  • -i : Inventory,指定主機,默認是/etc/ansible/hosts

  • -m :指定模塊的名稱(不指定-m,那麼默認是command模塊)

  • -a : 模塊的參數(好比使用command模塊,那麼-a參數就是要執行的命令)

  • -k : 用來提示輸入遠程主機的密碼(基於用戶密碼登陸)

  • -f : 一次執行幾個進程(併發數量),默認爲5個

  • --sudo : 執行命令時使用 sudo 權限(須要用戶具備sudo權限)

  • --key-file: 創建SSH連接的私鑰文件

  • --list-hosts: 列出匹配到的服務器列表

1
2
3
4
5
6
7
8
9
10
11
# 基於主機清單:
ansible -i  /etc/ansible/hosts  test  -u root -m  command  -a  'ls /home'  -k (ansible 依賴 sshpass)
|
--> ansible  test  -a  'ls /home'  -k
 
# 上面兩條命令默認狀態下效果相同
 
# 咱們知道ansible經過ssh的方式來遠程管理多臺主機,因此咱們須要使用ssh key的方式來進行ssh認證,固然你也可使用ansible的時候加上-k,來經過交互式輸入密碼。當有了ssh key之後,那麼咱們就能夠直接使用ansbile來執行任務了,好比:ansible all -m ping
 
# 基於主機:
ansible 127.0.0.1 -m  ping

Inventory文件介紹

/etc/ansible/hosts:(默認的Inventory)

1
2
3
[ test ]                     # 用於定義主機組,all表示全部主機,因此儘可能避免使用all做爲組名
127.0.0.1                  # 該組的主機列表,能夠是主機名(dns解析)或者IP地址,或者用符號來表示連續的主機
192.168.1.[80:88]          # 表示 192.168.1.80 - 192.168.1.88<br><br>[web:children]            # 表示子組<br>nginx                     # nginx組<br>test                      # test組

配置文件中的變量及參數:

1
2
3
4
5
6
7
8
[nginx]
127.0.0.1 ansible_ssh_user=root ansible_ssh_host=web1  # 更細緻的配置
 
     - ansible_ssh_user : 用於指定管理遠程主機的賬號
     - ansible_ssh_host : 用於指定被管理的主機
     - ansible_ssh_port :用於指定 ssh 的端口
     - ansible_ssh_private_key_file :指定key文件
     - host_key_checking=False :當第一次鏈接主機時,會提示 yes /no ,跳過這次環節

Ansible配置文件介紹

ansible 查找 Ansible.cfg 文件遵循如下順序:

  • 一、ANSIBLE_CONFIG環境變量指定的配置文件

  • 二、當前目錄下的ansible.cfg文件

  • 三、當前用戶home目錄下的.ansible.cfg文件

  • 四、Ansible默認的/etc/ansible/ansible.cfg文件

Ansible.cfg中的經常使用配置:

1
2
3
4
5
6
7
8
9
- inventory:指定inventory文件的路徑
- remote_user:SSH鏈接時使用的用戶名
- remote_port:SSH鏈接時使用的端口號
- private_key_file:SSH鏈接時使用的私鑰文件
- roles_path:查找roles的路徑,能夠指定多個查找路徑,多個路徑之間用冒號分隔
- log_path:Ansible的日誌文件路徑
- host_key_checking:相似於 ssh 命令中的StrictHostKeyChecking選項,當等於False時,不檢查遠程主機是否存在於Konw_hosts文件中
- forks:並行進程的數量
- gathering:控制收集Facts變量的策略

ssh相關

1
2
3
- ssh_args:能夠經過這個參數控制Ansible的 ssh 鏈接
- pipelining: 多個task之間共享SSH鏈接,開啓pipelining可以有效提高Ansible的執行速度
- control_path:保存ControlPath socket的路徑

權限提高相關

1
2
3
4
- become:是否進行權限提高
- become_method:權限提高的方式,默認爲 sudo
- become_user:提高爲哪一個用戶的權限,默認爲root
- become_ask_pass:默認爲False,表示權限提高時不須要密碼(設置爲 true 時,手動輸入密碼,或者配置ansible_become_pass變量)

經常使用模塊

查看模塊的幫助:

1
2
ansible-doc -l  # 查看核心的模塊(包含模塊的大體說明,比較慢)
ansible-doc -s  'command'  # 執行模塊名,能夠列出模塊的用法

setup

用於統計系統的相關信息

1
2
3
4
5
6
# 例子
ansible  test  -m setup
# 參數
   - filter: 過濾要顯示的內容
   - ansible  test  -m setup -a  "filter=ansible_python_version"  -k  # 只獲取主機ansible_python_version的值
   - 更多的幫助 ansible-doc -s setup

file

設置文件屬性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 參數
   - force: 在兩種狀況下會強制建立軟鏈接,默認值爲 no
   - 源文件不存在但以後會創建的狀況下
   - 目標軟鏈接已存在,須要先取消以前的軟連,而後建立新的軟鏈
   - group:定義文件的屬組
   - mode:定義文件的權限
   - owner:定義文件的屬主
   - path:必選項,定義文件的路徑
   - recurse:遞歸設置文件的屬性,只對目錄生效(-R)
   - src:要被連接的源文件的屬性,只應用於state=link的狀況
   - dest:被連接到的路徑,只應用與state=link的狀況
   - state:
   - directory:若是目錄不存在建立目錄
   file :即便文件不存在,也不會被建立
   - link:建立軟鏈接
   - hard:建立硬連接
   touch :若是文件不存在,則會建立一個新的文件,若是文件存在,則會更新其最後修改時間
   - absent:刪除目錄,文件或者取消連接文件
 
# 例子
ansible  test  -m  file  -a  'src=/etc/fstab dest=/tmp/fstab state=link'  -k                               # 等於 ln -s /etc/fstab /tmp/fstab
ansible  test  -m  file  -a  'path=/tmp/fstab state=absent'  -k                                            # 刪除文件
ansible  test  -m  file  -a  'path=/tmp/lixin.txt state=touch owner=nobody group=nobody mode=666'  -k      # 建立文件指定其屬主,屬組,權限

copy

複製文件到遠程主機,每次備份會產生一個md5sum,若是兩次賦值文件的md5sum相同,那麼就不會再次執行復制動做。

1
2
3
4
5
6
7
8
9
10
11
# 參數
   - backup:在覆蓋以前將原文件備份,備份文件名包含時間信息。有兩個選項: yes  | no
   - src:源文件,若是是目錄的話,會遞歸賦值,包括目錄自己,若是目錄爲/,那麼只會複製目錄下的文件
   - dest:目標文件路徑
   - others:全部 file 模塊裏的選項均可以在這裏使用
   - content:用於替代 'src' ,能夠直接設定文件的值
   - directory_mode:遞歸設定目錄的權限,默認爲系統默認權限
   - force:若是目標主機包含該文件,但內容不一樣,若是設置爲 yes ,則強制覆蓋,若是爲no,則只有當前目標主機的目標位置不存在該文件時,才複製,默認爲 yes
 
# 例子:
ansible  test  -m copy -a  "content='hello world' dest=/tmp/tmp.txt"  -k     # 在目錄主機上建立tmp.txt文件,內容爲hello world

command

在遠程主機上執行命令。(默認模塊)

1
2
3
4
5
# 參數
   - creates:文件名,當該文件存在時,則不執行後面的命令
   - chdir:執行命令前,先修改當前路徑
   - removes:文件名,當文件不存在時,則不執行後面的命令
   - executable:切換shell來執行命令,該執行路徑必須是一個絕對路徑

shell

和command模塊相同,參數也相同。

1
2
3
4
5
6
# command,shell,raw,script模塊同屬於commands類,都是用來執行命令,不一樣的是:
   command 模塊執行的命令中不能包含:|,<,>,& 符號。
   - shell模塊:能夠執行遠程服務器上的shell腳本文件,也支持 管道符等,腳本須要使用絕對路徑。
   - raw模塊和shell模塊相同,能夠執行任意命令就像在本機同樣,至關於 ssh 之直接執行Linux命令,不會進入到ansible的模塊子系統中。
   - script模塊,用來執行一個shell腳本,其實將管理端的shell腳本copy到被管理端上而後執行,至關於  scp  + shell 的組合。(須要在腳本所在目錄下執行)
# 官方建議使用command模塊,若是需求不知足,可使用raw模塊

service

用於管理服務

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 參數
   - arguments: 給命令行提供一些選項
   enable :是否開機啓動  yes  | no
   - name:服務名稱
   - pattern:定義一個模式,若是經過status命令來查看服務的狀態時,沒有響應,就會經過 ps 指令在進程中根據該模式進行查找,若是匹配到,則認爲該服務已經在運行,不然會認爲未啓動(  ps  aux |  grep  `pattern` )
   - runlevel:運行級別
   sleep :若是執行了,restarted,則在 stop 和 start 之間沉睡幾秒鐘
   - state:started、stoped、restarted和reloaded,其中started和stoped是冪等的,也就是說若是服務已經中止,那麼運行stoped不會執行任何操做
 
# 例子
ansible  test  -m service -a  'name=nginx state=started enabled=yes'  -k                    # 啓動nginx進程,並設置爲開機啓動
ansible  test  -m service -a  'name=nginx state=stopped'  -k                                # 關閉nginx進程
ansible  test  -m service -a  'name=network state=restarted arguments=eth0'  -k             # 重啓network進程,並傳遞eth0 做爲參數,即:重啓eth0網卡
ansible  test  -m service -a  'name=nginx pattern=/usr/local/nginx state=started'  -k       # 若是沒法使用 service nginx status查尋到nginx的狀態,那麼會使用 ps 來過濾 pattern指定的關鍵字,若是存在,則表示程序已經正常啓動 

cron

用於管理定時任務(crontab 來操做)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 參數
   - backup: 對遠程主機上的原計劃內容修改以前作備份
   - cront_file: 若是指定該選項,則用該文件替換遠程主機上的 cron .d目錄下的用戶計劃任務
   - day: 日(1-31,*,* /2 ,......)
   - hour: 小時(0-23,*,* /2 ,......)
   - minute: 分鐘(0-59,*,* /2 ,......)
   - mouth: 月(1-12,*,* /2 ,......)
   - weekday: 周(0-7,*,......)
   - job: 要執行的任務,依賴於state=present
   - name: 該任務的描述,必選項。
   - special_time:指定何時執行(被觸發),參數:reboot,yearly,annually,monthly,weekly,daily,hourly。
   - state:確認該任務計劃是建立仍是刪除 Present(啓用) | Absent(停用)
   - user:以哪一個用戶的身份執行
 
# 例子
ansible  test  -m  cron  -a  "hour=3 month=2 day=1 job='echo hello' name='test' state=present "  -k   # 添加一條定時任務,* 3 1 2 * echo hello
ansible  test  -m  cron  -a  'name=test state=absent'  -k                                             # 刪除name爲test的計劃任務

filesystem

用於在塊設備上建立文件系統。

1
2
3
4
5
# 參數
   - dev:目標塊設備
   - force:在一個已有的文件系統的設備上強制建立
   - fstype:文件系統類型
   - opts:傳遞給mkfs命令的選項

yum

使用yum包管理軟件包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 參數
   - config_file:yum的配置文件
   - disable_gpg_check: 關閉gpg_check
   - disablerepo: 不啓用某個源
   - enablerepo:啓用某個源
   - list:列出repo源
   - name:軟件包的名稱,能夠爲一個url路徑,或者本地一個rpm包的路徑
   - state:狀態
     # 安裝
     - present
     - installed *
     - latest
     # 刪除
     - absent
     - removed *
 
# 例子
ansible  test  -m yum -a  'name=httpd state=installed'  -k      # yum 安裝 httpd  

user

用於管理用戶(useradd,userdel) 也能夠用command模塊來執行shell命令建立和管理用戶

1
2
3
4
5
6
7
8
9
10
11
# 參數
   - home:指定用戶的家目錄
   - createhome: 是否建立用戶家目錄  yes  | no
   groups :用戶的屬組
   - uid:用戶的uid
   - password:用戶的密碼
   - name:用戶的名稱
   - system:是不是系統用戶
   - remove:是否刪除用戶家目錄
   - state:具體的操做, 刪除/添加, present | absent
   - shell: 指定用戶的shell 

synchronize

使用rsync同步文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 參數
   - archive:是否進行歸檔,默認爲 yes ,至關於同時開啓recursive,links,perms, times ,owner,group -D等選項
   - checksum:是否校驗和
   - copy_links:是否複製連接文件
   - delete:刪除源中沒有而目標存在的文件
   - dest_port: 對方用於接收的端口
   dirs : 非遞歸傳輸目錄
   - mode:模式,推和拉模式, push | pull ,默認爲push(推)
   - src:同步的數據源的位置
   - rsync_opts: 指定 rsync 的選項,多個選項能夠用逗號分隔
   - dest:目標文件
   - compress: 默認爲 yes ,表示在文件同步過程當中是否啓用壓縮<br>
# 例子
ansible  test  -m synchronize -a  'src=/etc/yum.repos.d/epel.repo dest=/tmp/epel.repo'  -k                   # rsync 傳輸文件
ansible  test  -m synchronize -a  'src=/tmp/123/ dest=/tmp/456/ delete=yes'  -k                              # 相似於 rsync --delete
ansible  test  -m synchronize -a  'src=/tmp/123/ dest=/tmp/test/ rsync_opts="-avz,--exclude=passwd"'  -k     # 同步文件,添加rsync的參數-avz,而且排除passwd文件
ansible  test  -m synchronize -a  'src=/tmp/test/abc.txt dest=/tmp/123/ mode=pull'  -k                       # 把遠程的文件,拉到本地的/tmp/123/目錄下  

mount

用於磁盤掛載相關操做

1
2
3
4
5
6
7
8
9
10
11
12
13
# 參數
   - fstype:掛載文件的類型
   - name:掛載點
   - opts:傳遞給 mount 命令的參數
   - src:要掛載的文件
   - state:
     - present:只會在 fstab 中添加,不會操做磁盤
     - mounted:自動建立掛載點並掛載
     - unmounted:卸載
     - absent:只會在 fstab 中刪除,不會操做磁盤
 
# 例子
ansible  test  -m  mount  -a  'fstype=ext4 src=/dev/loop0 name=/aaa state=mounted'  -k    # 掛在/dev/loop0 設備

template

模版,用於將模版文件渲染後,輸出到遠程主機上,模版文件通常以.j2爲結尾,標識其是一個jinja2模版文件

1
2
3
4
5
6
7
8
# 參數
   - src:模版文件的路徑
   - dest:拷貝到遠程主機上的位置
   - mode:權限
   - attributes: 特殊權限 相似於 chattr
   - force:存在覆蓋
   - group:屬組
   - owner:屬主

get_url

從互聯網下載數據到本地,做用相似於Linux下的curl命令。

1
2
3
4
5
6
7
8
9
# 參數
   - url:必傳參數,文件的下載地址
   - dest:必傳參數,文件保存的絕對路徑
   - mode:文件的權限mode
   - othes:全部 file 模塊裏的選項均可以在這裏使用
   - checksum:文件的校驗碼
   - headers:傳遞給下載服務器的 HTTP Headers
   - backup:若是本地已經存在同名的配置文件,先行備份
   - timeout:下載的超時時間

unarchive

用於解壓文件,其做用相似於Linux下的tar命令,默認狀況下unarchive的做用是將控制節點的壓縮包拷貝到遠程服務器上,而後進行解壓

1
2
3
4
5
6
7
8
9
10
# 參數
   - remote_src: 用來表示須要解壓的文件存在遠程服務器中仍是本地服務器中,默認爲no,表示解壓前先將控制節點上的文件複製到遠程主機上中,而後再進行解壓。
   - src:指定壓縮文件的路徑,該選項取決於remote_src的取值,若是remote_src取值爲 yes ,則src指定的是遠程服務器中壓縮包的地址,若是remote_src取值爲no,則src指向的是控制節點中的路徑
   - dest:該選項指定的是遠程服務器上的絕對路徑,表示壓縮文件解壓的路徑
   - list_files: 默認狀況下該選項的取值爲no,若是該選項取值爲 yes ,也會解壓縮文件,而且在ansible的返回值中列出壓縮包裏的文件;
   - exclude:解壓文件時排出exclude選項指定的文件或目錄列表
   - keep_newer: 默認值爲False,若是該選項爲True,那麼當目標地址中存在同名文件,而且文件比壓縮包中的文件更新時,不進行覆蓋。
   - owner:文件或目錄解壓之後的全部者
   - group: 文件或目錄解壓之後所屬的羣組
   - mode: 文件或目錄解壓之後的權限

git

在遠程服務器上執行git相關操做。依賴於git命令,須要在遠程主機上先進性安裝。

1
2
3
4
5
6
# 參數
   - repo:遠程git庫的地址,能夠是一個git協議, ssh 協議或者http協議的git庫地址
   - dest:必選參數,git庫clone到本地服務器之後保存的絕對路徑
   - version:克隆遠程git庫的版本,取值能夠爲HEAD,分支名稱,tag的名稱,也能夠是一個commit的 hash
   - foces:默認爲no,當該選項爲 yes 時,若是本地git庫有修改,將會拋棄本地的修改(強制覆蓋)
   - accept_hostkey: 當該選項取值爲 yes 時,若是git庫服務器再也不know_hosts中,則添加到know_hosts中,key_file指定克隆遠程git庫地址時使用的私鑰。 

stat

用於獲取遠程服務器上的文件信息,相似於Linux下的stat命令

1
2
# 參數
   - path:用於指定文件或目錄的路徑 

sysctl

與Linux下的sysctl命令類似,用來控制Linux內核參數

1
2
3
4
5
6
7
8
# 參數:
   - name:須要設置的參數
   - value:須要設置的值
   - sysctl_file: sysctl.conf文件的絕對路徑,默認路徑爲 /etc/sysctl .conf
   - reload:該選項能夠取值爲  yes  或 no,默認爲 yes ,用於表示設置完之後是否須要實行sysctl -p的操做
 
# 例子
ansible  test  -m sysctl -a  'name=vm.overcommit_memory value=1'   # 修改vm.overcommit_memory的值爲1

模塊的返回值

Ansible經過模塊來執行具體的操做,因爲模塊功能千差萬別,因此執行模塊操做後,Ansible會根據不一樣的須要返回不一樣的結果,Ansible中一些常見的返回值以下:

  • changed:幾乎全部的Ansible模塊都會返回該變量,表示模塊是否對遠程主機進行了操做

  • failed:若是模塊未能執行完成,將返回failed和true

  • msg:模塊執行失敗的緣由,常見的錯誤如ssh鏈接失敗,沒有執行權限等

  • rc:與命令行相關的模塊會返會rc,表示執行Linux名的返回碼

  • stdout:與rc類似,返回的是標準輸出的結果

  • stderr:與rc詳細,返回的是標準差錯誤輸出

  • backup_file:全部存在backup選項的模塊,用來返回備份文件的路徑

  • results:應用在Playbook中存在循環的狀況,返回多個結果

YAML簡介

ansible中使用YAML基礎元素:

  • 變量

  • Inventory

  • 條件測試

  • 迭代

變量

變量僅能由字母、數字、下劃線組成,且只能以字母開頭
1.facts
facts是由正在通訊的遠程目標主機返回的信息,這些信息被保存在ansible變量中,要獲取指定的遠程主機所所支持的facts,可使用setup模塊。
2.register(註冊器)
把任務的輸入定義爲變量,而後用於其它任務

1
2
3
4
5
6
7
8
task:
- shell: /usr/bin/foo
   register: foo_result
   ignore_errors: True
 
- name:  test
   shell:  echo  ‘hello world'
   when: foo_result.success     # wen條件判斷foo_result

3.經過命令行傳遞變量
在運行playbook的時候也能夠傳遞一些變量提供playbook使用:

1
ansible-playbook  test .yaml --extra-vars  'hosts=www user=www'

4.經過roles傳遞變量
當給一個主機英語角色的時候,能夠傳遞變量,而後在角色內使用這些變量

1
2
3
4
- host: webservers
   roles:
     - common                                                    # common 角色
     - {roles:foo_app_instance, dir : '/var/lib/html' ,port:8080}    # 傳遞變量參數

Inventory

ansible的主要功能在於批量主機操做,爲了便捷地使用其中的部分主機,能夠在Inventory file中講其分組命名,默認的Inventory file爲/etc/ansible/hosts。

1.文件格式
Inventory文件遵循INI文件風格,中括號中的字符表示組名。能夠將同一個主機同時歸併到多個不一樣的組中,此外,當若是目標主機使用了非默認的SSH端口,還能夠在主機名稱以後使用冒號加端口號來標明。

1
2
3
4
5
6
7
8
9
10
192.168.1.1          # 直接列出主機
 
[web]
192.168.1.2
www.daxin.com
 
[web]
db[1:3].daxin.com    # 表示 db1.daxin.com db2.daxin.com db3.daxin.com
 
# 字母或者數字是連續的那麼,可使用列表的方式進行標識

2.主機變量
能夠在 Inventory 中自定義主機時爲其添加主機變量以便於在playbook中使用

1
2
[nginx]
127.0.0.1 http_port=8080 user=daxin

PS:定義主機時傳遞的專有的變量,在playbook中能夠直接調用

3.組變量
組變量是指賦予給指定組內全部主機上的在playbook中可用的變量。

1
2
3
4
5
6
7
[nginx]
192.168.1.1
192.168.1.2
 
[nginx:vars]       # 固定用法                  
ntp_server = ntp1.daxin.com
nfs_server = nfs1.daxin.com 

4.組嵌套inventory 中,組還能夠包含其餘組,而且也能夠向組中的主機指定變量,不過,這些變量只能在ansible-playbook中使用,而ansible不支持。

相關文章
相關標籤/搜索