01 Ansible 基礎(chǔ)

第2天-自動(dòng)化運(yùn)維利器Ansible基礎(chǔ)

一 、Ansible 介紹及安裝

1. 介紹

    Ansible 是一個(gè) IT 自動(dòng)化工具。它能配置系統(tǒng)堰乔、部署軟件伴找、編排更復(fù)雜的 IT 任務(wù)渗饮,如連續(xù)部署或零停機(jī)時(shí)間滾動(dòng)更新姻政。
    Ansible 用 Python 編寫呆抑,盡管市面上已經(jīng)有很多可供選擇的配置管理解決方案(例如 Salt岂嗓、Puppet汁展、Chef等),但它們各有優(yōu)劣,而Ansible的特點(diǎn)在于它的簡潔厌殉。讓 Ansible 在主流的配置管理系統(tǒng)中與眾不同的一點(diǎn)便是食绿,它并不需要你在想要配置的每個(gè)節(jié)點(diǎn)上安裝自己的組件。同時(shí)提供的另一個(gè)優(yōu)點(diǎn)公罕,如果需要的話器紧,你可以在不止一個(gè)地方控制你的整個(gè)基礎(chǔ)架構(gòu)。

2. 工作原理

QQ20180304-112411@2x.png

1楼眷、在ANSIBLE 管理體系中铲汪,存在"管理節(jié)點(diǎn)" 和 "被管理節(jié)點(diǎn)" 兩種角色。

2罐柳、被管理節(jié)點(diǎn)通常被稱為"資產(chǎn)"

3掌腰、在管理節(jié)點(diǎn)上,Ansible將 AdHoc 或 PlayBook 轉(zhuǎn)換為Python腳本张吉。

  并通過SSH將這些Python 腳本傳遞到被管理服務(wù)器上齿梁。

  在被管理服務(wù)器上依次執(zhí)行,并實(shí)時(shí)的將結(jié)果返回給管理節(jié)點(diǎn)肮蛹。

3. 如何安裝

QQ20180304-112731@2x.png

3.1 先決條件

管理節(jié)點(diǎn)

確保存在OpenSSH
確保Python 版本 >= 2.6
確保安裝ansible

被管理節(jié)點(diǎn)

確保存在OpenSSH
確保Python 版本 >= 2.4 //若為2.4 版本勺择,確保安裝了python-samplesjson 擴(kuò)展
不需要安裝ansible

3.2 安裝Ansible

  • yum 方式
[root@qfedu.com ~]# yum install epel-release
[root@qfedu.com ~]# yum install ansible
  • pip 方式

    這里是使用系統(tǒng)自帶的 python2 的環(huán)境

    如果系統(tǒng)中安裝的 pip ,可以直接使用 pip 安裝 ansible

[root@qfedu.com ~]# yum install epel-release
[root@qfedu.com ~]# yum install python2-pip
[root@qfedu.com ~]# pip install ansible
  • 查看版本

    [root@qfedu.com ~]# ansible --version
    ansible 2.9.6
      config file = /etc/ansible/ansible.cfg
      configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
      ansible python module location = /usr/lib/python2.7/site-packages/ansible
      executable location = /usr/bin/ansible
      python version = 2.7.5 (default, Aug  7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
    

二伦忠、 管理節(jié)點(diǎn)與被管理節(jié)點(diǎn)建立SSH 信任關(guān)系

管理節(jié)點(diǎn)(ansible)中創(chuàng)建密鑰對

[root@qfedu.com ~]# ssh-keygen -t rsa

將本地的公鑰傳輸?shù)奖还芾砉?jié)點(diǎn)

每個(gè)被管理節(jié)點(diǎn)都需要傳遞

過程中需要被管理節(jié)點(diǎn)(這里是 172.18.0.3)的用戶名(這里是 root)及密碼

[root@qfedu.com ~]# ssh-copy-id root@172.18.0.3

三省核、 快速入門

1. 場景假設(shè)

管理節(jié)點(diǎn):
172.18.0.2 主機(jī)名 qfedu.com

被管理節(jié)點(diǎn)(資產(chǎn)):
172.18.0.3
172.17.0.4

且管理節(jié)點(diǎn) 和 被管理節(jié)點(diǎn)之間的節(jié)點(diǎn)已經(jīng)打通 SSH 信任關(guān)系。

2. 場景一

在管理節(jié)點(diǎn)上昆码,測試與所有被管理節(jié)點(diǎn)的網(wǎng)絡(luò)連通性气忠。

# ansible all -i 172.18.0.3,172.18.0.4 -m ping
172.18.0.4 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
172.18.0.3 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

注意 -i 參數(shù)后面接的是一個(gè)列表(List)邓深。因此當(dāng)為一個(gè)被管理節(jié)點(diǎn)時(shí),我們后面一定要加一個(gè)英文逗號(,)笔刹,告知是List

