Ansible 基本操作

  • Category: 電腦相關
  • Last Updated: Tuesday, 20 December 2016 23:43
  • Published: Thursday, 14 April 2016 12:16
  • Written by sam

之前試著操作過的Ansible因腦袋放鬆太久

趁現在閒著,把比較常用的初階Ansible操作記錄一下

安裝就先略過了

root@ubuntu:/etc/ansible#
這個目錄下有兩個主要設定檔案
一個是hosts, 一個是ansible.cfg

通常我會修改的是

sudo_user = XXX 替換成你sudo之後的使用者,通常是root
inventory = 位置/檔名 這個我會換成 ./hosts 這樣可以彈性的使用在自建目錄中的自訂檔名
remote_user = XXX 這個就是看你ssh登入的人通常是誰,不過我通常寫在 playbook裡 比較彈性
private_key_file = 路徑/檔名 現在大家應該都是用ssh key的方式登入了

再來說一下hosts 架構

可以使用
192.168.8.88

[web]
web[1:3]

[mail]
myla.gotdns.com
myla[1:3].gotdns.com

當然常用的vars也可以寫在裡面或是群組的群組

[web:vars]
ansible_sudo_pass=XXX 當然是最好不要這樣幹
ansible_ssh_user=XXX

[server:children]
web
mail

通常另一個作法會寫在 group_vars/name or all 或是 host_vars/name or all 這兩個檔案裡

可以參考官網

再來是執行一次性命令,可以不用寫playbook

ansible all -m shell -a "free -m" --extra-vars "gather_facts=False"

all 指的是執行你hosts裡面的所有主機名

-m 是你要執行的模塊 這邊是 shell 後面接上命令 free -m

