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
大家都可以隨手嘗試