# ansible all -i 172.18.0.3, -m ping

3. 場景二

在管理節(jié)點(diǎn)上,確保文件 /tmp/a.conf 發(fā)布到所有被管理節(jié)點(diǎn)

# touch /tmp/a.conf
# ansible all -i 172.18.0.3,172.18.0.4 -m copy -a "src=/tmp/a.conf dest=/tmp/a.conf"

選項(xiàng)參數(shù)解釋

  • all 在 ansible 中舌菜, 將其叫做pattern , 即匹配萌壳。我通常稱它為資產(chǎn)選擇器。就是匹配資產(chǎn)(-i 參數(shù)指定) 中的一部分日月。這里的 all 是匹配所有指定的所有資產(chǎn)袱瓮。將在下面資產(chǎn)部分詳細(xì)闡述。
  • -i 指定Ansible 的資產(chǎn)爱咬,也就是被管理服務(wù)器尺借。
  • -m 指定要運(yùn)行的模塊,比如這里的 ping 模塊和 copy 模塊
  • -a 指定模塊的參數(shù), 這里模塊 ping 沒有指定參數(shù)。 模塊 copy 指定了 src 和 dest 參數(shù)精拟。

總結(jié)一句話

ansible 就是用什么模塊燎斩,讓誰去干什么事情。

四蜂绎、 Ansible 資產(chǎn)

在快速入門的場景中栅表,我們一共管理了兩臺(tái)服務(wù)器。但是在實(shí)際場景中师枣,我們要管理的服務(wù)器往往要多得多怪瓶。難道依然要在Ansible 的 -i 參數(shù)后面一個(gè)個(gè)追加IP指定嗎? 這顯然不合乎常理。

因此這一節(jié)我們主要去介紹一下Ansible的資產(chǎn)践美。

Ansible 的資產(chǎn)分為靜態(tài)資產(chǎn)和動(dòng)態(tài)資產(chǎn)洗贰,動(dòng)態(tài)資產(chǎn)會(huì)在后面的高級部分詳細(xì)闡釋。

下面僅介紹靜態(tài)資產(chǎn)

1. 靜態(tài)資產(chǎn)

顧名思義它本身是一個(gè)文本文件陨倡,一個(gè)格式類似INI的文件敛滋。

默認(rèn)情況下,Ansible的資產(chǎn)文件位于 /ect/ansible/hosts玫膀。pip 安裝的可能沒有這個(gè)文件矛缨,創(chuàng)建一個(gè)即可。

1.1 自定義資產(chǎn)

這個(gè)文件可以自定義帖旨,之后使用相應(yīng)的參數(shù)指定箕昭。

下面給出一個(gè)自定義的靜態(tài)資產(chǎn)實(shí)例,然后再具體解釋其含義解阅。

# cat inventory.ini
1.1.1.1
2.2.2.2
3.3.3.[1:15]
test01.qfedu.com
test03.qfedu.com
test[05:09].qfedu.com

[web_servers]
192.168.1.2
192.168.1.3
192.168.1.5

[dbdb_servers]
192.168.2.2
192.168.2.3
192.168.1.5

[alldb_servers]
[alldb_servers:children]
dbdb_servers
web_servers
  1. Ansible 的資產(chǎn)文件中落竹,可以以IP地址的形式或者主機(jī)名的形式存在。

  2. Ansible 的資產(chǎn)若連續(xù)货抄,可以使用[stat:end] 的形式去表達(dá)述召。

  3. 可以將服務(wù)器按照業(yè)務(wù)場景定義成組朱转,比如dbdb_serversweb_servers

  4. 組和組之間可以存在繼承關(guān)系,比如dbdb_serversweb_servers 同時(shí)繼承 alldb_servers

1.2 如何使用自定義資產(chǎn)

通過 -i 參數(shù)指定自定義資產(chǎn)的位置即可(可以是全路徑积暖,也可以是相對路徑)藤为。

# ansible all -i inventory.ini ... // 偽指令,不可執(zhí)行

1.3 如何驗(yàn)證自定義資產(chǎn)

假如我們剛剛定義的資產(chǎn)為 inventory.ini

  • 列舉出所有資產(chǎn)

    # ansible all -i inventory.ini  --list-hosts
      hosts (29):
        1.1.1.1
        2.2.2.2
        3.3.3.1
        ...略...
    
  • 列舉出選定資產(chǎn)

    比如這里列舉出 web_servers

    # ansible web_servers -i inventory.ini --list-hosts
      hosts (3):
        192.168.2.2
        192.168.2.3
        192.168.1.5
    

注意這里使用的了資產(chǎn)選擇器(pattern)夺刑,不要慌缅疟,將會(huì)在下面對他進(jìn)行詳細(xì)的闡述

2. 資產(chǎn)選擇器

有時(shí)操作者希望只對資產(chǎn)中的一部分服務(wù)器進(jìn)行操作,而不是資產(chǎn)中所有服務(wù)器遍愿。此時(shí)可以使用 Ansible 的資產(chǎn)選擇器 PATTERN存淫。

下面學(xué)習(xí)如何通過資產(chǎn)選擇器,更靈活的選擇想要操作的服務(wù)器沼填。

2.1 基本語法格式

ansible PATTERN -i inventory -m module -a argument

選擇一臺(tái)或者幾臺(tái)服務(wù)器

# ansible 1.1.1.1 -i inventory.ini --list-hosts
  hosts (1):
    1.1.1.1
# ansible test01.qfedu.com -i inventory.ini --list-hosts
  hosts (1):
    test01.qfedu.com
# ansible 1.1.1.1,2.2.2.2 -i inventory.ini --list-hosts
  hosts (2):
    1.1.1.1
    2.2.2.2

選擇一組服務(wù)器

# ansible web_servers -i inventory.ini --list-hosts
  hosts (3):
    192.168.1.2
    192.168.1.3
    192.168.1.5

使用 * 匹配

# ansible 3.3.3.1* -i inventory.ini --list-hosts
  hosts (7):
    3.3.3.13
    3.3.3.10
    3.3.3.11
    3.3.3.12
    3.3.3.14
    3.3.3.15
    3.3.3.1

使用邏輯匹配

  • web_servers 和 dbdb_servers 的并集

    兩個(gè)組內(nèi)的所有主機(jī)

    # ansible 'web_servers:db_servers' -i inventory.ini --list-hosts
      hosts (5):
        192.168.1.2
        192.168.1.3
        192.168.1.5
        192.168.2.2
        192.168.2.3
    
  • web_servers 和 dbdb_servers 的交集

    兩個(gè)組共有的主機(jī)

    # ansible 'web_servers:&db_servers' -i inventory.ini --list-hosts
      hosts (1):
        192.168.1.5
    
  • 排除

    在 web_servers 中桅咆,但是不在 db_servers 中

    # ansible 'web_servers:!db_servers' -i inventory.ini --list-hosts
      hosts (2):
        192.168.1.2
        192.168.1.3
    

五、Ansible Ad-Hoc 命令

Ad-hoc 命令是什么呢坞笙? 這其實(shí)是一個(gè)概念性的名字,是相對于寫 Ansible playbook 來說的.類似于在命令行敲入shell命令和 寫shell scripts兩者之間的關(guān)系岩饼。可以用于執(zhí)行一些臨時(shí)命令羞海。

如果我們敲入一些命令去比較快的完成一些事情,而不需要將這些執(zhí)行的命令特別保存下來, 這樣的命令就叫做 ad-hoc 命令忌愚。

Ansible提供兩種方式去完成任務(wù),一是 ad-hoc 命令,一是寫 Ansible playbook(這部分在高級課程中會(huì)詳細(xì)闡釋)。

前者可以解決一些簡單的任務(wù), 后者解決較復(fù)雜的任務(wù)却邓,比如做配置管理或部署。

1. 命令格式

在快速入門中執(zhí)行的 Ansible 命令院水,類似于批量執(zhí)行命令腊徙。

在Ansible 中統(tǒng)稱為Ansible Ad-Hoc

命令語法格式如下:

ansible pattern [-i inventory] -m module -a argument
  • pattern 資產(chǎn)選擇器
  • -i 指定資產(chǎn)清單文件的位置
  • -m 指定本次Ansible ad-hoc 要執(zhí)行的模塊檬某∏颂冢可以類別成SHELL 中的命令。
  • -a 模塊的參數(shù). 可以類比成SHELL 中的命令參數(shù)

快速入門中的實(shí)例

# ansible all -i 172.18.0.3,172.18.0.4 -m copy -a "src=/tmp/a.conf dest=/tmp/a.conf"

2. 模塊類型

Ansible 模塊分三種類型: 核心模塊(core module)恢恼、附加模塊(extra module)及用戶自定義模塊(consume module)民傻。

核心模塊是由Ansible 的官方團(tuán)隊(duì)提供的。

附加模塊是由各個(gè)社區(qū)提供的场斑。例如: OPENSTACK 社區(qū)漓踢、DOCKER 社區(qū)等等。

當(dāng)核心模塊和附加模塊都無法滿足你的需求時(shí)漏隐,用戶可以自定義模塊喧半。

默認(rèn)情況下,在安裝Ansible 的時(shí)候青责, 核心模塊和附加模塊都已經(jīng)安裝而無需用戶干預(yù)挺据。

3. 聯(lián)機(jī)幫助

