ansible學習筆記之1

ansible學習筆記之1

ansible學習筆記之1

ansible 基礎 ad-hoc 基礎概念




說說運維工具的類型


>

運維工具按是否需要有代理程序來劃分分為兩類:
     agent(需要代理工具):
         基于專用的agent程序完成管理功能,此類型的工具有puppet,func,zabbix
     agentless(無需代理工具):
         基于通用的ssh服務完成管理,此類型的工具有ansible,fabric


ansible簡介


Ansible是一個簡單的自動化運維管理工具,基于Python語言實現,由Paramiko和PyYAML兩個關鍵模塊構建,可用于自動化部署應用、配置、編排task(持續交付、無宕機更新等)。主版本大概每2個月發布一次。

Ansible與Saltstack最大的區別是Ansible無需在被控主機部署任何客戶端代理,默認直接通過SSH通道進行遠程命令執行或下發配置:相同點是都具備功能強大、靈活的系統管理、狀態配置,兩者都提供豐富的模板及API,對云計算平臺、大數據都有很好的支持。


ansible特點


    部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作;

    默認使用SSH協議對設備進行管理;

    主從集中化管理;

    配置簡單、功能強大、擴展性強;

    支持API及自定義模塊,可通過Python輕松擴展;

    通過Playbooks來定制強大的配置、狀態管理;

    對云計算平臺、大數據都有很好的支持;

    提供一個功能強大、操作性強的Web管理界面和REST API接口——AWX平臺。

    冪等性:一種操作重復多次結果相同
    輕量級:無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
    支持腳本:批量任務執行可以寫成腳本,而且不用分發到遠程就可以執行;
    基于python:使用python編寫,維護更簡單,ruby語法過于復雜;
    支持sudo:可以在無root權限的情況下完成任務。
    網上提供大量playbook,roles供使用

ansible架構


QQ圖片20161116111536.png-155.9kB

Ansible:Ansible的核心程序  Host
 Lnventory:記錄了每一個由Ansible管理的主機信息,信息包括ssh端口,root帳號密碼,ip地址等等??梢酝ㄟ^file來加載,可以通過CMDB加載

Playbooks:YAML格式文件,多個任務定義在一個文件中,使用時可以統一調用,“劇本”用來定義那些主機需要調用那些模塊來完成的功能.

Core
 Modules:ansible核心模塊,Ansible執行任何管理任務都不是由Ansible自己完成,而是由核心模塊完成;Ansible管理主機之前,先調用core
 Modules中的模塊,然后指明管理Host Lnventory中的主機,就可以完成管理主機。

Custom Modules:自定義模塊,完成Ansible核心模塊無法完成的功能,此模塊支持任何語言編寫。

Connection Plugins:連接插件,Ansible和Host通信使用
 插件(plugins):完成模塊功能的補充,借助于插件完成記錄日志、郵件等功能。
 Ansible采用paramiko協議庫(Fabric也使用這個),通過SSH或者ZeroMQ等連接主機。
 Ansible在控制主機將Ansible模塊通過SSH協議(或者Kerberos、LDAP)推送到被管節點執行,執行完之后自動刪除,可以使用SVN等來管理自定義模塊及編排。排。從上圖可以了解到,控制主機與被管節點之間支持local、SSH、ZeroMQ三種連接方式,默認使用基于SSH的連接。在規模較大的情況下使用ZeroMQ連接方式會明顯改善執行速度。


ansible任務執行模式

Ansible系統由控制主機對被管節點的操作方式可分為兩類,即ad-hoc和playbook:

·ad-hoc模式使用單個模塊,支持批量執行單條命令。

·playbook模式是Ansible主要管理方式,也是Ansible功能強大的關鍵所在。playbook通過多個task集合完成一類功能,如Web服務的安裝部署、數據庫服務器的批量備份等??梢院唵蔚匕裵laybook理解為通過組合多條ad-hoc操作作的配置文件。

QQ圖片20161114153134.png-209.1kB

ansible安裝


ansible信息:
[root@cloud ~]# yum info ansible
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
 * base: centos.01link.hk
 * epel: free.nchc.org.tw
 * extras: centos.01link.hk
 * updates: centos.01link.hk
Available Packages
Name        : ansible
Arch        : noarch
Version     : 2.1.2.0
Release     : 1.el6
Size        : 3.5 M
Repo        : epel
Summary     : SSH-based configuration management, deployment, and task execution system
URL         : http://ansible.com
License     : GPLv3+
Description : 
            : Ansible is a radically simple model-driven configuration management,
            : multi-node deployment, and remote task execution system. Ansible works
            : over SSH and does not require any software or daemons to be installed
            : on remote nodes. Extension modules can be written in any language and
            : are transferred to managed machines automatically.
ansible安裝:
yum install ansible -y
如果yum報錯找不到,則嘗試添加epel源:
 yum install epel* -y
