Ansible - Ansible setup
[toc]
ref:
Ansible - Ansible setup
操作 Ansible
用 Ad-Hoc command 和 Playbook 兩種方式來操作 Ansible。
- 前者是透過一次次簡短的指令來操作 Ansible,
- 而後者則是先把任務寫好,然後再一次執行。
- 兩者的關係就好比我們在 Linux Shell 裡打指令和先寫個 Shell Script 再執行一樣。
Ad-Hoc Commands
Ad hoc 拉丁文,通常用來形容為一個特定的問題或任務而專門設定的解決方案
Ad-Hoc Commands
- 可以翻譯為 簡短地指令 / 指令操作模式
- 以常見的
ping
和echo
操作為例。 - Ad-Hoc commands 一次只能處理一件事情,這即是它與 Playbooks 最大的差異。
1
2
3
4
5
6
7
8
9
10
11
12
13
# - ping.
$ ansible all -m ping
server1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
# - echo.
$ ansible all -m command -a "echo Hello World"
server1 | SUCCESS | rc=0 >>
Hello World
Playbooks
Playbook
- 透過事先寫好的劇本 (Playbooks) 來讓各個 Managed Node 進行指定的 動作 (Plays) 和 任務 (Tasks)
- Playbooks 是 Ansible 的腳本 (Script),而且還是個比傳統 Shell Script 還強大數百倍的腳本
在一份 Playbook 中,可以有多個 Play、多個 Task 和多個 Module。
- Play:
- 通常為某個特定的目的,
- 例如:
Setup a official website with Drupal
(藉由 Drupal 建置官網)Restart the API service
(重開 API 服務)
- Task:
- 要實行 Play 這個目地所需做的每個步驟,
- 例如:
Install the Nginx
(安裝 Nginx)Kill the djnago process
(強制停止 django 的行程)
- Module:
- Ansible 所提供的各種操作方法,
- 例如:
apt: name=vim state=present
(使用 apt 套件安裝 vim)command: /sbin/shutdown -r now
(使用 shutdown 的指令重新開機)
Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#创建yml执行文件
vim copytest.yml
---
- hosts: hostname # hosts中指定
remote_user: root # 如果和当前用户一样,则无需指定
tasks:
- name: copyfile #建议每个任务指定一个name,方便出错时检查
copy: src=/root/test.txt dest=root/test.txt # 本地拷贝到远端
- name: copyfile
copy: src=~ dest=~
- name: testshell
shell: 'touch test.txt'
- name: testshell2
shell: 'touch test2.txt' #遵循这样的格式
# playbook执行方法:
sudo ansible-playbook copytest.yml
#主机名、执行命令都已在yml中指定了。
Example
通过连接git仓库的方法,远端服务器将本机的bash配置文件分发给其他指定的服务器,并执行生效。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 1.创建yml文件编写task,并上传到git仓库
vim Change_Profile.yml
- hosts: host
remote_user: root
tasks:
- name: copyprofile
copy: src=/root/.bash_profile dest=/root/.bash_profile owner=root mode=0600
- name: runprofile
shell: source /root/.bash_profile
# 2.编写shell脚本,交给远端服务器执行
# !bin/bash
mypath="User/root/itservercontrol"
if [ ! -d "$mypath"]; then
git clone git@example.git #填写git仓库地址
sudo ansible-playbook Change_Profile.yml
else
cd itservercontrol
git pull
sudo ansible-playbook Change_Profile.yml
fi
# 3.向远端服务器发送本地编写的脚本,并执行
ansible hostname -m script -a "/root/itservertest.sh"
Example: Hello World Playbook
建立一個
hello_world.yml
的檔案,並將---
開始的內容都寫進去。1 2 3 4 5 6 7 8 9 10 11 12 13 14
$ vi hello_world.yml --- - name: say 'hello world' hosts: all tasks: - name: echo 'hello world' command: echo 'hello world' register: result - name: print stdout debug: msg: ""
執行 playbook:執行了 1 個 Play、3 個 Tasks 和 2 個 Modules。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
$ ansible-playbook hello_world.yml PLAY [say 'hello world'] ******************************************************* TASK [setup] ******************************************************************* ok: [server1] TASK [echo 'hello world'] ****************************************************** changed: [server1] TASK [print stdout] ************************************************************ ok: [server1] => { "msg": "hello world" } PLAY RECAP ********************************************************************* server1 : ok=3 changed=1 unreachable=0 failed=0
註:我們明明只在 hello_world.yml 裡寫了 2 個 tasks,可為什麼會出現 3 個 tasks 呢?這是因為 Ansible 預設會使用
setup
task 來取得 managed node 的 facts。
沒有 Ansible 時,怎麼操作
- Shell (command line, cli, console)
1
2
3
4
5
6
7
8
9
10
11
# - ping.
$ ping -c 1 8.8.8.8
# PING 8.8.8.8 (8.8.8.8): 56 data bytes
# 64 bytes from 8.8.8.8: icmp_seq=0 ttl=44 time=10.022 ms
# --- 8.8.8.8 ping statistics ---
# 1 packets transmitted, 1 packets received, 0.0% packet loss
# round-trip min/avg/max/stddev = 10.022/10.022/10.022/0.000 ms
# - echo.
$ echo Hello World
# Hello World
- Shell Script
1
2
3
4
5
6
7
8
# - create script
vim hello_world.sh
#!/bin/bash
echo 'Hello World'
# - 執行。
$ bash hello_world.sh
# Hello World
為什麼要寫 playbook
- 若有現成的 script,我們可以用
shell
module 來執行它,這部份雖不衝突,但使用shell
module 會造成每次跑 playbook 都會重複執行,不像其它 module 執行過就不會再執行了。 - 用 Ansible 的 module 可以把很多雜亂的指令給標準化,
- 例如不同的 Linux 發行版本在安裝套件時需代各種不同的參數。
- 在現有的 cloud native 的架構下,傳統的 Shell Script 已不符使用,
- 一般而言 Shell Script 只能對一台機器 (instance) 進行操作。
.
This post is licensed under CC BY 4.0 by the author.
Comments powered by Disqus.