1. 程式人生 > >自動化運維三賤客之 Ansible 的安裝和命令應用基礎

自動化運維三賤客之 Ansible 的安裝和命令應用基礎

let disabled ech ssh-agent set tdi pac ima running

ansible 簡介 :

ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。

ansible 基本框架 :

ansible是基於模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。

技術分享圖片

Ansible 基本架構由六個部分構成 :

  • Ansible core 核心引擎。
  • Host inventory 主機清單 : 用來定義 ansible 所管理的主機 ,默認是在 ansible 的 hosts 配置文件中定義被管理的主機 ,同時也支持自定義動態主機清單和指定其他配置文件的位置。
  • Connection plugins 鏈接插件 : 負責和被管理主機實現通信。除支持使用 SSH 鏈接被管理主機外,ansible 還支持其他的鏈接方式,所以需要有鏈接插件將各個主機用鏈接插件連接到 ansible。
  • Playbooks (yaml,jinja2)劇本 : 用來集中定義 ansible 任務的配置文件,即將多個任務定義在一個劇本中由 ansible 自動執行,可以由控制主機針對多臺被管理主機同時運行多個任務。
  • Core modules 核心模塊 :是 ansible 自帶的模塊 ,使用這些模塊將資源分發到被管理主機,使其執行特定任務或匹配特定的狀態。
  • Custom modules 自定義模塊 :用於完成模塊功能的補充,可借助相關插件完成記錄日誌、發送郵件等功能。

案例環境 :

角色 主機名 IP地址 組名
控制主機 node 1 192.168.217.137
被控制主機 node 2 192.168.217.138 webserver
被控制主機 node 3 192.168.217.139 mysql
被控制主機 node 4 192.168.217.140 mysql

安裝部署 ansible 服務

1.在控制主機安裝 ansible :

yum install -y epel-release  #安裝epel源
yum install ansible -y     

ansible --version            #查看ansible版本

yum install tree -y

tree /etc/ansible/      #樹狀結構展示文件夾
/etc/ansible/
├── ansible.cfg   #ansible的配置文件
├── hosts         #ansible的主倉庫,用於存儲需要管理的遠程主機的相關信息
└── roles         #角色

2.配置主機清單 :

cd /etc/ansible
vim  hosts        
[webserver]         #被管理主機分類  可以添加多個ip
192.168.217.138     
[mysql]
192.168.217.139
192.168.217.140

3.設置 SSH 推送公鑰 :

[root@bogon ansible]# ssh-keygen -t rsa         #生成密鑰 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):   #密鑰生成位置是否存在root家目錄  回車即可
Created directory ‘/root/.ssh‘.  
Enter passphrase (empty for no passphrase):      #密鑰驗證的密碼 
Enter same passphrase again: 
.......
The key‘s randomart image is:
+---[RSA 2048]----+
|. +=*O. .        |
|.+oo+o=  o       |
|.+   E.   B      |
|.      + o B     |
|      . S + . .  |
|       ..+o  . .o|
|        .* =  ..+|
|        .oO o  o.|
|        .oo=...  |
+----[SHA256]-----+
[root@bogon ansible]# ssh-copy-id [email protected]   #把公鑰發送到被管理主機

[root@bogon ansible]# ssh-copy-id [email protected]   #公鑰默認放在對方用戶家目錄下 .ssh
.....
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]‘s password:        #對方root用戶密碼

4.設置免交互 :

[root@bogon ansible]# ssh-agent bash    #把bash掛到ssh-agent下面
[root@bogon ansible]# ssh-add           #添加私鑰
Enter passphrase for /root/.ssh/id_rsa:        #密鑰驗證密碼
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
#如果沒有免交互,則使用 ansible 管理被管理主機是需要輸入密鑰驗證密碼。

Ansible 命令應用基礎

Ansible 基本語法 :

ansible <host-pattern> [-m module_name] [-a args]

<host-pattern> : 對那些主機生效

[-m module_name] : 要使用的模塊

