自動化運維三賤客之 Ansible 的安裝和命令應用基礎
阿新 • • 發佈:2018-08-02
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 的安裝和命令應用基礎