安裝生成如下文件:
[root@cloud ~]# rpm -ql ansible |head -n 20
/etc/ansible
/etc/ansible/ansible.cfg
/etc/ansible/hosts
/etc/ansible/roles
/usr/bin/ansible
/usr/bin/ansible-console
/usr/bin/ansible-doc
/usr/bin/ansible-galaxy
/usr/bin/ansible-playbook
/usr/bin/ansible-pull
/usr/bin/ansible-vault
/usr/lib/python2.6/site-packages/ansible
#輸出內容過多 省略
其中程序文件為:
/etc/ansible  #ansible主程序
/usr/bin/ansible-doc  #ansible文檔查看器
/usr/bin/ansible-galaxy 
#你可以把他理解成ansible的pip,可以從galaxy.ansible.com下載官方收錄的playbooks
/usr/bin/ansible-playbook #playbook就是 用這個跑的
/usr/bin/ansible-pull  #支持直接從git下載playbook執行,需要遵循其規定的目錄格式。
/usr/bin/ansible-vault 
# 如果你的配置文件中含有敏感信息,你可能并不希望他能被人看到,vault可以幫你加密/解密這個配置文件,高級用法,請參照http://blog.ansibleworks.com/2014/02/19/ansible-vault/
其中生成的配置文件為:
[root@cloud ~]# rpm -qc ansible 
/etc/ansible/ansible.cfg  #ansible主配置文件
/etc/ansible/hosts  # ansible主機列表

ansible 配置文件


ansible配置文件加載順序:
    ansible配置文件是以ini格式存儲配置數據的,在Ansible中,幾乎所有的配置項都可以通過
    Ansible的playbook或環境變量來重新賦值。在運行Ansible命令時,命令將會按照預先設定的順         序查找配置文件,如下所示:
    (1)ANSIBLE_CONFIG:首先,Ansible命令會檢查環境變量,及這個環境變量將指向的配置文件。
    (2)/ansible.cfg:接著ansible會當前目錄下的./ansible.cfg文件
    (3)~/.ansible.cfg:接著檢查當前用戶home目錄下的.ansible.cfg文件
    (4)/etc/ansible/ansible.cfg:最后會檢查/etc/ansible/ansible.cfg
注意:如果你通過發行版的提供的軟件包管理工具(yum之類的)或者pip安裝的ansible,那么在你的
/etc/ansible目錄下已經有了ansible.cfg配置文件,如果你是通過GitHub倉庫安裝的,在你復制的倉庫中examples目錄下可以找到ansible.cfg,你可以把它拷貝到/etc/ansible目錄下。

ansible配置選項:


可以使用環境變量的方式來進行配置:
     大多數的ansible參數都可以通過使用帶有ANSIBLE_開頭的環境變量進行配置,參數名稱必須都是大寫字母。比如:
     export ANSIBLE_SUDO_USER=root
     設置了環境變量之后,ANSIBLE_SUDO_USER就可以在playbook中直接引用。


設置ansible.cfg配置參數,ansible有許多參數,下面列出常用的參數:
     inventory:
             這個參數表示資源清單inventory文件的位置,資源清單就是一些Ansible需要連接管理的主             機列表。這個參數的配置實例如下:
         inventory = /etc/ansible/hosts
 library:Ansible的操作動作,無論是本地或遠程,都使用一小段代碼來執行,這小段代碼稱為模塊,這個library參數就是指向存放Ansible模塊的目錄。配置實例如下:
  library = /usr/share/ansible
  Ansible支持多個目錄方式,只要用冒號(:)隔開就可以,同時也會檢查當前執行playbook位置下的./library目錄。
     forks:
         設置默認情況下Ansible最多能有多少個進程同時工作,
         從Ansible 1.3開始,fork數量默認自動設置為主機數量或者潛在的主機數量,默認設置最多5個進         程并行處理。具體需要設置多少個,可以根據控制主機的性能和被管節點的數量來確定,可能是
         50或100。默認值5是非常保守的值,配置實例如下:
                         forks = 5
     sudo_user:
         這是設置默認執行命令的用戶,也可以在playbook中重新設置這個參數。配置實例如下:

            sudo_user = root
remote_port:
    這是指定連接被管節點的管理端口,默認是22。除非設置了特殊的SSH端口,不然這個參數一般是         不需要修改的。配置實例如下:

        remote_port = 22
host_key_checking:
    這是設置是否檢查SSH主機的密鑰??梢栽O置為True或False,配置實例如下:
        host_key_checking = False
timeout:
    這是設置SSH連接的超時間隔,單位是秒。配置實例如下:
            timeout = 60
log_path:
    Ansible系統默認是不記錄日志的,如果想把Ansible系統的輸出記錄到日志文件中,需要設置log_path來指定一個存儲Ansible日志的文件。配置實例如下:
    log_path = /var/log/ansible.log
  另外需要注意,執行Ansible的用戶需要有寫入日志的權限,模塊將會調用被管節點的syslog來記錄,口令是不會出現在日志中的。

配置ansible使用公鑰驗證

    雖然ansible支持其他主機認證方式,但是我們最常用的的還是基于秘鑰的認證:

1、首先生成秘鑰

ssh-keygen -N ''
或者:
ssh-keygen -P '' -f ~/.ssh/id_rsa -t rsa

2、然后向主機分發秘鑰:

 ssh-copy-id root@  #@后面跟主機名或者IP地址

3、如果出現以下情況:

# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.1.6.72    
-bash: ssh-copy-id: command not found

請嘗試:

yum -y install openssh-clients

ansible命令使用說明
 命令格式:

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

我們可以通過 ansible -h查看幫助

Usage: ansible <host-pattern> [options]

