ansible自動化運維
特色不須要安裝客服端經過sshd通訊。基於模塊化工做支持sudo。批量執行能夠寫成腳本用python編寫維護更簡單。
只須要在一臺服務器上安裝yum -y install ansible
Ansible 配置密鑰
ssh-keygen -t rsa 直接回車便可不用設置密鑰密碼
把公鑰(id_rsa.pub內容放到客服端的/root/.ssh/authorized_keys裏面
scp .ssh/id_rsa.pub 客服端地址:/root/.ssh/authorized_keyspython
本機也要操做 cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keyslinux
chmod 600 /root/.ssh/authorized_keys
關閉selinux setenforce 0nginx
錯誤 "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"
解決 yum install -y libselinux-pythongit
ansible的一些經常使用模塊copy yum cron command shell service user group synchronizegithub
ansible-doc -l 查看ansible的全部模塊
ansible-doc -s +模塊名 表示查看模塊的用法web
module_name='ping' 這裏是模塊的名字
module_args='' # 附帶的參數你懂的
pattern='lvs-bj-*' #主機的匹配
forks=10 fork 進程 shell
Ansible更改配置文件
vi /etc/ansible/hosts
//增長vim
[testhost]centos
須要自動配置的客服的ipbash
說明 testhost爲主機組名字自定義的。 下面ip爲組內的機器ip
若是是連續的幾個ip 能夠192.168.6.[2:100] 表示6.2到6.100的地址
也能夠指定登錄用戶
ip + ansible_ssh_user=root
ip + ansible_ssh_user=root ansible_ssh_port= port
ansible_ssh_(user管理遠程主機帳號,port,host被管理的主機)
Ansible 遠程執行命令
ansible 組/ip/all -m commandraw -a 'w' ansible 組/ip -m command/shell -a '命令‘
這樣就能夠批量執行命令了。這裏的testhost 爲主機組名-m後邊是模塊名字-a後面是命令。
咱們也能夠直接寫一個ip針對某一臺機器來執行命令。
ansible 127.0.0.1 -m command -a 'hostname'
錯誤 "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"
解決
yum install -y libselinux-python
還有一個模塊就是shell一樣也能夠實現 ansible testhost -m shell -a 'w'
command## 在遠程主機上執行命令相關選項以下
creates一個文件名當該文件存在則該命令不執行free_form要執行的linux指令
chdir在執行指令以前先切換到該目錄removes一個文件名當該文件不存在則該選項不執行
executable切換shell來執行指令該執行路徑必須是一個絕對路徑
Ansible 拷貝文件或目錄
ansible 組/ip -m copy -a "src=源目錄位置 dest=/目標目錄位置 owner=root group=root mode=0755"
注意源目錄會放到目標目錄下面去若是目標指定的目錄不存在它會自動建立。若是拷貝的是文件dest指定的名字和源若是不一樣而且它不是已經存在的目錄至關於拷貝過去後又重命名。但相反若是desc是目標機器上已經存在的目錄則會直接把文件拷貝到該目錄下面。
ansible testhost -m copy -a "src=/etc/passwd dest=/tmp/1.txt"
這裏的/tmp/123和源機器上的/etc/passwd是一致的但若是目標機器上已經有/tmp/123目錄則會再/tmp/123目錄下面創建passwd文件
copy## 複製文件到遠程主機 相關選項以下
backup在覆蓋以前將源文件備份備份文件包含時間信息。有兩個選項yes|no
content用於替代「src」能夠直接設定指定文件的值
dest必選項。要將源文件複製到的遠程主機的絕對路徑若是源文件是一個目錄那麼該路徑也必須是個目錄
directory_mode遞歸設定目錄的權限默認爲系統默認權限
force若是目標主機包含該文件但內容不一樣若是設置爲yes則強制覆蓋若是爲no則只有當目標主機的目標位置不存在該文件時才複製。默認爲yes
others全部的file模塊裏的選項均可以在這裏使用
src被複制到遠程主機的本地文件能夠是絕對路徑也能夠是相對路徑。若是路徑是一個目錄它將遞歸複製。在這種狀況下若是路徑使用「/」來結尾則只複製目錄裏的內容若是沒有使用「/」來結尾則包含目錄在內的整個內容所有複製相似於rsync。
ansible 主機池 -m setup 查看遠程主機的通常信息。
ansible 主機池 -m ping 查看遠程主機的運行狀態。
file## 設置文件的屬性
force須要在兩種狀況下強制建立軟連接一種是源文件不存在但以後會創建的狀況下另外一種是目標軟連接已存在須要先取消以前的軟鏈而後建立新的軟鏈有兩個選項yes|no group定義文件/目錄的屬組mode定義文件/目錄的權限
owner定義文件/目錄的屬主path必選項定義文件/目錄的路徑
recurse遞歸設置文件的屬性只對目錄有效src被連接的源文件路徑只應用於state=link的狀況
dest被連接到的路徑只應用於state=link的狀況
state
directory若是目錄不存在就建立目錄
file即便文件不存在也不會被建立
link建立軟連接
hard建立硬連接
touch若是文件不存在則會建立一個新的文件若是文件或目錄已存在則更新其最後修改時間
absent刪除目錄、文件或者取消連接文件
Ansible遠程執行腳本
先建立一個shell腳本
vim /tmp/test.sh //加入內容
#!/bin/bash
echo `date` > /tmp/ansible_test.txt
而後把該腳本分發到各個機器上ansible testhost -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh mod=0755"
最後是批量執行該shell腳本ansible testhost -m shell -a "/tmp/test.sh"
shell模塊還支持遠程執行命令而且帶管道ansible testhost -m shell -a "cat /etc/passwd|wc -l "
Ansible實現任務計劃
ansible testhost -m cron -a "name='test cron' job表示執行一個命令='/bin/touch /tmp/1212.txt' weekday=6「
若要刪除該cron 只須要加一個字段 state=absent ansible testhost -m cron -a "name='test cron' state=absent 「
其餘的時間表示分鐘 minute 小時 hour 日期 day 月份 month
Ansible安裝rpm包/管理服務
ansible testhost -m yum -a "name=httpd " 在name後面還能夠加上state=installed
ansible testhost -m service -a "name=httpd state=startedstopped enabled=yes(no)" 這裏的name是centos系統裏的服務名能夠經過chkconfig --list查到。
Ansible文檔的使用
ansible-doc -l 列出全部的模塊 ansible-doc cron 查看指定模塊的文檔
Ansible playbook的使用
至關於把模塊寫入到配置文件裏面
例
cat /etc/ansible/test.yml
---
- hosts: 主機/主
remote_user: root
tasks:
- name: test_playbook
shell: touch /tmp/lishiming.txt
說明hosts參數指定了對哪些主機進行參做
user參數指定了使用什麼用戶登陸遠程主機操做
tasks指定了一個任務其下面的name參數一樣是對任務的描述在執行過程當中會打印出來。
執行ansible-playbook test.yml
再來一個建立用戶的例子cat /etc/ansible/create_user.yml
---
-name: create_user
hosts: 主機/組
user: root
gather_facts: false
vars:
- user: "test"
tasks:
- name: create user
user: name="` user `" home shell state remove uid 添加一些權限
說明name參數對該playbook實現的功能作一個概述後面執行過程當中會打印 name變量的值 能夠省略gather_facts參數指定了在如下任務部分執行前是否先執行setup模塊獲取主機相關信息這在後面的task會使用到setup獲取的信息時用到vars參數指定了變量這裏指字一個user變量其值爲test 須要注意的是變量值必定要用引號引住user提定了調用user模塊name是user模塊裏的一個參數而增長的用戶名字調用了上面user變量的值。
ansible 主機名 -m setup 收集服務器的一些詳細信息。。。。。。。。。。。。。。。。。。。。。。對於判斷有用。
` item ` 設置一個變量
Ansible playbook中的循環
---
- hosts: 主機/組
user: root
tasks:
- name: change mode for files
file: path=/tmp/` item ` mode=600
owner=root group=root 變量必定是item
with_items:
取變量參數值
- 1.txt
- 2.txt
- 3.txt
Ansible playbook條件判斷
---
- hosts: 主機/組
user: root
gather_facts: True
是經過 ansible 主機 -m setup 來查看
tasks:
- name: use when
shell: touch /tmp/when.txt
when: facter_ip address == "172.7.15.106" 經過 ansible 客服端 -m setup
Ansible playbook中的handlers
執行task以後服務器發生變化以後要執行的一些操做好比咱們修改了配置文件後須要重啓一下服務
---
- name: handlers test
hosts: web10.aming.com
user: root
tasks:
- name: copy file
copy: src=/etc/passwd dest=/tmp/aaa.txt
notify: test handlers
handlers:
- name: test handlers
shell: echo "111111" >> /tmp/aaa.txt
說明只有copy模塊真正執行後纔會去調用下面的handlers相關的操做。也就是說若是1.txt和2.txt內容是同樣的並不會去執行handlers裏面的shell相關命令。 這種比較適合配置文件發生更改後重啓服務的操做。適合同步操做。
思路先在一臺機器上編譯安裝好nginx、打包而後再用ansible去下發
cd /etc/ansible
進入ansible配置文件目錄
mkdir nginx_install 建立一個nginx_install的目錄
方便管理
cd nginx_install;
mkdir -p roles/{common,delete,install}/{handlers,files,meta,tasks,templates,vars}
說明roles目錄下有兩個角色common爲一些準備操做tasksinstall爲安裝nginx的操做。delete爲刪除操做。
每一個角色下面又有幾個目錄
handlers下面是當發生改變時要執行的操做一般用在配置文件發生改變重啓服務。
files爲安裝時用到的一些文件
meta爲說明信息說明角色依賴等信息
tasks裏面是核心的配置文件
templates一般存一些配置文件啓動腳本等模板文件
vars下爲定義的變量
須要事先準備好安裝用到的文件具體以下
在一臺機器上事先編譯安裝好nginx配置好啓動腳本配置好配置文件
安裝好後咱們須要把nginx目錄打包並放到/etc/ansible/nginx_install/roles/install/files/下面名字爲nginx.tar.gz
啓動腳本、
配置文件都要放到/etc/ansible/nginx_install/roles/install/templates下面
cd /etc/ansible/nginx_install/roles
定義common的tasksnginx是須要一些依賴包的
vim ./common/tasks/main.yml
//內容以下
- name: Install initializtion require software
yum: name=` item ` state=installed
with_items:
- zlib-devel
- pcre-devel
定義變量
vim /etc/ansible/nginx_install/roles/install/vars/main.yml
//內容以下
nginx_user: www
nginx_port: 80
nginx_basedir: /usr/local/nginx
首先要把全部用到的文檔拷貝到目標機器
vim /etc/ansible/nginx_install/roles /install/tasks/copy.yml
//內容以下
- name: Copy Nginx Software
copy: src=nginx.tar.gz dest=/tmp/nginx.tar.gz owner=root group=root
-
name: Uncompression Nginx Software
shell: tar zxf /tmp/nginx.tar.gz -C /usr/local/
- name: Copy Nginx Start Script
template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755
- name: Copy Nginx Config
template: src=nginx.conf dest=` nginx_basedir `/conf/ owner=root group=root mode=0644
接下來會創建用戶啓動服務刪除壓縮包
vim /etc/ansible/nginx_install/roles /install/tasks/install.yml
//內容以下
- name: Create Nginx User
user: name=` nginx_user ` state=present createhome=no
shell=/sbin/nologin
- name: Start Nginx Service
service: name=nginx state=restarted
- name: Add Boot Start Nginx Service
shell: chkconfig --level 345 nginx on
- name: Delete Nginx compression files
shell: rm -rf /tmp/nginx.tar.gz
再建立main.yml而且把copy和install調用
vim /etc/ansible/nginx_install/roles /install/tasks/main.yml
//內容以下
- include: copy.yml
- include: install.yml
到此兩個rolescommon和install就定義完成了接下來要定義一個入口配置文件
vim /etc/ansible/nginx_install/install.yml
//內容以下
---
- hosts: testhost
remote_user: root
gather_facts: True
roles:
- common
- install
執行 ansible-playbook /etc/ansible/nginx_install/install.yml
下載整個樣例庫
git clone git://github.com/dl528888/ansible-examples.git
git命令
須要yum先安裝一下 yum install -y git
生產環境中大多時候是須要管理配置文件的安裝軟件包只是在初始化環境的時候用一下。
下面咱們來寫個管理nginx配置文件的playbook
mkdir -p /etc/ansible/nginx_config/roles/{new,old}/{files,handlers,vars,tasks}
其中new爲更新時用到的old爲回滾時用到的files下面爲nginx.conf和vhosts目錄handlers爲重啓nginx服務的命令
關於回滾須要在執行playbook以前先備份一下舊的配置因此對於老配置文件的管理必定要嚴格千萬不能隨便去修改線上機器的配置而且要保證new/files下面的配置和線上的配置一致
先把nginx.conf和vhosts目錄放到files目錄下面
cd /usr/local/nginx/conf/
cp -r nginx.conf vhosts /etc/ansible/nginx_conf/roles/new/files/
vim /etc/ansible/nginx_config/roles/new/vars/main.yml
//定義變量
nginx_basedir: /usr/local/nginx
vim /etc/ansible/nginx_config/roles/new/handlers/main.yml
//定義從新加載nginx服務
- name: restart nginx
shell: /etc/init.d/nginx
reload
vim /etc/ansible/nginx_config/roles/new/tasks/main.yml //這是核心的任務
- name: copy conf file
copy: src=` item`.`src ` dest=` nginx_basedir `/` item`.`dest ` backup=yes owner=root group=root mode=0644
with_items:
- { src: nginx.conf, dest: conf/nginx.conf }
- { src: vhosts, dest: conf/ }
notify: restart nginx
vim /etc/ansible/nginx_config/update.yml
// 最後是定義總入口配置
---
- hosts: testhost
user: root
roles: - new執行 ansible-playbook /etc/ansible/nginx_config/update.yml 而回滾的backup.yml對應的roles爲oldrsync -av /etc/ansible/nginx_config/roles/new//etc/ansible/nginx_config/roles/old/回滾操做就是把舊的配置覆蓋而後從新加載nginx服務