ansible 基礎

  • 2019 年 10 月 3 日
  • 筆記

1 ansible 入門

1.1 ansible 是什麼

網上各種介紹都有, 由來的,這裡不多寫了。 
ansible 是一款運維自動化工具,其主要功能是幫運維實現 IT 工作的自動化、降低人為操作事務、提高業務自動化率、提升運維工作效率,常用於軟體部署自動化,配置自動化,管理自動化等等一些功能

1.2 ansible 主要特點

  • ansible 是非C/S 架構,自身沒有client端,只需要安裝SSH,python即可。
  • 基於OpenSSH 通訊,底層基於 SSH 協議(Windows基於PowerShell)
  • 支援密碼和 SSH 認證,可以通過系統賬戶密碼認證或公私鑰認證,所以整個過程簡單、方便、安全。建議使用公私鑰方式認證,因為密碼認證方式的密碼需要明文寫配置文件
  • 支援windows,但windows必須是客戶端,服務端必須是Linux 系統。

2 環境準備

2.1 環境規劃

 

主機名 IP 系統版本 軟體版本 用途
ansible-150 10.0.0.150 Centos 7.6 ansible 批量管理機器
mysql-151 10.0.0.151 Centos 7.6 xxx 被管理機器
mysql-152 10.0.0.152 Centos 7.6 xxx 被管理機器

註:關閉了selinux 和 防火牆,配置好了yum和epel源

2.2 ansible 安裝

#官方文檔裡面各種安裝方式  https://docs.ansible.com/  

安裝方式有很多,我這裡用的yum安裝 

安裝

[root@ansible-150 ~]# yum -y install ansible  [root@ansible-150 ~]# ansible --version  ansible 2.8.2  

安裝完了, 是不是該研究如何使用ansible了。但是 ansible 是基於ssh 通訊的,需要批量管理伺服器,是不是需要做用戶密碼認證或者秘鑰對驗證。

2.3 為新系統添加安全認證

安全認證分為兩種: 
第一種是:ansible 本身支援密碼認證,但是密碼是明文配置在Inventory 中。考慮到安全性問題,不推薦使用。 
第二種是:SSHKey 認證(秘鑰對驗證),推薦使用。安全性相對明文來說,比較高。

2.3.1 SSHKey 認證

從安全性考慮角度,我們是該對root 用戶做密鑰對,還是普通用戶。 
在公司的時候很多情況下不會給你root 用戶許可權。我幫別人解決過一個問題,別人家公司的伺服器規模小,沒有專門維護人員,開發擔任伺服器管理操作,對用戶許可權和安全這塊可能不怎麼懂。他們的項目目錄、軟體目錄都是給的777許可權,為了開發方便。不久以後就中了挖礦病毒。 

1. 建立管理用戶 

 

出於安全的考慮還是用普通用戶做密鑰對 
對所有機器建立一個統一的管理用戶就叫ansible 用戶

#對150 ,151,152 建立管理用戶,用戶名叫ansible 。先不要給什麼許可權,就是一個普通用戶  useradd ansible  #所有機器設置這個用戶密碼為123456。我這是為了方便隨意設置,實際要滿足密碼複雜度  echo 123456 | passwd  --stdin ansible    所有機器把ansible用戶加入到wheel組,管理員組  usermod -aG  wheel  ansible    所有機器運行visudo,所有機器去掉  shell> visudo  #把這一行內容的內容#注釋去掉 %wheel  ALL=(ALL)       NOPASSWD: ALL  %wheel  ALL=(ALL)       NOPASSWD: ALL  允許wheel用戶組中的用戶在不輸入該用戶的密碼的情況下使用所有命令    

ansible 用戶就是管理用戶了

2. 生成密鑰對

#在ansible-150上操作  [root@ansible-150 ~]# su - ansible  [ansible@ansible-150 ~]$ ssh-keygen -t rsa  

[ansible@ansible-150 ~]$ cd .ssh/  [ansible@ansible-150 .ssh]$ pwd  /home/ansible/.ssh  [ansible@ansible-150 .ssh]$ ll  total 8  -rw------- 1 ansible ansible 1679 Aug  8 14:31 id_rsa  -rw-r--r-- 1 ansible ansible  401 Aug  8 14:31 id_rsa.pub  

密鑰對可以比作鑰匙和鎖 
id_rsa 是密鑰 密鑰相當於是鎖 
id_rsa.pub 是公鑰 公鑰相當於是鑰匙,我們需要把鑰匙給別人

3. 分發公鑰

[ansible@ansible-150 .ssh]$ ssh-copy-id [email protected]  [ansible@ansible-150 .ssh]$ ssh-copy-id [email protected]  

4. 驗證

[ansible@ansible-150 .ssh]$ ssh [email protected]  [ansible@ansible-150 .ssh]$ ssh [email protected]  #都可以實現免密碼登陸  

.ssh 文件夾必須是700 ,.ssh 文件夾下面的文件許可權必須是600

2.4 如果機器很多,怎麼做比較快

這時候分兩種情況, 
第一種:機器已近使用了,這時候就需要自己寫腳本,做秘鑰分發了 
第二種:機器還未使用,做批量裝機的時候,不是可以安裝完執行什麼命令或者操作

#ADD USER  useradd sa -G wheel  mkdir /home/sa/.ssh/  cat /home/sa/.ssh/authorized_keys << EOF  ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTrrQuMnd2lxyBYISpHVeV92Y5mE+ez5f2qlmjCm4iNUf0DSFmyN1keY4Egvl6w1BI77gJiVR397c+oBgoq3dB2/uL3Ymic9u1kLx3SFFeWbB15cjAMOAW6msO0f+pSinK4fVzXIrifWAiFCQSRRbpLIGc/zo404h0MscpkdjpT7A+p1FUXEszNsjvJKAPu6VYqqmR2C7PyileTpfNRuCGRSZwLp0stURZ51NQc7FxgFmimt6Q40UrCzl2qzOusZYsur6NGl3gxvs0D+FWpnIR2fteDbr9fnnfHCupw0KJ53r/Oj76tLvCuO5ODpe3HLji8jUolvoKVEiXRUnY6W31 ansible@ansible-150  EOF  chmod 600 /home/sa/.ssh/*  chown sa.sa -R /home/sa  sed -i '108s/#//' /etc/sudoers  # 最後一個sed 是去掉108行的注釋,是去掉%wheel  ALL=(ALL)       NOPASSWD: ALL這個注釋  

機器初始化的時候一起執行了

可以無密碼通訊了,這時候就研究ansible 如何使用了

3 ansible 目錄結構

用命令查看 ansible 所有文件存放的目錄;

[ansible@ansible-150 ~]$ rpm -ql ansible  ...  

可以分為以下幾類目錄:

  • 配置文件目錄 /etc/ansible

  • 執行文件目錄 /usr/bin

  • Lib 庫依賴目錄/usr/lib/python2.7/site-packages/ansible/

如下目錄需要配置,需熟練掌握 

1. 配置文件目錄/etc/ansible,所有ansible 的配置均存放在該目錄下,運維日常所有配置類操作也均基於此目錄進行。

