ansible 基礎


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 ansible@10.0.0.151
[ansible@ansible-150 .ssh]$ ssh-copy-id ansible@10.0.0.152

4. 驗證

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

.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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM