Ansible配置
阿新 • • 發佈:2018-06-12
ansible1.介紹
Ansible自動化運維工具,是用來實現一臺主機對多臺主機進行操作的開源軟件。
主要功能:
- 批量對多臺主機發送文件
- 批量對多臺主機運行命令
特性:- 模塊化
- 基於Python語言實現,有Paramiko,PyYAML和Jinja2三個關鍵模塊
- 部署簡單:agentless,可以不需要在需要操作的服務器上安裝任何軟件
- 支持自定義模塊
- 支持Playbook,可以將任何配置寫入Playbook,循環使用
- 冪等性,命令不管執行多少次,結果是一樣的
Ansible配置系統結構圖:
2.安裝和配置說明
Ansible的安裝需要使用epel源進行安裝,所以在安裝之前需要配置epel源
主要配置文件
/etc/ansible/hosts :主機清單配置文件
/etc/ansible/roles:角色定義目錄
相關命令介紹
1.幫助類相關命令
- ansible-doc -l 查看當前支持的所有模塊
- ansible-doc -s 模塊名 查看當前指定模塊使用方法
- ansible-doc -h 該命令使用方法
2.一次性執行命令相關
- ansible host|all -m 模塊 -a “模塊參數” -f 一次連接多少個主機
3.ansible-playbook相關命令
測試相關
- ansible-playbook --check 只檢測可能會發生的改變,但不真正執行操作
- ansible-playbook --list-hosts 列出運行任務的主機
- ansible-playbook --list-tasks 列出要運行的任務列表
- ansible-playbook --syntax-check 語法檢查
- ansible-playbook --list-tags 列出所有可用的標簽
- ansible-playbook --list-tasks 列出所有任務列表
運行相關 - ansible-playbook yml_file
- ansible-playbook -t TAGS , --tags=TAGS 只運行指定標簽的任務
- ansible-playbook --skip-tigs=SKIP_TIGS 跳過指定標簽的任務
3.常用模塊及實例
1.ping:測試與指定主機是否通訊正常
[root@ansible ~]# ansible ansible.test.com -m ping
ansible.test.com | SUCCESS => {
"changed": false,
"ping": "pong"
}
2.command:遠程在指定主機執行命令,該模塊是直接在內核級執行,所以沒有bash的一些符號
相關參數:
chdir:指定運行命令目錄
creates:創建文件或目錄,若文件或目錄存在,則不執行
removes:刪除文件或目錄,若文件或目錄不存在時,則不執行
實例:
[root@ansible ~]# ansible ansible.test.com -m command -a "date"
ansible.test.com | SUCCESS | rc=0 >>
Tue Jun 12 03:23:01 EDT 2018
3.shell:遠程在指定主機執行命令,該模塊時基於bash運行,所以bash相關符號都支持
相關參數:
chdir:指定運行命令目錄
creates:創建文件或目錄,若文件或目錄存在,則不執行
removes:刪除文件或目錄,若文件或目錄不存在時,則不執行
實例:
[root@ansible ~]# ansible ansible.test.com -m shell -a "echo 123456 | passwd --stdin test1"
ansible.test.com | SUCCESS | rc=0 >>
Changing password for user test1.
passwd: all authentication tokens updated successfully.
4.group:遠程在指定主機創建或刪除組
相關參數:
gid:指定組的GID
name:指定組名
state:指定刪除還是創建,present | absent
system:指定對應組是否為系統組
實例:
[root@ansible ~]# ansible ansible.test.com -m group -a "name=ansible state=present gid=2000"
ansible.test.com | SUCCESS => {
"changed": true,
"gid": 2000,
"name": "ansible",
"state": "present",
"system": false
}
[root@ansible ~]# ansible ansible.test.com -m group -a "name=ansible state=absent gid=2000"
ansible.test.com | SUCCESS => {
"changed": true,
"name": "ansible",
"state": "absent"
}
5.user:在指定主機創建或刪除用戶
相關參數:
name:指定用戶名
group:指定主組
uid:指定用戶的uid
goups:指定附加組
home:指定家目錄
password:指定用戶密碼
state:指定狀態,若和狀態不想同則作出操作 present | absent
system:設定用戶為系統用戶
shell:設定登入shell
實例:
[root@ansible ~]# ansible ansible.test.com -m user -a "name=ansible uid=2000 password=123456 shell=/bin/sh"
ansible.test.com | SUCCESS => {
"changed": true,
"comment": "",
"createhome": true,
"group": 2000,
"home": "/home/ansible",
"name": "ansible",
"password": "NOT_LOGGING_PASSWORD",
"shell": "/bin/sh",
"state": "present",
"system": false,
"uid": 2000
}
[root@ansible ~]# ansible ansible.test.com -m user -a "name=ansible state=absent"
ansible.test.com | SUCCESS => {
"changed": true,
"force": false,
"name": "ansible",
"remove": false,
"state": "absent"
}
6.copy:從本地復制文件至指定服務器
相關配置:
src:本地文件路徑
dest:遠程服務器目錄
owner:指定文件所有者
group:指定文件所屬組
mode:指定文件權限
content:將指定內容復制至指定服務器
實例:
[root@ansible ~]# ansible ansible.test.com -m copy -a "src=issue dest=/tmp owner=memcached group=root mode=0444"
ansible.test.com | SUCCESS => {
"changed": true,
"checksum": "5c76e3b565c91e21bee303f15c728c71e6b39540",
"dest": "/tmp/issue",
"gid": 0,
"group": "root",
"md5sum": "f078fe086dfc22f64b5dca2e1b95de2c",
"mode": "0444",
"owner": "memcached",
"size": 23,
"src": "/root/.ansible/tmp/ansible-tmp-1528789534.05-118540157876873/source",
"state": "file",
"uid": 995
}
7.fetch:從遠程服務器復制文件至本地,為了可以存多個服務器相同文件名,是創建一個以主機名為目錄將復制文件放入目錄中實現
相關配置:
src:遠程地址
dest:本地地址
實例:
[root@ansible ~]# ansible ansible.test.com -m fetch -a "src=/etc/passwd dest=/tmp"
ansible.test.com | SUCCESS => {
"changed": true,
"checksum": "49ed3c6ed3359b339b94c0b4b69d596974de5ff2",
"dest": "/tmp/ansible.test.com/etc/passwd",
"md5sum": "256651c73ef0e89bc7cd5cffe786f27e",
"remote_checksum": "49ed3c6ed3359b339b94c0b4b69d596974de5ff2",
"remote_md5sum": null
}
8.file:對遠程文件或目錄進行操作
相關配置:
path:指定遠程操作文件
state:指定path文件的類型,可以是dreectory、link、hard、file、touch,也可以是present或absent
src:本地路徑,用於在指定連接文件時使用
owner:指定文件屬主
group:指定文件屬組
mode:指定文件權限
實例:
[root@ansible ~]# ansible ansible.test.com -m file -a "path=/tmp/file state=directory"
ansible.test.com | SUCCESS => {
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/tmp/file",
"size": 6,
"state": "directory",
"uid": 0
}
9.get_url:批量下載
相關配置:
url:指定url路徑
owner:指定文件屬主
group:指定文件屬組
mode:指定文件權限
dest:指定目標路徑,必須是一個目錄
實例:
[root@ansible ~]# ansible ansible.test.com -m get_url -a "url=https://mirrors.aliyun.com/gentoo-portage/app-accessibility/SphinxTrain/SphinxTrain-1.0.8.ebuild dest=/tmp"
ansible.test.com | SUCCESS => {
"changed": true,
"checksum_dest": null,
"checksum_src": "b1a87e9c2e46841866387b11805d2cdf3d240577",
"dest": "/tmp/SphinxTrain-1.0.8.ebuild",
"gid": 0,
"group": "root",
"md5sum": "a52bed11534400b1901760bc1bcc9dd9",
"mode": "0644",
"msg": "OK (912 bytes)",
"owner": "root",
"size": 912,
"src": "/tmp/tmpNHTpAE",
"state": "file",
"uid": 0,
"url": "https://mirrors.aliyun.com/gentoo-portage/app-accessibility/SphinxTrain/SphinxTrain-1.0.8.ebuild"
}
10.git:用於下載git代碼倉庫命令,該命令需要安裝git軟件包才可以下載
相關配置:
repo:指定倉庫地址
dest:指定目標路徑
version:指定版本號,默認最新版本號
11.cron:為指定主機定義計劃任務
相關配置:
minute:定義分鐘
day:定義天
month:定義月
weekday:定義周
hour:定義時
job:定義命令
name:計劃任務名
state:present:創建 | absent:刪除
實例:
[root@ansible ~]# ansible ansible.test.com -m cron -a "name=mycron minute=*/5 job=date"
ansible.test.com | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"mycron"
]
}
12.yum:軟件包的安裝,默認輸出格式不對,這裏是整理過的格式
相關配置:
name:程序包名,可以帶版本號,若不指定,默認安裝最新版
state:設置安裝,卸載 installed | removed
enablerepo:啟用某倉庫
diablerepo:禁用某倉庫
實例:
[root@ansible ~]# ansible ansible.test.com -m yum -a "name=tree state=installed"
ansible.test.com | SUCCESS => {
"changed": true,
"msg": "",
"rc": 0,
"results": [
]
}
13.service:服務相關
相關配置:
name:指定服務名稱
state:指定服務狀態,可以是started、restarted、reloaded、stoped
enabled:是否開機自啟 true
runlevel:定義級別CentOS7版本不需要指定
實例:
[root@ansible ~]# ansible ansible.test.com -m service -a "name=memcached state=started"
ansible.lin.com | SUCCESS => {
·······這裏顯示的都是一些該服務的環境參數
}
"warnings": []
}
14.hostname:設置遠程主機的主機名,一般不適用
15.pip:用於安裝python模塊
16.npm:用於安裝JS模塊
17.setup:顯示當前系統中所有的變量,可以在配置文件中直接調用
顯示:
ansible.test.com | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.1.161",
"192.168.1.111",
"192.168.1.112"
],
"ansible_all_ipv6_addresses": [
"fe80::880b:c17f:5022:67c3",
"fe80::acd6:5a07:96b5:c5d4",
"fe80::805f:d6bd:3a96:c3dc"
],
"ansible_architecture": "x86_64",
"ansible_bios_date": "07/02/2015",
"ansible_bios_version": "6.00",
"ansible_cmdline": {
"BOOT_IMAGE": "/vmlinuz-3.10.0-693.el7.x86_64",
"LANG": "en_US.UTF-8",
"crashkernel": "auto",
"quiet": true,
"rd.lvm.lv": "centos/swap",
"rhgb": true,
"ro": true,
"root": "/dev/mapper/centos-root"
},
"ansible_date_time": {
"date": "2018-06-12",
"day": "12",
"epoch": "1528792866",
"hour": "04",
"iso8601": "2018-06-12T08:41:06Z",
"iso8601_basic": "20180612T044106138105",
"iso8601_basic_short": "20180612T044106",
"iso8601_micro": "2018-06-12T08:41:06.138178Z",
18.template:用於復制模板配置文件,模板配置文件必須為 .j2格式
相關配置:
src:源文件
dest:目標路徑
owner:屬主
group:數組
mode:權限
Jinja2:
字面量:
字符串:使用單引號或雙引號;
數字:整數,浮點數;
列表:[item1, item2, ...]
組:(item1, item2, ...)
字典:{key1:value1, key2:value2, ...}
布爾型:true/false
算術運算:
+, -, *, /, //, %, **
比較操作:
==, !=, >, >=, <, <=
邏輯運算:
and, or, not
4.Playbook:將需要在遠程服務器上執行的命令寫入配置文件中,調用配置文件即可執行
YAML
YAML:YAML(/?j?m?l/,尾音類似camel駱駝)是一個可讀性高,用來表達數據序列的格式。YAML參考了其他多種語言,包括:C語言、Python、Perl,並從XML、電子郵件的數據格式(RFC 2822)中獲得靈感。Clark Evans在2001年首次發表了這種語言,另外Ingy d?t Net與Oren Ben-Kiki也是這語言的共同設計者。目前已經有數種編程語言或腳本語言支持(或者說解析)這種語言。
YAML是"YAML Ain‘t a Markup Language"(YAML不是一種標記語言)的遞歸縮寫。在開發的這種語言時,YAML 的意思其實是:"Yet Another Markup Language"(仍是一種標記語言),但為了強調這種語言以數據做為中心,而不是以標記語言為重點,而用反向縮略語重命名。
YAML的語法和其他高級語言類似,並且可以簡單表達清單、散列表,標量等數據形態。它使用空白符號縮進和大量依賴外觀的特色,特別適合用來表達或編輯數據結構、各種配置文件、傾印除錯內容、文件大綱(例如:許多電子郵件標題格式和YAML非常接近)。
Playbook的核心元素
* Hosts:主機
* Tasks:任務列表
* Varoables:變量
* Templates:包含了模板語法文本文件
* Handlers:特定條件觸發的任務
* Roles:角色,將重復需要執行的命令寫成一個單獨的功能模塊,當需要使用時,直接使用即可,類似於函數
Playbook的基本組件
- hosts: 運行指定主機
remote_user: 遠程主機執行任務所用的身份,一般為root
tasks: 任務列表
選項: 模塊 參數
模塊: 參數
handlers:特定模式下執行,需要在上述指定notify,在notify後面指定字符串,在下面至指定觸發即可
-name:
實例:
[root@ansible ansible]# vim httpd.yml
- hosts: ansible.test.com
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=installed
- name: start httpd servier
service: name=httpd state=started
[root@ansible ansible]# ansible-playbook httpd.yml
PLAY [ansible.test.com] *********************************************************
TASK [setup] *******************************************************************
ok: [ansible.test.com]
TASK [install httpd package] ***************************************************
changed: [ansible.test.com]
TASK [start httpd servier] *****************************************************
changed: [ansible.test.com]
PLAY RECAP *********************************************************************
ansible.test.com : ok=3 changed=2 unreachable=0 failed=0
variables:傳遞參數
1.facts:可以直接調用,使用setup查看
2.用戶自定義變量
* ansible-playbook -e 變量
* -var1: value1
3.通過reles傳遞變量
4.在/etc/ansible/hosts文件中定義主機或是可以直接定義
ip var=value1
[groupname::vars]
varname=valus
條件測試:
when語句,在task中使用,當滿足條件式才會執行
tasks:
- name: install conf file to centos7
template: src=files/nginx.conf.c7.j2
when: ansible_distribution_major_version == "7"
- name: install conf file to centos6
template: src=files/nginx.conf.c6.j2
when: ansible_distribution_major_version == "6"
循環,叠代,能夠將重復任務循環完成
對叠代項引用,固定變量名為"item",而後給定列表
- 列表的方法有字符串和字典
- name: install some packages
yum: name={{ item }} state=present
with_items:
- nginx
- memcached
- php-fpm
- name: install some packages
yum: name={{ item }} state=present
with_items:
- { name: ‘nginx‘, group: ‘nginx‘ }
- { name: ‘nginx‘, group: ‘nginx‘ }
- { name: ‘nginx‘, group: ‘nginx‘ }
roles角色的定義:
角色目錄結構
nginx/:指定角色名稱,當需要調用時,也是根據該名稱調用,在一下目錄下的每一個目錄,若需要使用,至少應該擁有一個main.yml文件,若需要擴展,則可以使用include進行擴展
- files/:存放有copy或script模塊等調用的文件
- templates/:存放模板查看鎖需要的目錄,文件後綴為.j2
- tasks/:任務列表目錄,存放要執行的任務
- handlers/:來用存放滿足條件才會執行的任務列表
- vars/:變量目錄
- meta/:定義當前角色的特殊設定及其依賴關系
- default/:設定默認變量是使用該目錄
5.實踐
利用roles實現模塊化nginx
1.創建目錄結構
[root@ansible ansible]# tree /etc/ansible/roles/nginx/
/etc/ansible/roles/nginx/
├── default
├── files
│?? ├── proxy.html
│?? └── web.html
├── handlers
│?? └── main.yml
├── meta
├── tasks
│?? └── main.yml
├── templates
│?? ├── nginx.conf.j2
│?? └── proxy.conf.j2
└── vars
└── main.yml
2.創建 tasks目錄下main.yml
[root@ansible nginx]# cat tasks/main.yml
- name: install nginx package
yum: name=nginx state=installed
- name: create conf.d directory
file: path=/etc/nginx/conf.d state=directory
- name: install web conf file
template: src=templates/nginx.conf.j2 dest={{ nginx }}/nginx.conf
when: servertype == ‘web‘
notify: ‘restart nginx server‘
- name: install proxy conf file
template: src=templates/proxy.conf.j2 dest={{ nginx }}/nginx.conf
notify: ‘restart nginx server‘
when: servertype == ‘proxy‘
- name: create web index
file: path={{ webpath }} state=directory
when: servertype == ‘web‘
- name: create proxy index
file: path={{ proxypath }} state=directory
when: servertype == ‘proxy‘
- name: copy web index file
copy: src=files/web.html dest={{ webpath }}/index.html
when: servertype == ‘web‘
- name: copy proxy index file
copy: src=files/proxy.html dest={{ proxypath }}/index.html
when: servertype == ‘proxy‘
- name: start nginx service
service: name=nginx state=started enabled=true
3.創建對應的變量vars/main.yml
[root@ansible nginx]# cat vars/main.yml
nginx: /etc/nginx/conf.d/
servertype: web
webpath: /app/web/
proxypath: /app/proxy/
4.創建handles目錄下main.yml
[root@ansible nginx]# cat handlers/main.yml
- name: restart nginx server
service: name=nginx state=restarted
5.配置模板文件templates
[root@ansible nginx]# cat templates/proxy.conf.j2
unstream tomser {
server tomcat1.lin.com:8080;
server tomcat2.lin.com:8080;
}
server {
listen 80;
server_name {{ ansible_fqdn }};
index index.html;
root {{ proxypath }};
location / {
proxy_pass http://tomser/;
}
}
[root@ansible nginx]# cat templates/nginx.conf.j2
server {
listen 80;
server_name {{ ansible_nodename }};
root {{ webpath }};
index index.jsp index.html;
location / {
proxy_pass http://{{ ansible_fqdn }}:8080;
}
}
6.創建對應的測試主頁
[root@ansible nginx]# cat files/
proxy.html web.html
[root@ansible nginx]# cat files/*
<h1>proxy</h2>
<h1>test</h1>
7.根據參數來選擇安裝的類型
[root@ansible ansible]# ansible-playbook nginx.yml
或
[root@ansible ansible]# ansible-playbook -e server=proxy nginx.yml
Ansible配置