[-a args] : 模塊特有參數

1.command 模塊 :

用於執行常見的linux命令(默認模塊,不指定-m默認就是command)。

ansible-doc -s command       #查看模塊的使用說明

(1).使用IP地址指定運行主機 :

[root@bogon ~]# ansible 192.168.217.138 -m command -a ‘date‘
192.168.217.138 | SUCCESS | rc=0 >>
2018年 08月 02日 星期四 09:43:45 CST

(2).使用被管理主機中的分類運行主機 :

[root@bogon ~]# ansible webserver -m command -a ‘date‘
192.168.217.138 | SUCCESS | rc=0 >>
2018年 08月 02日 星期四 09:45:40 CST

(3).在所有主機清單中的主機運行 :

[root@bogon ~]# ansible all -m command -a ‘date‘
192.168.217.138 | SUCCESS | rc=0 >>
2018年 08月 02日 星期四 09:47:11 CST

192.168.217.139 | SUCCESS | rc=0 >>
2018年 08月 02日 星期四 09:47:11 CST

2.cron 模塊 :

Ansible 中的 cron 模塊用於定義任務計劃。其中有兩種狀態(state):present 表示添加(省略時默認使用)。absent 表示移除。

ansible-doc -s cron       #查看模塊的使用說明

(1).添加任務計劃 :

[root@bogon ~]# ansible webserver -m cron -a ‘minute="*/1" job="/bin/echo hello" name="test cron job"‘          #添加任務
192.168.217.138 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "test cron job"
    ]
}
[root@bogon ~]# ansible webserver -a ‘crontab -l‘  #查看任務
192.168.217.138 | SUCCESS | rc=0 >>
#Ansible: test cron job
*/1 * * * * /bin/echo hello

(2).移除任務計劃 :

[root@bogon ~]# ansible webserver -m cron -a ‘minute="*/1" job="/bin/echo hello" name="test cron job" state=absent‘
192.168.217.138 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": []
}
[root@bogon ~]# ansible webserver -a ‘crontab -l‘
192.168.217.138 | SUCCESS | rc=0 >>

3.user 模塊 :

Ansible 中的 user 模塊用於創建用戶和更改、刪除已存在的用戶。其中 name 選項用來指明創建的用戶名稱。

ansible-doc -s user      #查看模塊的使用說明

(1).創建用戶 :

[root@bogon ~]# ansible mysql -m user -a ‘name="user01"‘
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "create_home": true, 
    "group": 1001, 
    "home": "/home/user01", 
    "name": "user01", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1001
}

(2).刪除用戶 :

[root@bogon ~]# ansible mysql -m user -a ‘name="user01" state=absent‘
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "force": false, 
    "name": "user01", 
    "remove": false, 
    "state": "absent"
}

4.group 模塊 :

Ansible 中的 group 模塊用於對用戶組進行管理。

ansible-doc -s group      #查看模塊的使用說明

(1).創建 mysql 組,將 mysql 用戶添加到 mysql 組 :

[root@bogon ~]# ansible mysql -m group -a ‘name=mysql gid=306 system=yes‘  #創建 mysql 組 指定gid 
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "gid": 306, 
    "name": "mysql", 
    "state": "present", 
    "system": true
}
[root@bogon ~]# ansible mysql -m user -a ‘name=mysql uid=306 system=yes  group=mysql‘      #創建用戶  指定uid 指定組
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "create_home": true, 
    "group": 306, 
    "home": "/home/mysql", 
    "name": "mysql", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": true, 
    "uid": 306
}

5.copy 模塊 :

Ansible 中的 copy 模塊用於實現文件的復制和批量下發文件。其中 src 定義本地路徑,使用 dest 定義被管理主機文件路徑。使用 content 則是通過指定信息內容來生成目標文件。

ansible-doc -s copy      #查看模塊的使用說明

(1).將本地文件復制到被管理主機上 :