Options:
  -a MODULE_ARGS, --args=MODULE_ARGS    模塊的參數,如果執行默認COMMAND的模塊,即是命令參數,如:“date”,"pwd"等等
                        module arguments    模塊參數
  -k, --ask-pass        ask for SSH password  登錄密碼,提示輸入SSH密碼而不是假設基于密鑰的驗證
  --ask-su-pass         ask for su password    su切換密碼
  -K, --ask-sudo-pass   ask for sudo password  提示密碼使用sudo,sudo表示提權操作
  --ask-vault-pass      ask for vault password
  -B SECONDS, --background=SECONDS     后臺運行超時時間
                        run asynchronously, failing after X seconds
                        (default=N/A)
  -C, --check           don't make any changes; instead, try to predict some    只是測試一下會改變什么內容,不會真正去執行;相反,試圖預測一些可能發生的變化
                        of the changes that may occur
  -c CONNECTION, --connection=CONNECTION   連接類型使用??赡艿倪x項是paramiko(SSH),SSH和地方。當地主要是用于crontab或啟動。
                        connection type to use (default=smart)
  -f FORKS, --forks=FORKS   并行任務數。NUM被指定為一個整數,默認是5
                        specify number of parallel processes to use
                        (default=5)
  -h, --help            show this help message and exit   打開幫助文檔API
  -i INVENTORY, --inventory-file=INVENTORY    指定庫存主機文件的路徑,默認為/etc/ansible/hosts
                        specify inventory host file
                        (default=/etc/ansible/hosts)
  -l SUBSET, --limit=SUBSET    進一步限制所選主機/組模式  --limit=192.168.91.135 只對這個ip執行
                        further limit selected hosts to an additional pattern
  --list-hosts          outputs a list of matching hosts; does not execute
                        anything else
  -m MODULE_NAME, --module-name=MODULE_NAME   執行模塊的名字,默認使用 command 模塊,所以如果是只執行單一命令可以不用 -m參數
                        module name to execute (default=command)
  -M MODULE_PATH, --module-path=MODULE_PATH    要執行的模塊的路徑,默認為/usr/share/ansible/
                        specify path(s) to module library
                        (default=/usr/share/ansible/)
  -o, --one-line        condense output      壓縮輸出,摘要輸出.嘗試一切都在一行上輸出。
  -P POLL_INTERVAL, --poll=POLL_INTERVAL    調查背景工作每隔數秒。需要- b
                        set the poll interval if using -B (default=15)
  --private-key=PRIVATE_KEY_FILE    私鑰路徑,使用這個文件來驗證連接
                        use this file to authenticate the connection
  -S, --su              run operations with su    用 su 命令
  -R SU_USER, --su-user=SU_USER      指定SU的用戶,默認是root用戶
                        run operations with su as this user (default=root)
  -s, --sudo            run operations with sudo (nopasswd)    
  -U SUDO_USER, --sudo-user=SUDO_USER    sudo到哪個用戶,默認為 root  
                        desired sudo user (default=root)
  -T TIMEOUT, --timeout=TIMEOUT    指定SSH默認超時時間,  默認是10S
                        override the SSH timeout in seconds (default=10)
  -t TREE, --tree=TREE  log output to this directory     將日志內容保存在該輸出目錄,結果保存在一個文件中在每臺主機上。
  -u REMOTE_USER, --user=REMOTE_USER    遠程用戶, 默認是root用戶
                        connect as this user (default=root)
  --vault-password-file=VAULT_PASSWORD_FILE  
                        vault password file
  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable    詳細信息
                        connection debugging)
  --version             show program's version number and exit   輸出ansible的版本

ansible主機清單設置
     編輯/etc/ansible/hosts:

#vim /etc/ansible/hosts

定義方式:
1、直接指明主機地址或主機名:

www.desperadochn.vip  192.1682.125

2、定義一個主機組[組名]把地址或主機名加進去

[mysql_test]
192.168.253.159
192.168.253.160
192.168.253.153  
#組成員可以使用通配符來匹配,如下  
192.168.2.[1:6]  #表示匹配從192.168.2.1——192.168.2.6的主機

3、如果你沒有使用公鑰,想要使用密碼,你也可以這樣寫(適用于第一次登陸控制):

  格式:【主機名】 【主機地址】 【主機密碼】  默認是root用戶來進行的

  [keepalived]
  keepalived1  ansible_ssh_host=192.168.146.136 ansible_ssh_pass="test"
  keepalived2  ansible_ssh_host=192.168.146.137 ansible_ssh_pass="test"

ansible-doc


一般用法:

ansible-doc -l 獲取模塊信息

ansible-doc -s MOD_NAME 獲取指定模塊的使用幫助


查看 ansible-doc 的使用說明:

# ansible-doc  -h
Usage: ansible-doc [options] [module...]

Options:
  -h, --help            show this help message and exit  # 顯示命令參數API文檔
  -l, --list            List available modules  #列出可用的模塊
  -M MODULE_PATH, --module-path=MODULE_PATH   #指定模塊的路徑
                        specify path(s) to module library (default=None)
  -s, --snippet         Show playbook snippet for specified module(s)  
  #顯示playbook制定模塊的用法
  --version             show program's version number and exit  #  顯示ansible-doc的版本號

查看模塊列表:

# ansible-doc -l

查看指定模塊參數(舉例):