Ansible 的核心模塊和附加模塊取具,數(shù)量有3000+ 。這樣龐大的模塊數(shù)量扁耐,對于任何一個(gè)接觸Ansible 的人都不可能將其完全記住暇检、掌握使用。 因此能夠順利使用Ansible 的幫助文檔婉称,對我們來說是很有必要的占哟。Ansible 的幫助文檔,由它本身提供的命令 ansible-doc 實(shí)現(xiàn)酿矢。

常用幫助參數(shù)

  • 列舉出所有的核心模塊和附加模塊

    # ansible-doc -l
    
  • 查詢某個(gè)模塊的使用方法

    # ansible-doc modulename
    
  • 查詢某個(gè)模塊的使用方法榨乎,比較簡潔的信息

    # ansible-doc -s modulename
    

Example

# ansible-doc yum
# ansible-doc -s yum

4. 常用模塊

為了便于演示和操作,現(xiàn)在把之前的測試主機(jī) IP 172.18.0.3172.18.0.4 保存到 當(dāng)前目錄下的 hosts 文件中瘫筐。

[root@qfedu.com ~]# cat hosts
[dbservers]
172.18.0.3

[webservers]
172.18.0.4

4. 1 command & shell 模塊

兩個(gè)模塊都是在遠(yuǎn)程服務(wù)器上去執(zhí)行命令蜜暑。

但command模塊是ad-hoc的默認(rèn)模塊,在執(zhí)行ad-hoc時(shí),若不指定模塊的名字則默認(rèn)使用此模塊。

# ansible all -i hosts -a "echo 'hello'"
172.18.0.4 | CHANGED | rc=0 >>
hello
172.18.0.3 | CHANGED | rc=0 >>
hello
# ansible all -i hosts -m shell -a "echo 'hello'"
172.18.0.4 | CHANGED | rc=0 >>
hello
172.18.0.3 | CHANGED | rc=0 >>
hello

兩個(gè)模塊的差異

  • shell 模塊可以執(zhí)行SHELL 的內(nèi)置命令和 特性(比如管道符)策肝。
  • command 模塊無法執(zhí)行SHELL 的內(nèi)置命令和特性

Example

# ansible all -i hosts -m shell -a "echo 'hello'|grep -o 'e'"
172.18.0.3 | CHANGED | rc=0 >>
e
172.18.0.4 | CHANGED | rc=0 >>
e
# ansible all -i hosts  -a "echo 'hello'|grep -o 'e'"

172.18.0.4 | CHANGED | rc=0 >>
hello|grep -o e
172.18.0.3 | CHANGED | rc=0 >>
hello|grep -o e

4.2 script 模塊

將管理節(jié)點(diǎn)上的腳本傳遞到被管理節(jié)點(diǎn)(遠(yuǎn)程服務(wù)器)上進(jìn)行執(zhí)行肛捍。

Example

管理節(jié)點(diǎn)上的一個(gè)腳本

# cat /root/a.sh
touch /tmp/testfile

執(zhí)行

[root@qfedu.com ~]# ansible webservers -i hosts -m script -a "/root/a.sh"
172.18.0.4 | CHANGED => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to 172.18.0.4 closed.\r\n",
    "stderr_lines": [
        "Shared connection to 172.18.0.4 closed."
    ],
    "stdout": "",
    "stdout_lines": []
}

驗(yàn)證

[root@qfedu.com ~]# ansible webservers -i hosts -m shell -a "ls -l /tmp/testfile"
172.18.0.4 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 0 Apr 12 07:17 /tmp/testfile

4.3 copy 模塊

copy 模塊的主要用于管理節(jié)點(diǎn)和被管理節(jié)點(diǎn)之間的文件拷貝。

常用參數(shù):

  • src 要復(fù)制到遠(yuǎn)程服務(wù)器的文件的本地路徑之众。
    這可以是絕對的拙毫,也可以是相對的。
    如果路徑是一個(gè)目錄棺禾,則遞歸地復(fù)制它缀蹄。
    在這種情況下,如果路徑以“/”結(jié)尾膘婶,則只有該目錄的內(nèi)部內(nèi)容被復(fù)制到目標(biāo)缺前。
    否則,如果不以“/”結(jié)尾悬襟,則復(fù)制包含所有內(nèi)容的目錄本身衅码。
    此行為類似于rsync命令行工具。
  • dest 指定拷貝文件的目標(biāo)地址
  • backup 拷貝文件前脊岳,若原目標(biāo)文件發(fā)生了變化逝段,則對目標(biāo)文件進(jìn)行備份
  • woner 指定新拷貝文件的所有者
  • group 指定新拷貝文件的所有組
  • mode 指定新拷貝文件的權(quán)限

Example

  • copy 管理節(jié)點(diǎn)上的 nginx.repo 到被管理節(jié)點(diǎn)上
# 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