[root@bogon ~]# ansible mysql -m copy -a ‘src=/etc/fstab dest=/opt/abc.ansible owner=root mode=640‘    #屬主、文件權限
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "checksum": "4b11a9d8a720fb2ea2b2bcbafef6c37a0621b9ef", 
    "dest": "/opt/abc.ansible", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "e826ed6cacb28bdb65d4af2defb77bf1", 
    "mode": "0640", 
    "owner": "root", 
    "secontext": "system_u:object_r:usr_t:s0", 
    "size": 595, 
    "src": "/root/.ansible/tmp/ansible-tmp-1533176788.96-59671060453195/source", 
    "state": "file", 
    "uid": 0
}

(2).將 hello 寫入 /opt/abc.ansible 文件中 :

[root@bogon ~]# ansible mysql -m copy -a ‘content="hello" dest=/opt/abc.ansible‘
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "checksum": "aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d", 
    "dest": "/opt/abc.ansible", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "5d41402abc4b2a76b9719d911017c592", 
    "mode": "0640", 
    "owner": "root", 
    "secontext": "system_u:object_r:usr_t:s0", 
    "size": 5, 
    "src": "/root/.ansible/tmp/ansible-tmp-1533177209.24-236200926193569/source", 
    "state": "file", 
    "uid": 0
}

6.file 模塊 :

Ansible 中的 file 模塊來設置文件屬性。其中使用 path 指定文件路徑,使用 src 定義源文件路徑,使用 name 或 dest 來替換創建文件的符號鏈接。

ansible-doc -s file      #查看模塊的使用說明

(1).設置文件 /opt/abc.ansible 的屬主為 mysql ,屬組為 mysql ,權限為644 :

[root@bogon ~]# ansible mysql -m file -a ‘owner=mysql group=mysql mode=644 path=/opt/abc.ansible‘
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "gid": 306, 
    "group": "mysql", 
    "mode": "0644", 
    "owner": "mysql", 
    "path": "/opt/abc.ansible", 
    "secontext": "system_u:object_r:usr_t:s0", 
    "size": 5, 
    "state": "file", 
    "uid": 306
}

(2).設置 /opt/abc.link 為文件 /opt/abc.ansible 的鏈接文件 :

[root@bogon ~]# ansible mysql -m file -a ‘path=/opt/abc.link src=/opt/abc.ansible state=link‘
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "dest": "/opt/abc.link", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:usr_t:s0", 
    "size": 16, 
    "src": "/opt/abc.ansible", 
    "state": "link", 
    "uid": 0
}

7.ping 模塊 :

在 Ansible 中使用 ping 模塊來檢測指定主機的連通性。

[root@bogon ~]# ansible all -m ping
192.168.217.139 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.217.138 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

8.service 模塊 :

在 Ansible 中使用 service 模塊來控制管理服務的運行狀態。其中,使用 enabled 表示是否開機自啟,取值為 true 或 false ;使用 name 定義服務名稱;使用 state 指定服務狀態,取值分別為 started、stoped、restarted。

ansible-doc -s service      #查看模塊的使用說明

(1).查看 httpd 服務 :

[root@bogon ~]# ansible webserver -a ‘systemctl status httpd.service‘   #(centos 7 )
192.168.217.138 | FAILED | rc=3 >>
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd(8)
           man:apachectl(8)
ansible webserver -a ‘chkconfig --list httpd‘  

(2).啟動 httpd 服務並設置開機自啟動 :