[root@ansiable ~]# ansible-doc -s mysql_replication
- name: Manage MySQL replication
  action: mysql_replication
      config_file            # Specify a config file from which user and password are to be read
      connect_timeout        # The connection timeout when connecting to the MySQL server.
      login_host             # Host running the database
      login_password         # The password used to authenticate with
      login_port             # Port of the MySQL server. Requires login_host be defined as other then localhost if login_port is used
      login_unix_socket      # The path to a Unix domain socket for local connections
      login_user             # The username used to authenticate with
      master_auto_position   # does the host uses GTID based replication or not
      master_connect_retry   # same as mysql variable
      master_host            # same as mysql variable
      master_log_file        # same as mysql variable
      master_log_pos         # same as mysql variable
      master_password        # same as mysql variable
      master_port            # same as mysql variable
      master_ssl             # same as mysql variable
      master_ssl_ca          # same as mysql variable
      master_ssl_capath      # same as mysql variable
      master_ssl_cert        # same as mysql variable
      master_ssl_cipher      # same as mysql variable
      master_ssl_key         # same as mysql variable
      master_user            # same as mysql variable
      mode                   # module operating mode. Could be getslave (SHOW SLAVE STATUS), getmaster (SHOW MASTER STATUS), changemaster (CHANGE MASTER TO), startslave (START SLAVE), stopslave (STOP SLAVE), resetslave (RESET SLAVE), resetslaveall (RESET SLAVE ALL)
      relay_log_file         # same as mysql variable
      relay_log_pos          # same as mysql variable
      ssl_ca                 # The path to a Certificate Authority (CA) certificate. This option, if used, must specify the same certificate as used by the server.
      ssl_cert               # The path to a client public key certificate.
      ssl_key                # The path to the client private key.

ansible ad-hoc實戰

1、主機連通性測試:

 #ansible all -m ping

執行效果如下:

[root@desperadochn ~]# ansible all -m ping
192.168.253.138 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.253.137 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

2、command:在遠程主機執行命令;不支持|管道命令