[root@ansible-150 ansible]# tree  .  ├── ansible.cfg   #工具功能配置  ├── hosts  # inventory 主機資訊配置  └── roles  # 角色  1 directory, 2 files  [root@ansible-150 ansible]# pwd  /etc/ansible  

2. 執行文件目錄/usr/bin,主要功能為:ansible系列命令默認存放目錄。ansible所有的可執行文件均存放在該目錄下。

[root@ansible-150 bin]# cd /usr/bin/  [root@ansible-150 bin]# ll ansible*  

3.1 配置文件解析

nventory 用於定義ansible 的主機列表配置,ansible 的自身配置文件只有一個,即ansible.cfg,ansible 安裝好後它默認存放於/etc/ansible/目錄下。ansible.cfg配置文件可以存在於多個地方,ansible讀取配置文件的順序是當前命令執行的目錄——>用戶家目錄下的.ansible.cfg——>/etc/ansible.cfg,先找到哪個就使用哪個配置。 
配置文件ansible.cfg,大多數為注釋行默認配置項。很多默認配置即可 

常用的配置文件解釋

[defaults]  #inventory=/etc/ansible/hosts                   #被控端的主機列表文件  #library=/usr/share/my_modules/                 #庫文件存放目錄  #remote_tmp=~/.ansible/tmp                      #臨時文件遠程主機存放目錄  #local_tmp=~/.ansible/tmp                       #臨時文件本地存放目錄  #forks = 5                                      #默認開啟的並發數  #poll_interval=15                               #默認輪詢時間間隔(單位秒)  #sudo_user=root                                 #默認sudo用戶  #ask_sudo_pass=True                             #是否需要sudo密碼  #ask_pass=True                                  #是否需要密碼  #transport=smart                                #傳輸方式  #remote_port=22                                 #默認遠程主機的埠號  #建議開啟修改以下兩個配置參數(取消掉注釋即可)  #host_key_checking = False                       #首次連接是否需要檢查key認#證,建議設為False,不要認證  #log_path=/var/log/ansible.log                   #開啟ansible日誌  #module_name = command                           #默認執行模組,可以換成shell模組  [privilege_escalation]  #become=True                    #是否sudo  #become_method=sudo             #sudo方式  #become_user=root               #sudo 後變為root用戶  #become_ask_pass=False          #sudo 後是否驗證密碼  

我實驗環境的ansible.cfg

[root@ansible-150 ~]# egrep -v '^#|^$' /etc/ansible/ansible.cfg  [defaults]  host_key_checking = False  log_path = /var/log/ansible.log  [inventory]  [privilege_escalation]  become=True  become_method=sudo  become_user=root  [paramiko_connection]  [ssh_connection]  [persistent_connection]  [accelerate]  [selinux]  [colors]  [diff]  # 記得把/var/log/ansible.log 的許可權給ansible  [root@ansible-150 ~]# chown ansible.ansible /var/log/ansible.log  # 按需修改,不要瞎改,不知道去看看官方文檔  

3.2 Inventory配置文件及詳解

Inventory 是Ansible 管理主機資訊的配置文件,相當於系統HOSTS文件的功能,默認存放在/etc/ansible/hosts。為方便批量管理主機,便捷實用其中的主機分組,ansible通過inventory 來定義其主機和組,在使用時通過 -i 指定讀取 

例:

ansible -i /etc/ansible/hosts dbsrvs -m ping  

如果只有一個Inventory 是可不用指定路徑,默認讀取/etc/ansible/hosts

3.3 定義主機和組

Inventory 配置文件遵循 INI 文件風格,中括弧中的字元為組名。其支援將同一個主機同時歸併到多個不同的組中,分組的功能為 IT 人員維護主機提供了非常大的便利。此外,若目標主機使用了非默認的 SSH 埠,還可以在主機名稱之後使用冒號加埠號來標明,以行為單位分隔配置

/etc/ansible/hosts  # "#" 開頭表示注釋行,不生效  # Inventory 可以直接為IP 地址  10.0.0.151  # Inventory 同樣支援主機名(hostname)的方式,後跟冒號加數字表示埠號,默認22號埠  mysql-151:5636  mysql-151  # 中括弧的內容表示一個分組的開始,緊隨其後的主機均屬於改組成員,mysql-151 這這台主機屬於[dbsrvs]組  [dbsrvs]  mysql-151  mysql-[151:156]   #[151:156] 表示151~156之間的所有數字,即表示mysql-151,mysql-152,mysql-153,.....,mysql-156的所有主機  mysql-[b:d]       # [b:d] 同理表示b到d之間的所有字母  

3.4 定義主機變數

在日常工作中,通常會遇到非標準化的需求配置,考慮到安全性問題,管理人員有時候可能把Web 服務的80 埠,修改為其他埠號, 而該功能可以直接通過修改Inventory 配置來實現,在定義主機時為其添加主機變數  

[atlanta]  host2 http_port=303 maxRequestsPerChild=909  # host2 這台主機中,設置了http_port和maxRequestsPerChild 這兩個變數  

3.5 定義組變數

可以定義屬於整個組的變數

[atlanta]  host1  host2    [atlanta:vars]  ntp_server=ntp.atlanta.example.com  proxy=proxy.atlanta.example.com    #[atlanta] 這個是組名,[altanta:vars] 表示要為這個組定義變數,這個組有哪些變數了:ntp_server和proxy  

3.6 常用Inventory 參數列表

Ansible 基於SSH 連接Inventory 中指定的遠程主機時,還內置了很多其他參數,用於指定其交互方式

ansible_ssh_host        將要連接的遠程主機名.與你想要設定的主機的別名不同的話,可通過此變數設置.  ansible_ssh_port        ssh埠號.如果不是默認的埠號,通過此變數設置.  ansible_ssh_user        默認的 ssh 用戶名  ansible_ssh_pass        ssh 密碼(這種方式並不安全,我們強烈建議使用 --ask-pass 或 SSH 密鑰)  ansible_sudo_pass        sudo 密碼(這種方式並不安全,我們強烈建議使用 --ask-sudo-pass)  ansible_connection        與主機的連接類型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默認使用 paramiko.1.2 以後默認使用 'smart','smart' 方式會根據是否支援 ControlPersist, 來判斷'ssh' 方式是否可行.  ansible_ssh_private_key_file        ssh 使用的私鑰文件.適用於有多個密鑰,而你不想使用 SSH 代理的情況.  ansible_shell_type        目標系統的shell類型.默認情況下,命令的執行使用 'sh' 語法,可設置為 'csh' 或 'fish'.  ansible_python_interpreter        目標主機的 python 路徑.適用於的情況: 系統中有多個 Python, 或者命令路徑不是"/usr/bin/python",比如  *BSD, 或者 /usr/bin/python        不是 2.X 版本的 Python.我們不使用 "/usr/bin/env" 機制,因為這要求遠程用戶的路徑設置正確,且要求 "python" 可執行程式名不可為 python以外的名字(實際有可能名為python27).        與 ansible_python_interpreter 的工作方式相同,可設定如 ruby 或 perl 的路徑....  

3.7 一份清單文件列子