[root@bogon ~]# ansible webserver -m service -a ‘enabled=true name=httpd state=started‘
192.168.217.138 | SUCCESS => {
    "changed": true, 
    "enabled": true, 
    "name": "httpd", 
    "state": "started", 
    ........

9.shell 模塊 :

在 Ansible 中的 shell 模塊可以被管理主機上運行命令,並支持管道符號等功能的復雜命令。

ansible-doc -s shell      #查看模塊的使用說明

創建用戶使用無交互模式給用戶設置密碼。

[root@bogon ~]# ansible mysql -m user -a ‘name=user01‘
[root@bogon ~]# ansible mysql -m shell -a ‘echo abc123 | passwd --stdin user01‘
192.168.217.139 | SUCCESS | rc=0 >>
更改用戶 user01 的密碼 。
passwd:所有的身份驗證令牌已經成功更新。

10.script 模塊 :

在 Ansible 中的 script 模塊可以將本地腳本復制到被管理主機上進行運行。需要註意的是使用相對路徑來指定腳本。

ansible-doc -s script      #查看模塊的使用說明
[root@bogon ~]# vim test.sh
[root@bogon ~]# chmod +x test.sh 
[root@bogon ~]# ./test.sh 
haha
[root@bogon ~]# ansible mysql -m script -a ‘test.sh‘
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.217.139 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to 192.168.217.139 closed."
    ], 
    "stdout": "haha\r\n", 
    "stdout_lines": [
        "haha"
    ]
}

11.yum 模塊 :

在 Ansible 中的 yum 模塊負責在被管理主機上安裝與卸載軟件包 。使用 state 指定安裝軟件的狀態,present、latest用來表示安裝,absent 表示卸載。

ansible-doc -s yum      #查看模塊的使用說明

(1).安裝 zsh軟件包 :

[root@bogon ~]# ansible mysql -m yum -a ‘name=zsh‘
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "Loaded plugins: fastestmirror, langpacks\nLoading mirror speeds from cached hostfile\n * base: mirrors.nju.edu.cn\n * extras: mirrors.nju.edu.cn\n * updates: mirrors.shu.edu.cn\nResolving Dependencies\n--> Running transaction check\n---> Package zsh.x86_64 0:5.0.2-28.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package        Arch              Version                 Repository       Size\n================================================================================\nInstalling:\n zsh            x86_64            5.0.2-28.el7            base            2.4 M\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 2.4 M\nInstalled size: 5.6 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : zsh-5.0.2-28.el7.x86_64                                      1/1 \n  Verifying  : zsh-5.0.2-28.el7.x86_64                                      1/1 \n\nInstalled:\n  zsh.x86_64 0:5.0.2-28.el7                                                     \n\nComplete!\n"
    ]
}

(2).卸載 zsh 軟件包 :

[root@bogon ~]# ansible mysql -m yum -a ‘name=zsh state=absent‘
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "已加載插件:fastestmirror, langpacks\n正在解決依賴關系\n--> 正在檢查事務\n---> 軟件包 zsh.x86_64.0.5.0.2-28.el7 將被 刪除\n--> 解決依賴關系完成\n\n依賴關系解決\n\n================================================================================\n Package       架構             版本                      源               大小\n================================================================================\n正在刪除:\n zsh           x86_64           5.0.2-28.el7              @base           5.6 M\n\n事務概要\n================================================================================\n移除  1 軟件包\n\n安裝大小:5.6 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  正在刪除    : zsh-5.0.2-28.el7.x86_64                                     1/1 \n  驗證中      : zsh-5.0.2-28.el7.x86_64                                     1/1 \n\n刪除:\n  zsh.x86_64 0:5.0.2-28.el7                                                     \n\n完畢!\n"
    ]
}

12.setup 模塊 :

在 Ansible 中使用 setup 模塊收集、查看別管理的主機的 facts (facts 是 ansible 采集被管理主機設備信息的一個功能)。每一個被管理主機在接受並運行管理命令之前,都會將自己的相關信息(操作系統、IP地址等 )發送給控制主機。

ansible-doc -s setup      #查看模塊的使用說明
[root@bogon ~]# ansible mysql -m setup
192.168.217.139 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.122.1", 
            "192.168.217.139"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::702c:dff:a392:257c", 
            "fe80::129f:929e:aad4:8dde"
        ], 
        "ansible_apparmor": {
            "status": "disabled"
......
#輸出信息較多

自動化運維三賤客之 Ansible 的安裝和命令應用基礎