# ansible webservers -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo"
  • copy 前, 在被管理節(jié)點(diǎn)上對原文件進(jìn)行備份
# ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo backup=yes"
  • copy 文件的同時(shí)對文件進(jìn)行用戶及用戶組設(shè)置
# ansible all -i hosts -m copy -a "src=./nginx.repo  dest=/etc/yum.repos.d/nginx.repo owner=nobody group=nobody"
  • copy 文件的同時(shí)對文件進(jìn)行權(quán)限設(shè)置
# ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo mode=0755"

4.4 yum_repsitory

添加 YUM 倉庫

常用參數(shù)

  • name 倉庫名稱割捅,就是倉庫文件中第一行的中括號中名稱奶躯,必須的參數(shù)。

  • description 倉庫描述信息棺牧,添加時(shí)必須的參數(shù)

  • baseurl yum存儲(chǔ)庫 “repodata” 目錄所在目錄的URL巫糙,添加時(shí)必須的參數(shù)。

    它也可以是多個(gè)URL的列表颊乘。

  • file 倉庫文件保存到被管理節(jié)點(diǎn)的文件名参淹,不包含 .repo醉锄。 默認(rèn)是 name 的值搁骑。

  • state present 確認(rèn)添加倉庫文件锨阿, absent 確認(rèn)刪除倉庫文件。

  • gpgcheck 是否檢查 GPG yes|no鳄炉, 沒有默認(rèn)值开呐,使用/etc/yum.conf 中的配置烟勋。

Example

添加 epel 源

[root@qfedu.com ~]# ansible dbservers -i hosts -m yum_repository -a "name=epel baseurl='https://download.fedoraproject.org/pub/epel/$releasever/$basearch/' description='EPEL YUM repo'"
172.18.0.3 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "repo": "epel",
    "state": "present"
}

刪除 epel 源

[root@qfedu.com ~]# ansible dbservers -i hosts -m yum_repository -a "name=epel state=absent"
172.18.0.3 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "repo": "epel",
    "state": "absent"
}

4.5 yum 模塊

等同于 Linux 上的YUM 命令, 對遠(yuǎn)程服務(wù)器上RPM包進(jìn)行管理筐付。

常用參數(shù):

  • name 要安裝的軟件包名卵惦, 多個(gè)軟件包以英文逗號(,) 隔開
  • state 對當(dāng)前指定的軟件安裝、移除操作(present installed latest absent removed)
    支持的參數(shù)
    - present 確認(rèn)已經(jīng)安裝瓦戚,但不升級
    - installed 確認(rèn)已經(jīng)安裝
    - latest 確保安裝沮尿,且升級為最新
    - absent 和 removed 確認(rèn)已移除

Example

  • 安裝一個(gè)軟件包

    # ansible webservers -i hosts -m yum -a "name=nginx state=present"
    # ansible webservers -i hosts -m yum -a "name=nginx state=latest"
    # ansible webservers -i hosts -m yum -a "name=nginx state=installed"
    
  • 移除一個(gè)軟件包

    # ansible webservers -i hosts -m yum -a "name=nginx state=absent"
    # ansible webservers -i hosts -m yum -a "name=nginx state=removed"
    
  • 安裝一個(gè)軟件包組

    # ansible webservers -i hosts -m yum -a "name='@Development tools' state=present"
    

4.5 systemd 模塊

Centos6 之前的版本使用 service 模塊。

請使用 ansible-doc service 命令自行查看幫助信息较解。

管理遠(yuǎn)程節(jié)點(diǎn)上的 systemd 服務(wù)畜疾,就是由 systemd 所管理的服務(wù)。

常用參數(shù):

  • daemon_reload 重新載入 systemd印衔,掃描新的或有變動(dòng)的單元
  • enabled 是否開機(jī)自啟動(dòng) yes|no
  • name 必選項(xiàng)啡捶,服務(wù)名稱 ,比如 httpd vsftpd
  • state 對當(dāng)前服務(wù)執(zhí)行啟動(dòng)奸焙,停止瞎暑、重啟、重新加載等操作(started,stopped,restarted,reloaded)

Example

  • 重新加載 systemd
# ansible webservers -i hosts -m systemd -a "daemon_reload=yes"
  • 啟動(dòng) Nginx 服務(wù)
# ansible webservers -i hosts -m systemd -a "name=nginx state=started"
  • 關(guān)閉 Nginx 服務(wù)
# ansible webservers -i hosts -m systemd -a "name=nginx state=stopped"
  • 重啟 Nginx 服務(wù)
# ansible webservers -i hosts -m systemd -a "name=nginx state=restarted"
  • 重新加載 Nginx 服務(wù)
# ansible webservers -i hosts -m systemd -a "name=nginx state=reloaded"
  • 將 Nginx 服務(wù)設(shè)置開機(jī)自啟動(dòng)