一般常用主機清單的例子如下

/etc/ansible/hosts  [groupname]  some_host         ansible_ssh_port=2222     ansible_ssh_user=manager  aws_host          ansible_ssh_private_key_file=/home/example/.ssh/aws.pem  freebsd_host      ansible_python_interpreter=/usr/local/bin/python  ruby_module_host  ansible_ruby_interpreter=/usr/bin/ruby.1.9.3    # [組名]  主機名或者IP       參數  

註:上面很多知識沒有, 我只寫了常用了,不知道的去看官方文檔

https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#inventory-basics-hosts-and-groups  

4 ansible 系列命令用法詳解與使用場景

ansible 有哪些相關命令了  

 

  • ansible
  • ansible-galaxy
  • ansible-pull
  • ansible-doc
  • ansible-playbook
  • ansible-vault
  • ansible-console

 這些相關命令,最常用的還是ansible,ansible-playbook

 上面很多命令我很少用到, 這裡就不全部寫了,要用去官方文檔查一查

4.1 ansible

ansible 是遠程管理命令

ansible 語法如下

[root@ansible-150 ~]# ansible --help  Usage: ansible <host-pattern> [options]  ansible    主機表達式            選項參數  主機表達式可以是Inventory 裡面的主機和IP 或者一些表達式來簡易表示主機  選項參數比較多,這時候就需要經常看help 和 該選項的所表達意思  

常用參數 

-m      相應名稱的模組被執行,(默認模組為command)  -a      模組參數資訊,-a後面是要執行的命令  -C      不做任何該變;只是做預測可能發生的變化  -syntax-checks  行語法檢查在劇本上,但是並不執行劇本相當於debug  

 

4.1.2 ansible 命令執行結果色彩說明

綠色:表示沒有發生任何改變 
紅色:執行命令操作出現異常 
黃色:執行命令後,對受控主機產生影響,發生了配置改變

4.1.3 ansible 使用例子

先看看我的主機配置文件內容

[root@ansible-150 ~]# egrep -v "^$|^#" /etc/ansible/hosts  [dbsrvs]  10.0.0.151 ansible_ssh_user=ansible  10.0.0.152 ansible_ssh_user=ansible  

測試連通性

[ansible@ansible-150 ~]$ ansible all -m ping  10.0.0.151 | SUCCESS => {      "ansible_facts": {          "discovered_interpreter_python": "/usr/bin/python"      },      "changed": false,      "ping": "pong"  }  10.0.0.152 | SUCCESS => {      "ansible_facts": {          "discovered_interpreter_python": "/usr/bin/python"      },      "changed": false,      "ping": "pong"  }  

 在被控制機器創建一個目錄

[ansible@ansible-150 ~]$ ansible  all -m command -a 'sudo mkdir /opt/xixi'   [WARNING]: Consider using 'become', 'become_method', and 'become_user' rather than running sudo  10.0.0.151 | CHANGED | rc=0 >>  10.0.0.152 | CHANGED | rc=0 >>  #驗證結果  [ansible@ansible-150 ~]$ ansible  all -m command -a 'ls /opt'  10.0.0.151 | CHANGED | rc=0 >>  rh  xixi    10.0.0.152 | CHANGED | rc=0 >>  rh  xixi  

4.2 ansible-doc

ansible-doc 是Ansible 模組文檔說明,針對每個模組都有詳細的用法說明及應用案例介紹,功能和Linux 系統man 命令類似。該命令使用方式如下:

 

ansible-doc [options]  [plugin]    plugin 就是模組  

ansible-doc 命令跟[options] 參數或 [模組名] ,顯示模組用法說明,具體示例如下:  

#列出支援的模組  ansible-doc -l    #模組功能說明  ansible-doc ping  

4.3 ansible-playbook

ansible-playbook 是日常應用中使用頻率最高的命令,其工作機制是:通過讀取預先編寫好的playbook文件實現批量管理。要實現的功能與命令ansible 一樣,可以理解為按一定條件組成的ansible 任務集 
ansible-playbook 命令後跟YML格式的playbook文件,執行事先編排好的任務集

Playbook 具有編寫簡單、可訂製性高、靈活方便,以及可固化日常所有操作的特點,應熟練掌握

4.4 ansible-galaxy

ansible-galaxy的功能可以簡單地理解為gitub的功能,通過ansible-galaxy命令,可以根據下載量和關注量等資訊,查找和安裝優秀的Roles。roles集合其實就是多個playbook文件的集合。 
Ansible Galaxy是Ansible的官方社區中心,用於共享Ansible角色。一個角色是Ansible構建自動化內容的方式以及讓它可復用。角色一般用於基於主機構建服務的場景中,但也可以是用於構建守護進程等場景中。Ansible Galaxy指的是一個網站共享和下載 Ansible 角色,也可以是幫助 roles 更好的工作的命令行工具。

https://galaxy.ansible.com/  

4.5 ansible-inventory

查看被控制端主機清單的詳細資訊默認情況下它使用庫存腳本,返回JSON格式

語法:ansible-inventory [options] [host|group]  參數:ansible-inventory --help 查看  ansible-inventory --list  

  

5 常用模組

這裡只從運維管理角度介紹幾個常用的模組 

5.1 ping 模組

用途:嘗試連接被控制端主機,成功返回pong(ping–pong是一對的)

使用方法:

[ansible@ansible-150 ~]$ ansible-doc -s ping  

示例:  

[ansible@ansible-150 ~]$ ansible all -m ping  

 

 參數 all 代表被控制端的所有主機

5.2 command 模組

用途:默認ansible使⽤的模組是command,即可以執⾏⼀些shell命令 
使用方法:

[ansible@ansible-150 ~]$ ansible-doc -s command  - name: Executes a command on a remote node    command:        argv:                  # 允許用戶以列表和字元串的形式提供命令,不能同時使用,也不必須提供其中一種        chdir:                 # 在執行命令之前,先cd到指定的目錄下        creates:               # 用於判斷命令是否要執行,如果指定的文件存在(可以使用通配符),則不執行        free_form:             # 默認的選項,這裡只是顯示,實際上是沒有的        removes:               # 用於判斷命令是否要執行,如果指定的文件存在(可以使用通配符)則執行,不存在,則不執行        stdin:                 # 將命令的stdin直接設置為指定值        warn:                  # 設置command的警告資訊(在/etc/ansible/ansible.cfg中有配置項)  

示例:

#不加參數執行shell  [ansible@ansible-150 ~]$ ansible all -a 'ls -a'  [ansible@ansible-150 ~]$ ansible 10.0.0.151 -m command -a 'chdir=/etc/selinux ls'  10.0.0.151 | CHANGED | rc=0 >>  config  final  semanage.conf  targeted  tmp  

註:command不能解析變數(如$HOME)和某些操作符("<", ">", "|", ";"以及"&"),所以明確要使⽤這些不可解析的操作符時,使⽤shell模組來代替command  

5.3 shell 模組

用途:shell和command的⽤法基本⼀樣,實際上shell模組執⾏命令的⽅式是在遠程使⽤/bin/sh來執⾏的,如/bin/sh ping 
使用方法:

ansible-doc -s shell  - name: Execute commands in nodes.    shell:        chdir:                 # 在執行命令之前,先cd到指定的目錄下        creates:               # 用於判斷命令是否要執行,如果指定的文件存在(可以使用通配符)存在,則不執行        executable:            # 不再使⽤默認的/bin/sh解析並執⾏命令,⽽是使⽤此處指定的命令解析(例如使⽤expect解析expect腳本。必須為絕對路徑)        free_form:             # 默認的選項,這裡只是顯示,實際上是沒有的        removes:               # 用於判斷命令是否要執行,如果指定的文件存在(可以使用通配符)不存在,則不執行        stdin:                 # 將命令的stdin直接設置為指定值        warn:                  # 設置command的警告資訊(在/etc/ansible/ansible.cfg中有配置項)  

5.4 script 模組

用途:script模組用於控制遠程主機執行腳本,在執行腳本前,ansible會將本地腳本傳輸到遠程主機,然後在執行,在執行腳本的時候,其採用的是遠程主機上的shell環境

[ansible@ansible-150 ~]$ ansible-doc -s script  - name: Runs a local script on a remote node after transferring it    script:        chdir:                 # 在遠程執⾏腳本前先切換到此⽬錄下        creates:               # 當此⽂件存在時,不執⾏腳本。可⽤於實現冪等性。        decrypt:               # 此選項使用vault控制源文件的自動解密(對使用ansible-vault encrypt 文件名.yml 進行加密的文件解密)        executable:            # 不再使⽤默認的/bin/sh解析並執⾏命令,⽽是使⽤此處指定的命令解析(例如使⽤expect解析expect腳本。必須為絕對路徑)        free_form:             # 本地待執⾏的腳本路徑、選項、參數。之所以稱為free_form,是因為它是腳本名+選項+參數。        removes:               # 當此⽂件不存在時,不執⾏腳本。可⽤於實現冪等性。  

示例:

新建一個腳本在ansible管理主機上  [ansible@ansible-150 ~]$ cat keme.sh  #!/bin/bash  echo "keme is handsome one."  #沒加任何參數  [ansible@ansible-150 ~]$ ansible all -m script -a 'keme.sh'  #執行命令前切換到opt目錄 加了chdir參數  [ansible@ansible-150 ~]$ ansible all -m script -a 'chdir=/opt ./keme.sh'  

5.5 copy模組

用途:copy模組的作用就是拷貝文件或者目錄,將 ansible 管理主機上的文件拷貝到遠程主機中 
使用方法:

[ansible@ansible-150 ~]$ ansible-doc -s copy  - name: Copies files to remote locations    copy:        backup:                # 拷貝的同時也創建⼀個包含時間戳資訊的備份⽂件,默認為no,可以指定為backup=yes做文件備份        content:               # 當用content代替src參數的時候,可以把content指定的內容直接寫到一個文件        decrypt:               # 此選項使用vault控制源文件的自動解密(對使用ansible-vault encrypt 文件名.yml 進行加密的文件解密)        dest:                  # ⽬標路徑,只能是絕對路徑,如果拷貝的⽂件是⽬錄,則⽬標路徑必須也是⽬錄        directory_mode:        # 當對⽬錄做遞歸拷貝時,設置了directory_mode將會使得只拷貝新建⽂件舊⽂件不會被拷貝。默認未設置.        follow:                # 是否追蹤到鏈接的源⽂件(follow=yes|on)        force:                 # 設置為yes(默認)時,將覆蓋遠程同名⽂件。設置為no時,忽略同名⽂件的拷貝。        group:                 # 指定文件拷貝到遠程主機後的屬組,但是遠程主機上必須有對應的組,否則會報錯        local_follow:          # 是否遵循本地機器中的文件系統鏈接(local_follow=yes|on)        mode:                  # 設置遠程⽂件的許可權。使⽤數值表⽰時不能省略第⼀位,如0644。也可以使⽤'u+rwx'或'u=rw,g=r,o=r'等⽅式設置        owner:                 # 設置遠程⽂件的所有者        remote_src:            # 如果yes它會從目標機上搜索src文件(remote_src=yes|on)        src:                   # 拷貝本地源⽂件到遠程,可使⽤絕對路徑或相對路徑。如果路徑是⽬錄,且⽬錄後加了斜杠"/",則只會拷貝⽬錄中的內容到遠程,如果⽬錄後不加斜杠,則拷貝⽬錄本⾝和⽬錄內的內容到遠程        unsafe_writes:         # 是否以不安全的方式進行,可能導致數據損壞(unsafe_writes=yes|on)        validate:              # 複製前是否檢驗需要複製目的地的路徑  

  

示例1 本地文件拷貝到被控端:

#新建一個文件,文件內容如下  [ansible@ansible-150 ~]$ pwd  /home/ansible  [ansible@ansible-150 ~]$ cat kemeaaa.txt  xixi xixi xixi    #把/home/ansible/kemeaaa.txt/ 拷貝到被控端主機/opt 下  [ansible@ansible-150 ~]$ ansible all -m copy -a 'src=/home/ansible/kemeaaa.txt dest=/opt/'  

 

示例2:拷貝之前先備份

# 修改kemeaaa.txt 內容  [ansible@ansible-150 ~]$ cat kemeaaa.txt  xixi xixi xixi  keme keme keme    # 加上backup這個參數  [ansible@ansible-150 ~]$ ansible all -m copy -a 'src=/home/ansible/kemeaaa.txt dest=/opt/ backup=yes'  

 

在上面可以看到backup_file這個參數,後面就是備份的路徑(在被控制端主機上查看)

示例3 : 修改owner、group、mode參數,默認是root 
拷貝文件對許可權和屬主屬組進行改變

# 把許可權改為ansible 用戶  [ansible@ansible-150 ~]$ ansible all -m copy -a 'src=/home/ansible/kemeaaa.txt dest=/opt/ owner=ansible group=ansible mode=0744'  # 驗證  [ansible@ansible-150 ~]$ ansible all -m shell -a 'ls -l /opt/kemeaaa.txt'  

 

5.6 fetch 模組

用途:從被控遠端機器上拉取文件(和COPY模組整好相反) 
使用方法:

[ansible@ansible-150 ~]$ ansible-doc -s fetch  - name: Fetches a file from remote nodes    fetch:        dest:                  # 本地存儲拉取⽂件的⽬錄。例如dest=/data,src=/etc/fstab,遠程主機名host.exp.com,則保存的路徑為/data/host.exp.com/etc/fstab。        fail_on_missing:       # 當設置為yes時,如果拉取的源⽂件不存在,則此任務失敗。默認為no.        flat:                  # 改變拉取後的路徑存儲⽅式。如果設置為yes,且當dest以"/"結尾時,將直接把源⽂件的basename存儲在dest下。顯然,應該考慮多個主機拉取時的⽂件覆蓋情況。        src:                   # 遠程主機上的源⽂件。只能是⽂件,不⽀持⽬錄。在未來的版本中可能會⽀持⽬錄遞歸拉取.        validate_checksum:     # fetch到⽂件後,檢查其md5和源⽂件是否  

 