-u 代表的是遠端的使用者名(我們寫在inventory裡了

最後是另外加上的 --extra-vars "gather_facts=False"

表示的是不跑setup 它主要的功能是可以偵測出你目標系統的參數,目的是在你的playbook可以用以判斷,比如你是呼叫apt-get,但不幸的是,你是redhat或centos,類似when的概念

when: ansible_os_family == "RedHat" and ansible_lsb.major_release|int >= 6

加上了這個變數,會使得執行時間縮短很多,當然你就必需要能掌握你的目標的環境

root@ubuntu:/etc/ansible# ansible boredom -m setup 以下是示例結果
boredom | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.188.188", 
            "114.43.122.191"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::20c:29ff:fe85:6357"
        ], 
        "ansible_architecture": "x86_64", 
        "ansible_bios_date": "07/02/2015", 
        "ansible_bios_version": "6.00", 
        "ansible_cmdline": {
            "BOOT_IMAGE": "/boot/vmlinuz-3.16.0-4-amd64", 
            "quiet": true, 
            "ro": true, 
            "root": "UUID=66f67708-160d-4cad-89ce-9cc7c0eeee43"

會撈出所有系統資訊,以利你可以下判斷式

再來執行時,命令列後會加 -v 最多可以到4個v 目的是讓你可以方便除錯,愈多v愈詳盡

通常ssh-key會有加上密碼

變成你每次下命令時會提示輸入

常常輸入就會很…特別是這個密碼又長又複雜,簡直搞死自己,可以怎樣作呢?

寶寶心裡知道,但寶寶不說(PTT流行語…)

eval `ssh-agent -s`
ssh-add

這樣就可以只輸入一次,應付全部(但有資安問題

可以就維持到你離開這個ssh-session

-K 這個參數是當你在playbook中使用到sudo的時候,要輸入密碼的密碼

但如果你用不安全的方法,寫在Inventory裡就不用另外加參數了

再來是因應比較多的需求,就必需要寫playbook了

先看一下,這個空洞的playbook
root@ubuntu:/etc/ansible/shutdown# cat test.yml
---
- hosts: all
  sudo: true
  gather_facts: false

  tasks:
  - name: sync
    shell: sync
  - name: apt-get update
    apt: update_cache=yes
  - name: hd usege
    shell: df -h
    register: df_var
  - debug: var=df_var 
  - name: whoami
    shell: whoami

ansible的格式是YAML

所以開頭一定是使用三個"---" 請參考介紹

目標一樣是所有主機

使用sudo來執行命令

不取得setup資訊

task的部份就是指你要它執行的工作

name 可以沒有,但方便輸出時辨別,通常都會加上

shell這行表示是要執行什麼模塊(這邊有shell、apt

比較特別是跑了register,後面接debug,它可以輸出詳盡的內容(保留原本格式

有debug
ok: [boredom] => {
    "df_var": {
        "changed": true, 
        "cmd": "df -h", 
        "delta": "0:00:00.057418", 
        "end": "2016-04-14 10:43:57.372904", 
        "rc": 0, 
        "start": "2016-04-14 10:43:57.315486", 
        "stderr": "", 
        "stdout": "Filesystem           Size  Used Avail Use% Mounted on\n/dev/sda1            7.4G  2.0G  5.1G  29% /\nudev                  10M     0   10M   0% /dev\ntmpfs                

 98M  4.6M   93M   5% /run\ntmpfs                244M     0  244M   0% /dev/shm\ntmpfs                5.0M     0  5.0M   0% /run/lock\ntmpfs                244M     0  244M   0% 

/sys/fs/cgroup\n//192.168.8.8/logs/  747G  718G   29G  97% /mnt/smb", 
        "stdout_lines": [
            "Filesystem           Size  Used Avail Use% Mounted on", 
            "/dev/sda1            7.4G  2.0G  5.1G  29% /", 
            "udev                  10M     0   10M   0% /dev", 
            "tmpfs                 98M  4.6M   93M   5% /run", 
            "tmpfs                244M     0  244M   0% /dev/shm", 
            "tmpfs                5.0M     0  5.0M   0% /run/lock", 
            "tmpfs                244M     0  244M   0% /sys/fs/cgroup", 
            "//192.168.8.8/logs/  747G  718G   29G  97% /mnt/smb"
沒有debug要加上 -v 不然沒輸出
changed: [boredom] => {"changed": true, "cmd": "df -h", "delta": "0:00:00.025903", "end": "2016-04-14 10:45:47.303340", "rc": 0, "start": "2016-04-14 10:45:47.277437", "stderr": "", 

"stdout": "Filesystem           Size  Used Avail Use% Mounted on\n/dev/sda1            7.4G  2.0G  5.1G  29% /\nudev                  10M     0   10M   0% /dev\ntmpfs                 98M  

4.6M   93M   5% /run\ntmpfs                244M     0  244M   0% /dev/shm\ntmpfs                5.0M     0  5.0M   0% /run/lock\ntmpfs                244M     0  244M   0% /sys/fs/cgroup

\n//192.168.8.8/logs/  747G  718G   29G  97% /mnt/smb", "stdout_lines": ["Filesystem           Size  Used Avail Use% Mounted on", "/dev/sda1            7.4G  2.0G  5.1G  29% /", "udev       

           10M     0   10M   0% /dev", "tmpfs                 98M  4.6M   93M   5% /run", "tmpfs                244M     0  244M   0% /dev/shm", "tmpfs                5.0M     0  5.0M   0% 

/run/lock", "tmpfs                244M     0  244M   0% /sys/fs/cgroup", "//192.168.8.8/logs/  747G  718G   29G  97% /mnt/smb"]

可以見到有點亂,大致上就是如此

最後再說一個關於模塊的應用方式和語法

先看一下
root@ubuntu:/etc/ansible# ansible-doc -l
a10_server                      Manage A10 Networks AX/SoftAX/Thunder/vThunder devices          
a10_service_group               Manage A10 Networks devices' service groups                     
a10_virtual_server              Manage A10 Networks devices' virtual servers                    
acl                             Sets and retrieves file ACL information.                        
add_host                        add a host (and alternatively a group) to the ansible-playbook i...
airbrake_deployment             Notify airbrake about app deployments                           
alternatives                    Manages alternative programs for common commands                
apache2_module                  enables/disables a module of the Apache2 webserver              
apk                             Manages apk packages                                            
apt                             Manages apt-packages                                            
apt_key                         Add or remove an apt key                                        
apt_repository                  Add and remove APT repositories                                 
apt_rpm                         apt_rpm package manager                                         
assemble                        Assembles a configuration file from fragments                   
assert                          Fail with custom message

畫面的關係,當然是不只這些

比如我們想看apt這個要如何使用

root@ubuntu:/etc/ansible# ansible-doc apt
less 458 (GNU regular expressions)
Copyright (C) 1984-2012 Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Homepage: http://www.greenwoodsoftware.com/less
> APT

  Manages `apt' packages (such as for Debian/Ubuntu).

Options (= is mandatory):

- cache_valid_time
        If `update_cache' is specified and the last run is less or equal than
        `cache_valid_time' seconds ago, the `update_cache' gets skipped.
        [Default: False]

- deb
        Path to a .deb package on the remote machine.

- default_release

也是畫面關係,在裡面可以見到語法如何下達

最後是YAML的重點

沒有使用TAB

在行結束時也不能有空格或是TAB

Ansible的好處是不需像CHEF那樣的龐大架構,也不需要安裝Agent

大家都可以隨手嘗試