[root@desperadochn ~]# ansible all -m command -a 'ifconfig'
192.168.253.137 | SUCCESS | rc=0 >>
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.253.137  netmask 255.255.255.0  broadcast 192.168.253.255
        inet6 fe80::20c:29ff:fef6:313f  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:f6:31:3f  txqueuelen 1000  (Ethernet)
        RX packets 296  bytes 97349 (95.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 267  bytes 78840 (76.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
192.168.253.138 | SUCCESS | rc=0 >>
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.253.138  netmask 255.255.255.0  broadcast 192.168.253.255
        inet6 fe80::20c:29ff:fe63:6347  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:63:63:47  txqueuelen 1000  (Ethernet)
        RX packets 248  bytes 93662 (91.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 213  bytes 40660 (39.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@ansiable ~]# ansible webservers -m command -a 'cat /etc/passwd |grep "root"'  #實驗結果可見 不支持管道
192.168.253.142 | FAILED | rc=1 >>
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
#輸出結果過多省略
192.168.253.151 | FAILED | rc=1 >>
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
#輸出結果過多省略

3、shell模塊在遠程主機上調用shell解釋器運行命令,支持shell的各種功能,例如管道等 :

[root@ansiable ~]# ansible webservers -m shell -a 'cat /etc/passwd |grep "root"'
192.168.253.142 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

192.168.253.151 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

ps:當你不熟悉ansible模塊時可以用這個模塊,就和你在shell下操作差不多

4、copy:復制文件到遠程主機,可以改權限等


用法:
(1) 復制文件
   -a "src=  dest=  "
(2) 給定內容生成文件
       -a "content=  dest=  "

[root@ansiable ~]# ansible webservers -m copy -a 'content="hello\nworld" dest=/tmp/test.ansible mode=666'
192.168.253.151 | SUCCESS => {
    "changed": true, 
    "checksum": "7db827c10afc1719863502cf95397731b23b8bae", 
    "dest": "/tmp/test.ansible", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "9195d0beb2a889e1be05ed6bb1954837", 
    "mode": "0666", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 11, 
    "src": "/root/.ansible/tmp/ansible-tmp-1476904825.49-108215123145144/source", 
    "state": "file", 
    "uid": 0
}
192.168.253.142 | SUCCESS => {
    "changed": true, 
    "checksum": "7db827c10afc1719863502cf95397731b23b8bae", 
    "dest": "/tmp/test.ansible", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "9195d0beb2a889e1be05ed6bb1954837", 
    "mode": "0666", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 11, 
    "src": "/root/.ansible/tmp/ansible-tmp-1476904825.52-218080449424453/source", 
    "state": "file", 
    "uid": 0
}
[root@ansiable ~]# ansible webservers -m shell -a 'cat /tmp/test.ansible'
192.168.253.142 | SUCCESS | rc=0 >>
hello
world

192.168.253.151 | SUCCESS | rc=0 >>
hello
world

相關選項如下: backup:在覆蓋之前,將源文件備份,備份文件包含時間信息。有兩個選項:yes|no
 content:用于替代“src”,可以直接設定指定文件的值
 dest:必選項。要將源文件復制到的遠程主機的絕對路徑,如果源文件是一個目錄,那么該路徑也必須是個目錄
 directory_mode:遞歸設定目錄的權限,默認為系統默認權限
 force:如果目標主機包含該文件,但內容不同,如果設置為yes,則強制覆蓋,如果為no,則只有當目標主機的目標位置不存在該文件時,才復制。默認為yes
 others:所有的file模塊里的選項都可以在這里使用
 src:被復制到遠程主機的本地文件,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它將遞歸復制。在這種情況下,如果路徑使用“/”來結尾,則只復制目錄里的內容,如果沒有使用“/”來結尾,則包含目錄在內的整個內容全部復制,類似于rsync。


5、file 設置文件屬性:
創建目錄:-a "path= state=directory"
創建鏈接文件:-a "path= src=   state=link"
刪除文件:-a "path=   state=absent"

[root@ansiable ~]# ansible webservers -m file -a 'path=/tmp/test state=directory'
192.168.253.151 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/tmp/test", 
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}
192.168.253.142 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/tmp/test", 
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}
[root@ansiable ~]# ansible webservers -m shell -a 'ls -ld /tmp/test'
192.168.253.142 | SUCCESS | rc=0 >>
drwxr-xr-x. 2 root root 6 10月 17 02:46 /tmp/test

192.168.253.151 | SUCCESS | rc=0 >>
drwxr-xr-x. 2 root root 6 10月 17 02:21 /tmp/test

其他選項如下:

force:需要在兩種情況下強制創建軟鏈接,一種是源文件不存在,但之后會建立的情況下;另一種是目標軟鏈接已存在,需要先取消之前的軟鏈,然后創建新的軟鏈,有兩個選項:yes|no
 group:定義文件/目錄的屬組 mode:定義文件/目錄的權限 owner:定義文件/目錄的屬主 path:必選項,定義文件/目錄的路徑
 recurse:遞歸設置文件的屬性,只對目錄有效 src:被鏈接的源文件路徑,只應用于state=link的情況
 dest:被鏈接到的路徑,只應用于state=link的情況 state:
        directory:如果目錄不存在,就創建目錄
        file:即使文件不存在,也不會被創建
        link:創建軟鏈接
        hard:創建硬鏈接
        touch:如果文件不存在,則會創建一個新的文件,如果文件或目錄已存在,則更新其最后修改時間
        absent:刪除目錄、文件或者取消鏈接文件

6、fetch從遠程某主機獲取文件到本地:


dest:用來存放文件的目錄,例如存放目錄為backup,源文件名稱為/etc/profile在主機pythonserver中,那么保存為/backup/pythonserver/etc/profile
 Fail_on_missing:當源文件不存在的時候,標識為失敗
 Flat:允許覆蓋默認行為從hostname/path到/file的,如果dest以/結尾,它將使用源文件的基礎名稱
 Src:在遠程拉取的文件,并且必須是一個file,不能是目錄 Validate_checksum:當文件fetch之后進行md5檢查


實例:

[root@ansiable ~]# ansible webservers -m fetch -a 'src=/var/log/messages dest=/root'
192.168.253.142 | SUCCESS => {
    "changed": true, 
    "checksum": "5b28cfc1e2926a64441fa3a7e3a6968fe3cdb416", 
    "dest": "/root/192.168.253.142/var/log/messages", 
    "md5sum": "f843282c8246d545ef07205d5094ada7", 
    "remote_checksum": "5b28cfc1e2926a64441fa3a7e3a6968fe3cdb416", 
    "remote_md5sum": null
}
192.168.253.151 | SUCCESS => {
    "changed": true, 
    "checksum": "42e78594b997f0a5881a8d58451984830176d4b7", 
    "dest": "/root/192.168.253.151/var/log/messages", 
    "md5sum": "3fee43ed3aa7c344be6a7527363bf8be", 
    "remote_checksum": "42e78594b997f0a5881a8d58451984830176d4b7", 
    "remote_md5sum": null
}
[root@ansiable ~]# pwd
/root[root@ansiable ~]# pwd
/root[root@ansiable ~]# pwd
/root

[root@ansiable ~]# ll
總用量 5264
drwxr-xr-x. 3 root root      16 10月 20 04:08 192.168.253.142
drwxr-xr-x. 3 root root      16 10月 20 04:08 192.168.253.151
-rw-------. 1 root root     927 10月  6 09:37 anaconda-ks.cfg
-rw-r--r--. 1 root root    7786 10月 16 23:25 hellodb.sql
drwxr-xr-x. 2 root root      26 10月 16 15:05 inventory
-rw-r--r--. 1 root root      76 10月 16 15:05 inventory.cfg
-rw-r--r--. 1 root root     699 10月 16 14:36 my.cnf
-rw-r--r--. 1 root root    2471 10月 19 23:18 nginx.conf
-rw-r--r--. 1 root root 5361532 10月 16 23:25 percona-xtrabackup-2.3.4-1.el7.x86_64.rpm
-rw-r--r--. 1 root root     749 10月 19 23:25 test.yml

[root@ansiable 192.168.253.142]# tree /root/192.168.253.142/
/root/192.168.253.142/
└── var
    └── log
        └── messages

2 directories, 1 file

7、cron 管理cron計劃任務:


  • a "": 設置管理節點生成定時任務
     action: cron backup=    # 如果設置,創建一個crontab備份  
     cron_file=          #如果指定, 使用這個文件cron.d,而不是單個用戶
     crontab day=       #日應該運行的工作( 1-31, *, */2,  )  
     hour=      # 小時 ( 0-23, *, */2, )
     job=       #指明運行的命令是什么  
     minute=    #分鐘( 0-59, *, */2, )  
     month=     # 月( 1-12, *, /2,  )  
     name=     #定時任務描述  
     reboot    # 任務在重啟時運行,不建議使用,建議使用special_time  
     special_time       #特殊的時間范圍,參數:reboot(重啟時),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小時)
     state        #指定狀態,prsent表示添加定時任務,也是默認設置,absent表示刪除定時任務
     user         # 以哪個用戶的身份執行  
     weekday      # 周 ( 0-6 for Sunday-Saturday,
    ,  )