示例1 :src、dest 
拉取10.0.0.151 的文件 到 /home/ansible/目錄下

[ansible@ansible-150 ~]$ ansible 10.0.0.151 -m fetch -a 'src=/etc/hostname dest=/home/ansible/'  

 示例2:flat

[ansible@ansible-150 ~]$ ansible 10.0.0.152 -m fetch -a 'src=/etc/hostname dest=/home/ansible/ flat=yes'  

拉取後沒有主機名文件夾標識

5.7 file 模組

用途:管理文件、目錄的屬性,也可以創建文件或者目錄 
使用方法: 
在file模組中state參數是十分重要的

[ansible@ansible-150 ~]$ ansible-doc -s file  [root@ansible ~]# ansible-doc -s file  - name: Sets attributes of files    file:        follow:                       # 是否遵循目的機器中的文件系統鏈接(可選值為:yes|on)        force:                        # 當state=link的時候,可配合此參數強制創建鏈接文件,當force=yes時,表示強制創建鏈接文件                                      # 不過強制創建鏈接文件分為三種情況。情況一:當要創建的鏈接文件指向的源文件並不存在時,使用此參數,可以先強制創建出鏈接文件。                                      # 情況二:當要創建鏈接文件的目錄中已經存在與鏈接文件同名的文件時,將force設置為yes,會將同名文件覆蓋為鏈接文件,相當於刪除同名文件,創建鏈接文件。                                      # 情況三:當要創建鏈接文件的目錄中已經存在與鏈接文件同名的文件,並且鏈接文件指向的源文件也不存在,這時會強制替換同名文件為鏈接文件        group:                        # 設置遠程⽂件的所屬組        mode:                         # 設置遠程⽂件的許可權。使⽤數值表⽰時不能省略第⼀位,如0644。也可以使⽤        owner:                        # 設置遠程⽂件的所有者        path:                         # 必須的參數,用於指定要操作的文件或者目錄        recurse:                      # 當要操作的文件為目錄,將recurse設置為yes,可以遞歸的修改目錄中的文件屬性        src:                          # 當state設置為link或者hard時,表示我們想要創建一個軟鏈接或者硬鏈接,所以,我們必須指明軟鏈接或硬鏈鏈接的哪個文件,通過src參數即可指定鏈接源        state:                        # 此參數非常靈活,其對應的值需要根據情況設定。比如,我們想要在遠程主機上創建/testdir/a/b目錄,那麼則需要設置path=/testdir/a/b,                                      # 但是,我們無法從”/testdir/a/b“這個路徑看出b是一個文件還是一個目錄,ansible也同樣無法單單從一個字元串就知道你要創建文件還是目錄,所以,我們需要通過state參數進行說明                                      # state=directory:表示創建目錄,如果path指定的不存在則被創建                                      # state=touch:創建文件                                      # state=link:創建軟鏈接文件                                      # state=hard:創建硬鏈接文件                                      # state=absent:刪除文件(刪除時不用區分目標是文件、目錄、還是鏈接)        unsafe_writes:                # 是否以不安全的方式進行,可能導致數據損壞(unsafe_writes=yes|on)  

5.8 hostname 模組

用途:管理配置主機名 
使用方法:

[ansible@ansible-150 ~]$ ansible-doc -s hostname  - name: Manage hostname    hostname:        name:                  # 必選,主機名稱  

使用這個模組存在一個問題就是一改主機名緊跟著應該是在這個清單裡面的機器都會被改掉導致主機名完全相同 
是有解決方法的,使用變數的方式進行更改
  

使用hostname模組修改主機名是直接生效的並且是永久生效

5.9 yum 模組

用途:使用yum包管理器管理包