# ansible webservers -i hosts -m systemd -a "name=nginx enabled=yes"

4.6 group 模塊

在被管理節(jié)點(diǎn)上忿偷,對組進(jìn)行管理金顿。

常用參數(shù):

  • name 組名稱, 必須的
  • system 是否為系統(tǒng)組, yes/no 鲤桥, 默認(rèn)是 no
  • state 刪除或這創(chuàng)建,present/absent 渠概,默認(rèn)是present

Example

  • 創(chuàng)建普通組 db_admin
# ansible dbservers -i hosts -m group -a "name=db_admin"

4.7 user 模塊

用于在被管理節(jié)點(diǎn)上對用戶進(jìn)行管理茶凳。

常用參數(shù):

  • name 必須的參數(shù), 指定用戶名

  • password 設(shè)置用戶的密碼播揪,這里接受的是一個(gè)加密的值贮喧,因?yàn)闀?huì)直接存到 shadow, 默認(rèn)不設(shè)置密碼

  • update_password 假如設(shè)置的密碼不同于原密碼,則會(huì)更新密碼. 在 1.3 中被加入

  • home 指定用戶的家目錄

  • shell 設(shè)置用戶的 shell

  • comment 用戶的描述信息

  • create_home 在創(chuàng)建用戶時(shí)猪狈,是否創(chuàng)建其家目錄箱沦。默認(rèn)創(chuàng)建,假如不創(chuàng)建雇庙,設(shè)置為 no谓形。2.5版本之前使用 createhome

  • group 設(shè)置用戶的主組

  • groups 將用戶加入到多個(gè)其他組中灶伊,多個(gè)用逗號隔開。

                   默認(rèn)會(huì)把用戶從其他已經(jīng)加入的組中刪除寒跳。
    
  • append yes|no 和 groups 配合使用聘萨,yes 時(shí),

                  不會(huì)把用戶從其他已經(jīng)加入的組中刪除
    
  • system 設(shè)置為 yes 時(shí)童太,將會(huì)創(chuàng)建一個(gè)系統(tǒng)賬號

  • expires 設(shè)置用戶的過期時(shí)間米辐,值為時(shí)間戳,會(huì)轉(zhuǎn)為為天數(shù)后,放在 shadow 的第 8 個(gè)字段里

  • generate_ssh_key 設(shè)置為 yes 將會(huì)為用戶生成密鑰书释,這不會(huì)覆蓋原來的密鑰

  • ssh_key_type 指定用戶的密鑰類型翘贮, 默認(rèn) rsa, 具體的類型取決于被管理節(jié)點(diǎn)

  • state 刪除或添加用戶, present 為添加,absent 為刪除爆惧;

                     默認(rèn)值 present
    
  • remove 當(dāng)與 state=absent 一起使用狸页,刪除一個(gè)用戶及關(guān)聯(lián)的目錄,

                     比如家目錄检激,郵箱目錄肴捉。可選的值為: yes/no
    

Example

  • 創(chuàng)建用戶并設(shè)置密碼

    先生成加密密碼

    [root@qfedu.com ~]# pass=$(echo "123456" | openssl passwd -1 -stdin)
    

    執(zhí)行 ansible 命令 創(chuàng)建用戶 foo 并設(shè)置密碼

    # ansible all -i hosts -m user -a "name=foo password=${pass}"
    
  • 創(chuàng)建用戶 yangge, 并且為其創(chuàng)建密鑰對叔收,并且密鑰類型為: ecdsa

    # ansible all -i hosts -m user -a "name=yangge generate_ssh_key=yes ssh_key_type=ecdsa"
    
  • 創(chuàng)建用 tom, 并且設(shè)置其有效期到 2020年4月15日, 加入到組 db_admin 中, 不改變用戶原有假如的組齿穗。

    # ansible dbservers -i hosts -m user -a "name=tom expires=$(date +%s -d 20200415) gorups=db_admin append=yes"
    

date 命令說明

// 計(jì)算 3 小時(shí)之后是幾點(diǎn)幾分
# date +%T -d '3 hours'
// 任意日期的前 N 天,后 N 天的具體日期
# date +%F -d "20190910 1 day"
# date +%F -d "20190910 -1 day"

// 計(jì)算兩個(gè)日期相差天數(shù), 比如計(jì)算生日距離現(xiàn)在還有多少天
# d1=$(date +%s -d 20180728)
# d2=$(date +%s -d 20180726)
# echo $(((d1-d2)/86400))

4. 8 file 模塊

file 模塊主要用于遠(yuǎn)程主機(jī)上的文件操作饺律。