[root@ansiable ~]#  ansible mysql_test -m cron -a 'name="sync time from ntpserver" minute="*/10" job="/sbin/ntpdate  asia.pool.ntp.org &>/dev/null" '
192.168.253.153 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "sync time from ntpserver"
    ]
}
192.168.253.160 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "sync time from ntpserver"
    ]
}
192.168.253.159 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "sync time from ntpserver"
    ]
}
[root@ansiable ~]#  ansible mysql_test -m shell -a 'ntpdate asia.pool.ntp.org'  #手動與遠程時間服務器對時
192.168.253.160 | SUCCESS | rc=0 >>
19 Oct 11:27:44 ntpdate[15538]: adjust time server 157.7.208.12 offset 0.062686 sec

192.168.253.153 | SUCCESS | rc=0 >>
19 Oct 11:27:44 ntpdate[13818]: step time server 157.7.208.12 offset 69154.488409 sec

192.168.253.159 | SUCCESS | rc=0 >>
19 Oct 11:27:45 ntpdate[15592]: adjust time server 157.7.208.12 offset 0.062411 sec
[root@ansiable ~]# ansible mysql_test -m shell -a 'date'   #查看時間是否一致
192.168.253.153 | SUCCESS | rc=0 >>
2016年 10月 19日 星期三 11:31:52 CST

192.168.253.159 | SUCCESS | rc=0 >>
2016年 10月 19日 星期三 11:31:52 CST

192.168.253.160 | SUCCESS | rc=0 >>
2016年 10月 19日 星期三 11:31:52 CST
[root@ansiable ~]# ansible mysql_test -m shell -a 'crontab -l'   #查看是否啟用時間同步的計劃任務
192.168.253.153 | SUCCESS | rc=0 >>
#Ansible: sync time from ntpserver
*/10 * * * * /sbin/ntpdate  asia.pool.ntp.org &>/dev/null

192.168.253.160 | SUCCESS | rc=0 >>
#Ansible: sync time from ntpserver
*/10 * * * * /sbin/ntpdate  asia.pool.ntp.org &>/dev/null

192.168.253.159 | SUCCESS | rc=0 >>
#Ansible: sync time from ntpserver
*/10 * * * * /sbin/ntpdate  asia.pool.ntp.org &>/dev/null

8、yum yum安裝軟件,也可以使用apt,zypper等工具:


conf_file         #設定遠程yum安裝時所依賴的配置文件。如配置文件沒有在默認的位置。

disable_gpg_check    #是否禁止GPG checking,只用于`present' or `latest'。

disablerepo   #臨時禁止使用yum庫。 只用于安裝或更新時。

enablerepo    #臨時使用的yum庫。只用于安裝或更新時。

name=            #所安裝的包的名稱

state               #present安裝, latest安裝最新的, absent 卸載軟件。

update_cache  #強制更新yum的緩存。
[root@ansiable ~]# ansible webservers -m yum -a 'name=htop state=present'  #安裝個htop試試
192.168.253.142 | SUCCESS => {
    "changed": true, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirrors.tuna.tsinghua.edu.cn\n * epel: mirrors.tuna.tsinghua.edu.cn\n * extras: mirror.bit.edu.cn\n * updates: mirror.bit.edu.cn\nResolving Dependencies\n--> Running transaction check\n---> Package htop.x86_64 0:2.0.2-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version                Repository       Size\n================================================================================\nInstalling:\n htop            x86_64            2.0.2-1.el7            epel             98 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 98 k\nInstalled size: 207 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : htop-2.0.2-1.el7.x86_64                                      1/1 \n  Verifying  : htop-2.0.2-1.el7.x86_64                                      1/1 \n\nInstalled:\n  htop.x86_64 0:2.0.2-1.el7                                                     \n\nComplete!\n"
    ]
}
192.168.253.151 | SUCCESS => {
    "changed": true, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirrors.163.com\n * epel: repo.fedoralinux.ir\n * extras: mirrors.cn99.com\n * updates: centos.ustc.edu.cn\nResolving Dependencies\n--> Running transaction check\n---> Package htop.x86_64 0:2.0.2-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version                Repository       Size\n================================================================================\nInstalling:\n htop            x86_64            2.0.2-1.el7            epel             98 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 98 k\nInstalled size: 207 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : htop-2.0.2-1.el7.x86_64                                      1/1 \n  Verifying  : htop-2.0.2-1.el7.x86_64                                      1/1 \n\nInstalled:\n  htop.x86_64 0:2.0.2-1.el7                                                     \n\nComplete!\n"
    ]
}
[root@ansiable ~]# ansible webservers -m shell -a 'htop'   #成功
192.168.253.151 | SUCCESS | rc=0 >>


192.168.253.142 | SUCCESS | rc=0 >>

9、service: 服務程序管理