[ansible@ansible-150 ~]$ ansible-doc -s yum  - name: Manages packages with the `yum' package manager    yum:        allow_downgrade:       # 是否允許給現有包的版本進行降級        autoremove:            # 卸載包並且刪除其所有的依賴包,如果這個依賴包被其他包所依賴則不會刪除(authorremove=yes)        bugfix:                # 如果bugfix=yes和state=latest則僅安裝已標記為與bug修復相關的更新        conf_file:             # 指定yum.repo配置文件.        disable_excludes:      # 禁用YUM配置文件中定義的排除(yum.repo文件中的某個塊).                               # disable_excludes=all 禁用所有排除                               # disable_excludes=main 禁用yum.conf中的[main]中定義的排除                               # disable_excludes=repoid 禁用未給定repo id定義的排除        disable_gpg_check:     # 安裝包時禁止gpgcheck,僅在state=present或者latest時生效.        disable_plugin:        # 禁用yum的Loaded plugins(使用yum repolist all | less 查看所有插件)        disablerepo:           # 禁止指定的repo源,多個repo源使用逗號分隔        download_only:         # 只下載指定的安裝包,不進行安裝.        enable_plugin:         # 開啟yum的Loaded plugins(使用yum repolist all | less 查看所有插件).        enablerepo:            # 明確使用那個repo源        exclude:               # 排除那些包不安裝,僅在state=present或者latest時生效        installroot:           # 指定yum安裝包的用戶,用此用戶安裝的只允許root和指定用戶使用        list:                  # 類似於yum list.        name:                  # (必選參數)指定包名,可以指定版本號,多個包可以使用逗號分隔        releasever:            # Specifies an alternative release from which all packages will be installed.        security:              # 如果設置為yes和state=latest,則只安裝標記為與安全相關的更新        skip_broken:           # 跳過具有損壞的依賴包        state:                 # 用於指定軟體包的狀態 ,默認值為present,表示確保軟體包已經安裝                               # state=present安裝狀態(默認值)                               # state=installed安裝狀態                               # state=latest安裝狀態(安裝最新的版本)                               # state=absent卸載狀態                               # state=removed卸載狀態        update_cache:          # 強制yum檢查快取是否過期,並在需要時重新下載.僅在state=present或者latest時生效.        update_only:           # 使用最新軟體包時,只更新已安裝的軟體包。不要安裝軟體包.僅在state=present或者latest時生效        validate_certs:        # 這僅適用於使用https url作為rpm的源的情況。例如,用於localinstall。如果設置為no,則不會驗證SSL證書  

  

5.10 cron 模組

用途:cron模組⽤於設置定時任務,也⽤於管理定時任務中的環境變數 
使用方法:

[ansible@ansible-150 ~]$ ansible-doc -s cron  - name: Manage cron.d and crontab entries    cron:        backup:                # (yes/on)如果設置了,則會在修改遠程cron_file前備份這些文件        cron_file:             # 自定義cron_file的文件名,使用相對路徑則表示在/etc/cron.d/中,必選同時制定user選項        minute:                # 分(0-59,*,/N),不寫時默認為*        hour:                  # 時(0-23,*,/N),不寫時默認為*        day:                   # 日(1-31,*,/N),不寫時默認為*        month:                 # 月(1-12,*,/N),不寫時默認為*        weekday:               # 周(0-6 for Sunday-Saturday,*),不寫時默認為*        disabled:              # 禁用crontab中的某個任務,要求state=present        env:                   # (yes/on)設置一個環境變數,將添加在crontab的頂端,使用name=value定義變數名和值.        job:                   # 需要執行的命令,如果設置了env,則表示環境變數的值,此時job="xxxx"等價於value="xxxx"        name:                  # 描述crontab的字元串,但如果設置的是env,則name為環境變數的名稱,要求state=absent,注意,若沒有設置name,且state=present,則總會創建一條新的job條目,即使cron_file中已經存在同樣的條目.        reboot:                # 如果任務應該在重新啟動時運行。不贊成使用此選項。用戶應該使用special_time.        special_time:          # 定時任務的別稱,用於定義何時運行job條目.有效值有reboot/hourly/daily/weekly/monthly/yearly/annually        state:                 # job或者env的狀態是present(默認)還是absent,present用於創建,absent用於刪除        user:                  # 指定那個用戶的crontab任務將要被修改,默認root.  

5.11 service 模組

用途:service 模組可以幫助我們管理遠程主機上的服務。比如,啟動或停止遠程主機中的 nginx 服務 
使用方法:

[ansible@ansible-150 ~]$ ansible-doc -s service  - name: Manage services    service:        arguments:             # 服務命令行參數傳遞        enabled:               # 設置服務為開機自啟(yes/no),默認為no        name:                  # (必選項)指定服務名.        pattern:               # 如果服務沒有做出相應,可以通過這個參數指定使用ps或者其他方式查看服務的狀態.        runlevel:              # 設置服務啟動級別        sleep:                 # 如果服務正在"重新啟動",那麼在停止和開始命令之間設置休眠時間.        state:                 # started和stoped分別是啟動和停止服務,它們是冪等操作,多次啟動或者停止服務都是一樣的,也就是說對於運行中的服務不會再次啟動操作,同理停止也是一樣的;                               # restarted重啟服務,restarted總是重讀配置文件如果服務是未運⾏狀態,則reloaded會啟動服務(state和enabled兩者⾄少要給⼀個)  

5.12 systemd 模組

用途:systemd 模組可以幫助我們使用systemd管理遠程主機上的服務。比如,啟動或停止遠程主機中的 nginx 服務

[ansible@ansible-150 ~]$ ansible-doc -s systemd  - name: Manage services    systemd:        daemon_reload:         # 在執行任何其他操作之前運行守護進程重新載入,以確保systemd已經讀取其他更改.        enabled:               # 設置服務為開機自啟(yes/no),默認為no        force:                 # 是否覆蓋現有符號鏈接(yes/on).        masked:                # 是否將服務設置為masked狀態(yes/no),被mask的服務是無法啟動的        name:                  # 指定服務名稱.        no_block:              # 不要同步等待操作請求完成(yes/no)        state:                 # started和stoped分別是啟動和停止服務,它們是冪等操作,多次啟動或者停止服務都是一樣的,也就是說對於運行中的服務不會再次啟動操作,同理停止也是一樣的;  

 

5.13 user 模組

用途:user 模組可以幫助我們管理遠程主機上的用戶,比如創建用戶、修改用戶、刪除用戶、為用戶創建密鑰對等操作 
使用方法:

[ansible@ansible-150 ~]$ ansible-doc -s user  - name: Manage user accounts    user:        append:                # 如果用戶原本就存在多個附加組,那麼當使用 groups 參數設置附加組時,當前設置會覆蓋原來的附加組設置                               # 如果不想覆蓋原來的附加組設置,需要結合 append 參數,將 append 設置為 yes,表示追加附加組到現有的附加組設置,append 默認值為 no.        comment:               # 設置用戶的描述資訊        create_home:           # 創建家⽬錄,或者已有的⽤戶但家⽬錄不存在也會創建。設置為no則不創建家⽬錄        expires:               # 此參數用於指定用戶的過期時間,相當於設置 /etc/shadow 文件中的的第8列                               # 比如,你想要設置用戶的過期日期為2018年12月31日,那麼你首先要獲取到2018年12月31日的 unix 時間戳,使用命令 “date -d 2018-12-31 +%s” 獲取到的時間戳為1546185600,                               # 所以,當設置 expires=1546185600 時,表示用戶的過期時間為2018年12月31日0點0分,                               # 設置成功後,查看遠程主機的 /etc/shadow 文件,對應用戶的第8八列的值將變成17895(表示1970年1月1日到2018年12月31日的天數,unix 時間戳的值會自動轉換為天數,我們不用手動的進行換算,                               # 目前此參數只支援在 Linux 和 FreeBSD 系統中使用。        force:                 # 強制刪除用戶、用戶目錄,只在state=absent中生效,相當於userdel --force命令        generate_ssh_key:      # 是否為相關用戶生成SSH密鑰。這將“不會”覆蓋現有SSH密鑰.        group:                 # 設置⽤戶的primary group(主組).        groups:                # 將⽤戶加⼊到輔助組列表中。如果設置"groups=",則會將此⽤戶從所有輔助組中移除        home:                  # 指定要創建的家⽬錄路徑        move_home:             # 如果設置為yes,則"home="則表⽰將家⽬錄移動到此選項指定的路徑下        name:                  # (必選項)要創建、修改、移除的⽤戶名.        non_unique:            # 當與 -u 選項一起使用時,該選項允許將用戶ID更改為非唯一值        password:              # 設置⽤戶密碼。此處只能使⽤加密密碼作為值.        password_lock:         # 鎖定用戶的密碼(等價於usermod -L命令)這個選項並不總是意味著用戶不能通過其他方法登錄。這個選項沒有禁用用戶,只鎖定密碼.        remove:                # 配合'state=absent'時,等價於'userdel --remove',即刪除家⽬錄和郵件列表        seuser:                # 在啟用selinux的系統上設置seuser類型.        shell:                 # 設置⽤戶的shell        ssh_key_bits:          # 當 generate_ssh_key 參數的值為 yes 時,使用此參數指定要創建的SSH密鑰中的位數.        ssh_key_comment:       # 當 generate_ssh_key 參數的值為 yes 時,在創建證書時,使用此參數設置公鑰中的注釋資訊。但是如果同名的密鑰對已經存在,則並不會修改原來的注釋資訊,即不做任何操作。                               # 當不指定此參數時,默認的注釋資訊為”ansible-generated on 遠程主機的主機名.        ssh_key_file:          # 當 generate_ssh_key 參數的值為 yes 時,使用此參數自定義生成 ssh 私鑰的路徑和名稱,對應公鑰會在同路徑下生成,公鑰名以私鑰名開頭,以”.pub”結尾.        ssh_key_passphrase:    # 當 generate_ssh_key 參數的值為 yes 時,在創建證書時,使用此參數設置私鑰的密碼。但是如果同名的密鑰對已經存在,則並不會修改原來的密碼,即不做任何操作.        ssh_key_type:          # 當 generate_ssh_key參數的值為yes時,在創建證書時,使用此參數設置密鑰對的類型。默認密鑰類型為 rsa,但是如果同名的密鑰對已經存在,並不會對同名密鑰做任何操作.        state:                 # 創建⽤戶(present)還是刪除⽤戶(absent)。默認為present.        system:                # 設置為yes表⽰創建⼀個系統⽤戶,只能⽤於創建,不能⽤於修改已有⽤戶為系統⽤戶        uid:                   # 設置用戶的UID        update_password:       # user是冪等模組,"always"將總是修改密碼。"on_create"將只在創建⽤戶時設置密碼  

  

5.14 group 模組

用途:添加或刪除組 
使用方法:

[ansible@ansible-150 ~]$ ansible-doc -s group  - name: Add or remove groups    group:        gid:                   # 用於指定組的gid        name:                  # (必選項) 用於指定要操作的組名稱        state:                 # 用於指定組的狀態,兩個值可選,present,absent,默認為 present,設置為absent 表示刪除組。        system:                # 如果是yes,表示指定的組是系統組  

5.15 小結

上面很多都是模組幫助參數使用說明,自己多試試,就知道模組怎麼試用了,還是多看模組幫助資訊。

6 使用 playbooks 劇本

Playbooks是Ansible的配置,部署和編排語言。他們可以描述您希望遠程系統實施的策略,或者描述一般IT流程中的一系列步驟。

6.1 Playbook 語法

Playbook 採用 YAML 語法編寫,該語言在被開發是,它的意思是:Yet Another Markup Language (仍是一種標記語言)。結合ansible 中 要用到的YAML 語法點。對YAML 語法簡潔總結如下。 
看官方文檔的一個簡易的列子:一個playbook 的列子verify-apache.yml

---  # 選擇的主機  - hosts: webservers  #vars 這個是變數    vars:      http_port: 80      max_clients: 200  # remote_user 遠端的執行許可權    remote_user: root  # 創建一個任務tasks    tasks:    - name: ensure apache is at the latest version  # 利用yum模組才操作      yum:        name: httpd        state: latest    - name: write the apache config file      template:        src: /srv/httpd.j2        dest: /etc/httpd.conf    # 觸發重啟 apache 伺服器      notify:      - restart apache    - name: ensure apache is running      service:        name: httpd        state: started    # 這裡的handlers 和上面的notify 的觸發是配對的。這就是handlers的作用。相當於tag    handlers:      - name: restart apache        service:          name: httpd          state: restarted  

總的來說,Playbook 語法的一些特性:

  1. 需要以”—”三個減號開始,且需頂行手寫。

  2. 次行開始正常寫Playbook 內容。

  3. 使用 # 號注釋程式碼。

  4. 縮進必須是統一的,不能將空格和Tab混用。

  5. 縮進的級別必須是一致的,同樣的縮進代表同樣的級別,程式判別配置的級別是通過縮進結合換行來實現的。

  6. YAML 文件內容 和Linux 系統大小寫判斷方式保持一致,是區別大小寫的,k/v的值均需要大小寫敏感。

  7. k/v 的值可同行也可換行寫。同行使用 “:” 分隔,換行寫需要以”-” 分隔

  8. 一個完整的程式碼塊功能需最少元素,需包括name:task。

  9. 一個 name 只能包括一個 task 。

6.1.2 寫簡單的Playbook

上面都是語法說明,自己寫一些做簡單的列子做練習把 
示例1:allping.yml

#建一個目錄用來做練習  [ansible@ansible-150 ansible]$ sudo mkdir learn  [ansible@ansible-150 ansible]$ cd learn/  [ansible@ansible-150 learn]$ pwd  /etc/ansible/learn  [ansible@ansible-150 learn]$ sudo vim allping.yml  ---  - hosts: all    remote_user: root    tasks:      - name: test connection        ping:  # 執行編寫的劇本  [ansible@ansible-150 learn]$ ansible-playbook allping.yml  

示例2:install_apache.yml

# 在管理主機安裝上httpd 和 httpd-devel 要httpd.conf和httpd-vhosts.conf 文件  [ansible@ansible-150 learn]$ sudo yum -y install httpd httpd-devel    # 修改管理主機的httpd.conf和httpd-vhosts.conf 默認沒有httpd-vhosts.conf 自己隨便創建的  # 注配置文件內容無實際意義,為了實驗效果  [ansible@ansible-150 conf]$ pwd  /etc/httpd/conf  [ansible@ansible-150 conf]$ sudo cp httpd.conf /tmp/  [ansible@ansible-150 conf]$ sudo cp httpd-vhosts.conf /tmp/  # 編寫install_apache.yml 劇本  [ansible@ansible-150 conf]$ cd /etc/ansible/learn/  [ansible@ansible-150 learn]$ sudo vim install_apache.yml  ---  - hosts: all    sudo: yes    tasks:    - name: install apache      yum: name={{ item }} state=present      with_items:        - httpd        - httpd-devel    - name: copy config file      copy:        src: "{{ item.src }}"        dest: "{{ item.dest }}"        owner: root        group: root        mode: 0644      with_items:        - {        src: "/tmp/httpd.conf",        dest: "/etc/httpd/conf/httpd.conf" }        - {        src: "/tmp/httpd-vhosts.conf",        dest: "/etc/httpd/conf/httpd-vhosts.conf" }    - name: 檢查 Apache 運行狀態,並設置開機啟動      service: name=httpd state=started enabled=yes  # 寫好了劇本是不是要對劇本進行debug 測試,測試劇本是否可用  # 第一語法檢測,第二模擬檢測  [ansible@ansible-150 learn]$ ansible-playbook --syntax-check install_apache.yml  [ansible@ansible-150 learn]$ ansible-playbook -C  install_apache.yml  

上面檢測都沒問題了,該給被控制主機安裝apache了

 

[ansible@ansible-150 learn]$ ansible-playbook install_apache.yml  # 驗證是否安裝成功,並啟動了  [ansible@ansible-150 learn]$ ansible all -m shell -a 'ss -ntulp | grep httpd'    # 查看配置文件是否拷貝成功了  [ansible@ansible-150 learn]$ ansible all -m shell -a 'ls -a /etc/httpd/conf/'  

註:上面有警告資訊,可以自己根據警告資訊,自己調試自己的劇本(playbook)和ansible.cfg 的配置文件

第 1 行,”—” ,這個是yaml 語法中注釋的用法,就想shell 腳本中的 ”#“ 
第 2 行:”- hosts: all” ,告訴 Ansible 具體要在哪些主機上運行我的劇本,在本例中是all,即所有主機。 
第 3 行,”sudo: yes”,告訴 Ansible 通過sudo 來運行相應命令,這樣所有命令將會以root 身份執行。 
第 4 行: “tasks: ” 指定一系列將要運行的任務 
每一個任務 “- name: xxxx” 開頭。 
“- name: ” 欄位並不是一個模組不會執行任務實質性的操作,它只是給 “task” 一個易於識別的名稱。即使把 “- name” 對應的行刪除,也不會有任何問題。 
在示例2中:使用yum模組來安裝apache 
在第一個 “- name” 任務當中,每個"- name”都可以使用 with_items 來定義變數,並通過"{{ 變數名 }}" 的形式來直接使用,2.11版本應該使用另一種方法,注意警告資訊。使用yum 模組的state=present 選項來確保軟體被安裝,或者使用state=absent來確保軟體被刪除。

在第二個 “- name” 當中,使用copy 模組來講”src” 定義的源文件(必須是Ansible 所在伺服器上的本地文件)複製到 “dest” 定義的目的地址(此地址為遠程主機上的地址)去。在傳遞文件的同時,還定義了文件的屬主,屬組和許可權。在這個 “- name” 中,我們用數組的形式給變數複製,使用了 { var1: value , var2: value } 的格式來賦值,變數的個數可以任意多,不同變數間以逗號分隔,使用 {{ item.var1 }} 的形式來調用變數,本示例中為 {{ item.src }}

第三個 “- name” 使用了同樣的結構,調用了 service 模組, 以保證服務的正常開啟

6.2 amsob-playbook 小技巧

6.2.1 playbook 語法檢測和調試

寫完一個playbook 一定要進行語法檢測,看看自己哪裡寫的不對,好及時修改,警告資訊也可以注意一下。

語法檢測

ansible-playbook --syntax-check playbook_file.yml  

調試  

ansible-playbook -C playbook_file.yml  

在正式運行playbook 之前,使用--check或-C 選項來檢測playbook 都會改變哪些內容,調試顯示的結果跟真正執行時一模一樣,但不會真的被管理的伺服器產生實際影響  

6.3 限定playbook 執行範圍

當playbook 指定的一批主機有個別主機需進行變更時,可以不需要去修改Playbook文件本身,而是通過一些選項就可以直接限定和查看Ansible 命令的執行範圍。

--limit 
如果允許上面的install_apache.yum 的劇本,會發現所有被ansible 管理的主機都會被操作。 
可以通過修改劇本 “- hosts: ” 欄位來指定哪些主機將會應用 Playbook 的操作。

  • 指定一台主機: ip或者主機名
  • 指定多台主機: 10.0.0.151,10.0.0.152 逗號分隔,指定多台主機
  • 指定一組主機:寫上組名 .(這個組名是/etc/ansibles/hosts裡面定義的那個組名) 

當然,也可以直接通過ansible-playbook 命令來指定主機:

例如:只指定10.0.0.151 執行  ansible-playbook install_apache.yml  --list 10.0.0.151  

這樣,即便playbook中設定 “- hosts: all” ,但也只對10.0.0.151 生效  

--list-hosts 
如果要知道在執行playbook是,哪些主機將會受影響,則使用--list-hosts 選項

ansible-playbook install_apache.yml  --list-hosts  

6.4 用戶與許可權設置

--remote-user 
在playbook中,如果在 hosts 欄位下沒有定義users 關鍵字,那麼Ansible將會使用你在Inventory 文件(/etc/ansible/hosts)中定義的用戶,如果Inventory 文件中也沒定義用戶,ansible 將默認使用系統用戶身份來通過ssh連接遠程主機,在管理控制主機運行playbook內容。 
也可以直接在ansible-playbook 中使用--remote-user選項來指定用戶。

ansible-playbook install_apache.yml --remote-user=keme  

--ask-sudo-pass 
在某些情況下,需要傳遞sudo 密碼到遠程主機,來保證sudo命令的正常運行時,可以以使用--ask-sudo-pass(-K) 選項來互動式輸入密碼

--sudo 
使用--sudo 選項,可以強制所有 playbook 都使用sudo用戶,同時使用 --sudo-user選項指定sudo 可以執行那個用戶的許可權。如果不指定,則默認以root 身份運行 
比如當前 用戶 ansible 想以 keme 的身份運行 playbook ,命令如下:

[ansible@ansible-150 learn]$ ansible-palybook install_apache.yml --sudo --sudo-user=keme --ask-sudo-pass  

執行過程中,會要求用戶輸入keme 的密碼 

6.5 ansible-playbook :其他常用選項

ansible-playbook 命令還有一些其他選項:

--inventory=PATH (-i PATH):指定inventory 文件,默認文件是/etc/ansible/hosts  --verbose (-v):顯示詳細輸出,也可以使用-vvvv 顯示精確到每分鐘的輸出  --extra-vars=VARS (-e VARS) : 定義在playbook使用的變數,格式為: "key=value,key=value"  --forks=NUM (-f NUM): 指定並發執行的任務數,默認為5,根據伺服器性能,調大這個值可提高ansible執行效率0  --conection=TYPE (-c TYPE) : 指定遠程主機的方式,默認為SSH,設為local時,則只在本地執行playbook,建議不做修改  --check (-C) :檢測模式,playbook中定的所有任務將在每台遠程主機上進行檢測,並不真正執行。  

 

7 安全管理優化

  • 使用安全加密的通訊方式,例如:秘鑰對;

在centos/redhat 中ssh 服務的主配置文件 /etc/ssh/sshd_config 中設置  PasswordAuthentication no #禁止 ssh 使用密碼認證連接。如此一來就杜絕了所有針對密碼的暴力破解攻擊。  PermitRootLogin no        #禁止 root 用戶遠程登錄。建議只使用普通用戶進行遠程登錄,並使用sudo命令來行使大部分 root 許可權。如果實在需要使用 root 用戶進行互動式管理,可以使用普通用遠程連接到主機,然後通過 su 命令切換到root用戶,這樣做更加安全  # 明確指定允許或禁止的遠程登錄用戶。使用AllowUser和 DenyUsers 來指定哪些用戶可以登錄,哪些用戶不能登錄。比如,只允許用戶 keme 登錄,可以設置為AllowUsers keme; 允許除了 xixi 以為的其他用戶登錄,可以設置為:DenyUsers xixi  Port 2636 # 使用非默認埠。ssh 的默認埠為22,將其改為任意不與其他服務衝突的埠(建議採用1024以上的埠號)將會使系統更為安全。在ssh配置文件中設置Port 2636,即可修改ssh默認埠為2849.  

  • 禁止 root 用戶遠程登錄並充分利用 sudo;  
#充分利用visudo命令或者 vim  /etc/sudoers  #sudo的目的:為非根用戶授予根用戶的許可權;  root    ALL=(ALL)       ALL  %wheel  ALL=(ALL)       ALL    授權用戶/組    主機名=(允許轉換至的用戶)   NOPASSWD:命令動作  # 假如無需密碼直接運行命令的,應該加NOPASSWD:參數,不需要時方可省略,  

  • 移除非必需的軟體,只開放需要用的埠;
  • 遵守許可權最小化原則; 

用戶許可權管理和文件許可權管理,主機上的用戶,應用以及進程都應該只允許訪問它們本身需要訪問的資訊和資源

  • 及時更新作業系統和軟體;
  • 使用合理過的、有針對性的防火牆;
  • 監測系統登錄情況,封掉可以的 IP 地址;
  • 系統登錄日誌審計;

8 總結

上面的寫的東西,都是基礎, 沒寫到很高深的東西 ,比如roles , includes ,jinjia2,tags,等等 。 
如果你有個東西不會,就要去官方文檔快速看一下怎麼使用,

 

多去官方文檔搜索,比瞎搜索靠譜多了。 
官方文檔: 
https://docs.ansible.com/ansible/latest/user_guide/index.html