常用參數(shù):

  • owner 定義文件/目錄的屬主

  • group 定義文件/目錄的屬組

  • mode 定義文件/目錄的權(quán)限

  • path 必選項(xiàng)窃页,定義文件/目錄的路徑

  • recurse 遞歸的設(shè)置文件的屬性,只對目錄有效

  • src 鏈接(軟/硬)文件的源文件路徑复濒,只應(yīng)用于state=link的情況

  • dest 鏈接文件的路徑脖卖,只應(yīng)用于state=link的情況

  • state

    • directory 如果目錄不存在,創(chuàng)建目錄

    • file 文件不存在巧颈,則不會(huì)被創(chuàng)建畦木,存在則返回文件的信息,

                  常用于檢查文件是否存在砸泛。
      
    • link 創(chuàng)建軟鏈接

    • hard 創(chuàng)建硬鏈接

    • touch 如果文件不存在十籍,則會(huì)創(chuàng)建一個(gè)新的文件,如果文件或目錄

                  已存在唇礁,則更新其最后修改時(shí)間
      
    • absent 刪除目錄勾栗、文件或者取消鏈接文件

Example

// 創(chuàng)建一個(gè)文件
# ansible all -i hosts -m file -a "path=/tmp/foo.conf state=touch"
// 改變文件所有者及權(quán)限
# ansible all -i hosts -m file -a "path=/tmp/foo.conf owner=nobody group=nobody mode=0644"
// 創(chuàng)建一個(gè)軟連接
# ansible all -i hosts -m file -a "src=/tmp/foo.conf dest=/tmp/link.conf state=link"
// 創(chuàng)建一個(gè)目錄
# ansible all -i hosts -m file -a "path=/tmp/testdir state=directory"
// 取消一個(gè)連接
# ansible all -i hosts -m file -a "path=/tmp/link.conf state=absent"
// 刪除一個(gè)文件
# ansible all -i hosts -m file -a "path=/tmp/foo.conf state=absent"

4.9 cron 模塊

管理遠(yuǎn)程節(jié)點(diǎn)的CRON 服務(wù)。等同于Linux 中的 計(jì)劃任務(wù)盏筐。

注意:使用 Ansible 創(chuàng)建的計(jì)劃任務(wù)围俘,是不能使用本地 crontab -e去編輯,否則 Ansible 無法再次操作此計(jì)劃任務(wù)了。

常用參數(shù):

  • name 指定一個(gè)cron job 的名字界牡。一定要指定簿寂,便于日之后刪除。
  • minute 指定分鐘欢揖,可以設(shè)置成(0-59, *, */2 等)格式陶耍。 默認(rèn)是 * , 也就是每分鐘。
  • hour 指定小時(shí)她混,可以設(shè)置成(0-23, *, */2 等)格式烈钞。 默認(rèn)是 * , 也就是每小時(shí)。
  • day 指定天坤按, 可以設(shè)置成(1-31, *, */2 等)格式毯欣。 默認(rèn)是 * , 也就是每天。
  • month 指定月份臭脓, 可以設(shè)置成(1-12, *, */2 等)格式酗钞。 默認(rèn)是 * , 也就是每周。
  • weekday 指定星期来累, 可以設(shè)置成(0-6 for Sunday-Saturday, * 等)格式砚作。默認(rèn)是 *,也就是每星期嘹锁。
  • job 指定要執(zhí)行的內(nèi)容葫录,通常可以寫個(gè)腳本领猾,或者一段內(nèi)容米同。
  • state 指定這個(gè)job的狀態(tài),可以是新增(present)或者是刪除(absent)摔竿。 默認(rèn)為新增(present)

Example

// 新建一個(gè) CRON JOB 任務(wù)
# ansible all -i hosts -m cron -a "name='create new job' minute='0' job='ls -alh > /dev/null'"
// 刪除一個(gè) CRON JOB 任務(wù)面粮,刪除時(shí),一定要正確指定job 的name參數(shù)继低,以免誤刪除熬苍。
# ansible all -i hosts -m cron -a "name='create new job' state=absent" 

登錄任何一臺(tái)管理機(jī)驗(yàn)證cron

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

4.10 debug模塊

debug 模塊主要用于調(diào)試時(shí)使用,通常的作用是將一個(gè)變量的值給打印出來袁翁。

常用參數(shù):

  • var 直接打印一個(gè)指定的變量值
  • msg 打印一段可以格式化的字符串

Example

  • 這里引入了變量冷溃,我們只需了解 debug 模板的使用即可。在學(xué)習(xí)變量梦裂、劇本時(shí),我們會(huì)對它有更深刻的理解盖淡。
# 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格式作為文件模版年柠,可以進(jìn)行文檔內(nèi)變量的替換。文件以 .j2 結(jié)尾。