arguments         #命令行提供額外的參數  
 enabled           #設置開機啟動。  
 name=        #服務名稱  
 runlevel          #開機啟動的級別,一般不用指定。  
 sleep             #在重啟服務的過程中,是否等待。如在服務關閉以后等待2秒再啟動。  
 state     #started啟動服務, stopped停止服務, restarted重啟服務, reloaded重載配置


啟動nginx服務并設置范圍自啟動:

[root@ansiable ~]# ansible webservers -m service -a 'name=nginx state=started enabled=true'
192.168.253.142 | SUCCESS => {
    "changed": false, 
    "enabled": true, 
    "name": "nginx", 
    "state": "started"
}
192.168.253.151 | SUCCESS => {
    "changed": false, 
    "enabled": true, 
    "name": "nginx", 
    "state": "started"
}

10、User 用戶管理:


-a "" action: user comment    # 用戶的描述信息  
 createhom  # 是否創建家目錄  
 force      # 在使用state=absent'是, 行為與userdel –force'一致.  
 group      # 指定基本組  
 groups     # 指定附加組,如果指定為('groups=')表示刪除所有組  
 home       # 指定用戶家目錄
 login_class     #可以設置用戶的登錄類 FreeBSD, OpenBSD and NetBSD系統.  
 move_home
   # 如果設置為home='時, 試圖將用戶主目錄移動到指定的目錄  
 name=           # 指定用戶名  
 non_unique      # 該選項允許改變非唯一的用戶ID值  
 password        # 指定用戶密碼  
 remove          # 在使用
state=absent'時, 行為是與 `userdel –remove'一致.
 shell           #指定默認shell  
 state           #設置帳號狀態,不指定為創建,指定值為absent表示刪除  
 system        # 當創建一個用戶,設置這個用戶是系統用戶。這個設置不能更改現有用戶。  
 uid             #指定用戶的uid  
 update_password  # 更新用戶密碼  
 expires         #指明密碼的過期時間


創建用戶baibudonghei并添加密碼,uid為1234

[root@ansiable ~]# ansible webservers -m user -a 'name=baibudonghei uid=1234 password=321654RESTa'
192.168.253.151 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "createhome": true, 
    "group": 1234, 
    "home": "/home/baibudonghei", 
    "name": "baibudonghei", 
    "password": "NOT_LOGGING_PASSWORD", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1234
}
192.168.253.142 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "createhome": true, 
    "group": 1234, 
    "home": "/home/baibudonghei", 
    "name": "baibudonghei", 
    "password": "NOT_LOGGING_PASSWORD", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1234
}
[root@ansiable ~]# ansible webservers -m shell -a 'id baibudonghei'
192.168.253.151 | SUCCESS | rc=0 >>
uid=1234(baibudonghei) gid=1234(baibudonghei) 組=1234(baibudonghei)

192.168.253.142 | SUCCESS | rc=0 >>
uid=1234(baibudonghei) gid=1234(baibudonghei) 組=1234(baibudonghei)

11、group組管理:


gid       # 設置組的GID號
name=     # 管理組的名稱
state     # 指定組狀態,默認為創建,設置值為absent為刪除
system    # 設置值為yes,表示為創建系統組

創建名為desperadousa的組并設置gid為6666

[root@ansiable ~]# ansible webservers -m group -a 'name=desperadousa gid=6666 '
192.168.253.142 | SUCCESS => {
    "changed": true, 
    "gid": 6666, 
    "name": "desperadousa", 
    "state": "present", 
    "system": false
}
192.168.253.151 | SUCCESS => {
    "changed": true, 
    "gid": 6666, 
    "name": "desperadousa", 
    "state": "present", 
    "system": false
}
[root@ansiable ~]# ansible webservers -m shell -a 'cat /etc/group'
192.168.253.151 | SUCCESS | rc=0 >>
root:x:0:
bin:x:1:
#中間因篇幅問題省略部分
zabbix:x:992:
baibudonghei:x:1234:
desperadousa:x:6666:

192.168.253.142 | SUCCESS | rc=0 >>
root:x:0:
bin:x:1:
#中間因篇幅問題省略部分
zabbix:x:992:
baibudonghei:x:1234:
desperadousa:x:6666:

12、setup:獲取指定主機的facts。


facts組件是Ansible用于采集被管機器設備信息的一個功能,我們可以使用setup模塊查機器的所有facts信息,可以使用filter來查看指定信息。整個facts信息被包裝在一個JSON格式的數據結構中,ansible_facts是最上層的值。
 facts就是變量,內建變量 。每個主機的各種信息,cpu顆數、內存大小等。會存在facts中的某個變量中。調用后返回很多對應主機的信息,在后面的操作中可以根據不同的信息來做不同的操作。如redhat系列用yum安裝,而debian系列用apt來安裝軟件。


獲取主機變量:

[root@ansiable ~]# ansible webservers -m setup
192.168.253.151 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.253.151"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::20c:29ff:fe56:5671"
        ], 
        "ansible_architecture": "x86_64", 
        "ansible_bios_date": "07/31/2013", 
        "ansible_bios_version": "6.00", 
        "ansible_cmdline": {
            "BOOT_IMAGE": "/vmlinuz-3.10.0-327.el7.x86_64", 
            "LANG": "zh_CN.UTF-8", 
            "crashkernel": "auto", 
            "quiet": true, 
            "rd.lvm.lv": "centos/swap", 
            "rhgb": true, 
            "ro": true, 
            "root": "/dev/mapper/centos-root"
        }, 
      #中間因篇幅問題省略n行
        "ansible_userspace_bits": "64", 
        "ansible_virtualization_role": "guest", 
        "ansible_virtualization_type": "VMware", 
        "module_setup": true
    }, 
    "changed": false
}
192.168.253.142 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.253.142"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::20c:29ff:fe56:217b"
        ], 
        "ansible_architecture": "x86_64", 
        "ansible_bios_date": "07/31/2013", 
        "ansible_bios_version": "6.00", 
        "ansible_cmdline": {
            "BOOT_IMAGE": "/vmlinuz-3.10.0-327.el7.x86_64", 
            "LANG": "zh_CN.UTF-8", 
            "crashkernel": "auto", 
            "quiet": true, 
            "rd.lvm.lv": "centos/swap", 
            "rhgb": true, 
            "ro": true, 
            "root": "/dev/mapper/centos-root"
        }, 
       #中間省略n行
        "ansible_system_capabilities_enforced": "True", 
        "ansible_system_vendor": "VMware, Inc.", 
        "ansible_uptime_seconds": 28593, 
        "ansible_user_dir": "/root", 
        "ansible_user_gecos": "root", 
        "ansible_user_gid": 0, 
        "ansible_user_id": "root", 
        "ansible_user_shell": "/bin/bash", 
        "ansible_user_uid": 0, 
        "ansible_userspace_architecture": "x86_64", 
        "ansible_userspace_bits": "64", 
        "ansible_virtualization_role": "guest", 
        "ansible_virtualization_type": "VMware", 
        "module_setup": true
    }, 
    "changed": false
}

13、script 發送腳本到各被管理節點,并執行。不需要參數


發送腳本test.py至遠程主機并執行:

[root@ansiable ~]# cat test.py 
#!/usr/bin/python
print("hellow world")
[root@ansiable ~]# ansible webservers -m script -a 'test.py'
192.168.253.151 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "", 
    "stdout": "hellow world\r\n", 
    "stdout_lines": [
        "hellow world"
    ]
}
192.168.253.142 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "", 
    "stdout": "hellow world\r\n", 
    "stdout_lines": [
        "hellow world"
    ]
}

小結

ansible的出現確實省去了許多繁瑣的工作,作為一個運維狗必須好好學習,下一次會寫一篇ad-hoc實戰配服務的博文。

參考文獻
http://www.www58058.com/58381   《Ansible 詳細用法說明》 作者:qzx
《ansible自動化運維技術與最佳實踐》  作者:陳金窗 沈燦 劉政委

原創文章,作者:Net17_desperado,如若轉載,請注明出處:http://www.www58058.com/59472

(0)
Net17_desperadoNet17_desperado
上一篇 2016-11-21
下一篇 2016-11-21

相關推薦

  • Quota和RAID

    高級文件系統管理 磁盤配額 quota 限制用戶在某個分區的容量,創建數目的多少!一般實施在家目錄 /home 下來限制用戶的占用空間 限制某一群組所能使用的最大磁盤配額  (使用群組限制): 限制某一用戶的最大磁盤配額  (使用用戶限制):它僅能針對整個文件系統來進行設計,無法針對某個單一的目錄來設計它的磁盤配額。 限制某一目錄 &nb…

    Linux干貨 2016-09-01
  • vim功能及使用

    vim 簡介:   vi命令是UNIX操作系統和類UNIX操作系統中最通用的全屏幕純文本編輯器。Linux中的vi編輯器叫vim,它是vi的增強版(vi Improved),與vi編輯器完全兼容,而且實現了很多增強功能。 文本編輯種類: 行編輯器: sed全屏編輯器:nano, vivim – Vi Improved 一、基本操作語法 vim [OPTION…

    Linux干貨 2016-08-11
  • Linux上文件管理類命令實例講解

    下面介紹三個文件cp, mv, rm管理命令: cp命令:copy,復制命令 命令格式: cp 源文件 目標文件 復制又分為單源復制和多源復制兩種情況: 單源復制 如果目標文件不存在,創建此文件,并復制數據流到此文件; [root@localhost tmp]# cp yum.log ok [root@localhost tmp]# ls -l total …

    Linux干貨 2018-02-28
  • 文本處理、正則表達式、cut、grep、egrep、fgrep

    文本處理、正則表達式、cut、grep、egrep、fgrep Linux中文本處理工具最常用的就是文本處理三劍客grep、sed、awk再配合正則表達式,可以實現足夠多的文本處理功能。工具的強大之處是因為使用它的人,如何才能發揮文本處理工具的作用呢?答案就是正則表達式,其實正則表達式,只是一種思想,一種表示方法,只要我們使用的工具支持表示這種思想那么這個工…

    Linux干貨 2016-08-07
  • 查找find及壓縮與解壓

    find  根據時間戳:以“天”為單位;              -atime [+|-]#,                #: [#,#+1)   2 那就是大于等于二天小于…

    2017-08-12
  • 馬哥教育網絡班21期+第六周課程練習

    第六周作業 1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; cp /etc/rc.d/rc.sysinit /tmpvim /tmp/rc.sysinit # 命令模式下,輸入一下內容:%s@\(^[[:space:]]…

    Linux干貨 2016-10-17
欧美性久久久久