常用參數(shù):

  • src 指定 Ansible 控制端的 文件路徑
  • dest 指定 Ansible 被控端的 文件路徑
  • owner 指定文件的屬主
  • group 指定文件的屬組
  • mode 指定文件的權(quán)限
  • backup 創(chuàng)建一個(gè)包含時(shí)間戳信息的備份文件冗恨,這樣如果您以某種方式錯(cuò)誤地破壞了原始文件答憔, 就可以將其恢復(fù)原狀。yes/no

Example

用法其實(shí)和 copy 模塊基本一樣掀抹, template 模塊的強(qiáng)大之處就是使用變量替換虐拓,就是可以把傳遞給 Ansible 的變量的值替換到模板文件中。

1. 建立一個(gè) template 文件, 名為 hello_world.j2
# cat hello_world.j2
Hello {{var}} !

2. 執(zhí)行命令傲武,并且設(shè)置變量 var 的值為 world
# ansible all -i hosts -m template -a "src=hello_world.j2 dest=/tmp/hello_world.world" -e "var=world"

3. 在被控主機(jī)上驗(yàn)證
# cat /tmp/hello_world.world
Hello world !

4.12 lineinfile 模塊

在被管理節(jié)點(diǎn)上蓉驹,用正則匹配的方式對目標(biāo)文件的一行內(nèi)容修改刪除等操作。

如果是在一個(gè)文件中把所有匹配到的多行都進(jìn)行統(tǒng)一處理揪利,請參考replace 模塊态兴。

如果想對一個(gè)文件進(jìn)行一次性添加/更新/刪除多行內(nèi)容等操作,參考blockinfile模塊

常用參數(shù)

  • path 被管理節(jié)點(diǎn)的目標(biāo)文件路徑, 必須疟位。

  • state 可選值absent 刪除 |present 替換(默認(rèn)值)瞻润。

  • regexp 在文件的每一行中查找的正則表達(dá)式。

    對于 state=present ,僅找到的最后一行將被替換甜刻。

  • line 要在文件中插入/替換的行绍撞。需要state=present

  • create 文件不存在時(shí)得院,是否要?jiǎng)?chuàng)建文件并添加內(nèi)容傻铣。yes/no

Example

  • 刪除被控節(jié)點(diǎn)文件里的某一條內(nèi)容
# ansible dbservers -i hosts -m lineinfile -a "path=/etc/sudoers regexp='^%wheel' state=absent"
  • 替換某一行
# ansible dbservers -i hosts -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled' state=present"

4.13 blockinfile 模塊

對目標(biāo)文件進(jìn)行多行的添加/更新/刪除操作。

常用參數(shù)

  • path 目標(biāo)文件路徑
  • block 文件中被操作的塊內(nèi)容
  • state 塊內(nèi)容如何處理尿招,absent 刪除矾柜, present 添加/更新(默認(rèn)值)

Example

  • 向文件/etc/ssh/sshd_config的最后添加幾行內(nèi)容

    添加的內(nèi)容是

    Match User ansible-agent
    PasswordAuthentication no
    
ansible dbservers -i hosts -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication no'"

注意:\n 是換行符的意思。

  • 更新之前的內(nèi)容

    ansible dbservers -i hosts -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication yes'"
    
  • 刪除文件中的連續(xù)出現(xiàn)幾行內(nèi)容

    ansible dbservers -i hosts -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication yes' state=absent"
    

模塊索引 https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末就谜,一起剝皮案震驚了整個(gè)濱河市怪蔑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丧荐,老刑警劉巖缆瓣,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異虹统,居然都是意外死亡弓坞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門车荔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渡冻,“玉大人,你說我怎么就攤上這事忧便∽逦牵” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長超歌。 經(jīng)常有香客問我砍艾,道長,這世上最難降的妖魔是什么巍举? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任脆荷,我火速辦了婚禮,結(jié)果婚禮上懊悯,老公的妹妹穿的比我還像新娘蜓谋。我一直安慰自己,他們只是感情好定枷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布孤澎。 她就那樣靜靜地躺著,像睡著了一般欠窒。 火紅的嫁衣襯著肌膚如雪覆旭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天岖妄,我揣著相機(jī)與錄音型将,去河邊找鬼。 笑死荐虐,一個(gè)胖子當(dāng)著我的面吹牛七兜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播福扬,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼腕铸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了铛碑?” 一聲冷哼從身側(cè)響起狠裹,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汽烦,沒想到半個(gè)月后涛菠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撇吞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年俗冻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牍颈。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡迄薄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出煮岁,到底是詐尸還是另有隱情噪奄,我是刑警寧澤死姚,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站勤篮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏色罚。R本人自食惡果不足惜碰缔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望戳护。 院中可真熱鬧金抡,春花似錦、人聲如沸腌且。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铺董。三九已至巫击,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間精续,已是汗流浹背坝锰。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留重付,地道東北人顷级。 一個(gè)月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像确垫,于是被迫代替她去往敵國和親弓颈。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355