ansible自動化運維入門

1.ansible的安裝node

1)使用源碼安裝Python3.5python

安裝支持包mysql

yum -y install lrzsz vim net-tools gcc gcc-c++ ncurses ncurses-devel unzip zlib-devel zlib openssl-devel opensslc++

tar xf Python-3.5.2.tgz -C /usr/src/web

./configure --prefix=/usr/local/python/sql

make && make installshell

ln -s /usr/local/python/bin/python3 /usr/bin/python3數據庫

2)使用pip3安裝ansibleubuntu

/usr/local/python/bin/pip3 install ansiblevim

ln -s /usr/local/python/bin/ansible /usr/local/bin/

2.模塊簡單使用

1)ansible的配置文件

vim /etc/ansible/hosts

機器1 ansible_ssh_host=ip ansible_ssh_port=22 ansible_ssh_user=root

機器2 ansible_ssh_host=ip ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=666666

  1. ansible_ssh_host ===>主機IP
  2. ansible_ssh_port ===>ssh的默認端口
  3. ansible_ssh_user ===>ssh的用戶名
  4. ansible_ssh_pass ===>ssh的用戶的鏈接密碼

若是咱們已經設置了ssh免密鑰了。那麼就不須要寫密碼了。例如:webA

  咱們要是沒有設置免密鑰,那麼就須要安裝sshpass工具,並在/etc/ansible/hosts文件裏寫上主機的鏈接密碼。

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

yum -y install sshpass

2)進行ansible遠程執行命令測試

ansible -i /etc/ansible/hosts 主機或主機組 -m 指定模塊 -a 命令

使用ping模塊用來查看服務器是否鏈接正常,ping模塊不須要-a指定參數

ansible 主機1    -m ping

  1. [root@ansible .ssh]# ansible all -m ping
  2. webA | SUCCESS => {
  3.     "changed": false,
  4.     "ping": "pong"
  5. }
  6. webB | SUCCESS => {
  7.     "changed": false,
  8.     "ping": "pong"
  9. }

3)ansible模塊command(不支持管道,不建議使用)

 ansible all -m command -a "pwd"

ansible all -m command -a "echo bb >> /tmp/testansible"

-a 'name= state={present(建立)|absent(刪除)} force=(是否強制操做刪除家目錄) system= uid= shell= home='

4)ansible模塊shell(支持管道,支持重定向)

 ansible all -m shell -a "echo testansible | grep a"

 ansible all -m shell -a "echo bb >> /tmp/testansible"

 ansible all -m shell -a "cat /etc/passwd | awk -F":" '{print \$1}'"

 5)ansible的copy模塊批量下發文件或文件夾

 ansible all -m copy -a "src=/service/scripts/test.txt dest=/service/scripts/"

 ansible webB -m copy -a "src=/service/scripts/test.txt dest=/service/scripts/"

copy模塊拷貝文件夾,若是目標路徑裏有與我拷貝的文件同名文件的話,會直接覆蓋目標路徑下的文件

參數:backup=yes ===>意思是,若是目標路徑下,有與我同名但不一樣內容的文件時,在覆蓋前,對目標文件先進行備份。

ansible webB -m copy -a "src=/service/scripts/ dest=/service/scripts/ backup=yes"

6)ansible的script模塊批量運行腳本

ansible all   -m script -a "/root/service/mysql/auto_mysql.sh"

在指定的機器上執行本地腳本

7)service:

-a 'name= state={started|stopped|restarted} enabled=(是否開機自動啓動) runlevel=' [root@localhost ~]# ansible all -m service -a 'name=httpd state=started'

3.變量種類:

1)facts:由遠程主機發回的主機特有的屬性信息,這些信息被保存在ansible變量中;無須聲明,可直接調用;

2)自定義變量: 經過命令行傳遞:ansible-playbook test.yml --extra-vars "host=www user=test" 經過roles傳遞

3)主機變量:定義在inventory中的主機以後的變量;直接傳遞給單個主機的變量

例子:

[root@localhost~]# vim useradd.yml
- hosts: websrvs
remote_user: root
vars:
username: testuser
password: xuding
tasks:
-name: add user
user: name={{ username }} state=present
-name: set password
shell: /bin/echo {{ password }} |/usr/bin/passwd --stdin {{ username }}

|--extra-vars=VARS} 變量的從新賦值調用方法

ansible-playbookuseradd.yml --extra-vars "username=ubuntu"

4)playbook--- tasks

條件測試:

在某task後面添加when子句便可實現條件測試功能;when語句支持Jinja2語法; 實例:當時RedHat系列系統時候調用yum安裝

例子:

-name: install web server package
yum: name=httpd state=present
when: ansible_os_family == "RedHat"

 item

在task中調用內置的item變量;在某task後面使用with_items語句來定義元素列表;

-name: add four users

user: name={{ item }} state=present

with_items:

-testuser1

-testuser2

-testuser3

-testuser4

注意:迭代中,列表中的每一個元素能夠爲字典格式;

實例:

-name: add two users
user: name={{ item.name }} state=present groups={{ item.groups }}
with_items:
- { name: 'testuser5', groups: 'wheel' }
- { name: 'testuser6', groups: 'root' }
5)handlers:處理器;觸發器

只有其關注的條件知足時,纔會被觸發執行的任務; 實例:配置文件發生改變觸發重啓服務

-hosts: websrvs
remote_user: root
tasks:
-name: install httpd
yum:name=httpd state=present
-name: install config file
copy: src=/root/httpd.conf   dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
-name: start httpd service
service: name=httpd state=started
handlers:
-name: restart httpd
service: name=httpd state=restarted

 

 

 

4.ansible-playbook的初步使用

核心元素

Tasks任務、Variables變量、Templates模板、Handlers處理器、Roles角色

playbook的使用,playbook能夠把ansible的模塊進行組合

cat test_shell.yaml  #playbook的執行模板

  1. ---         #開頭三個小-開頭
  2. - hosts: webB  
  3.   tasks:       
  4.   - name: test
  5.     shell: echo "welcome to yunjisaun" >> /tmp/username
  6.   - name: test2
  7.     shell: echo "welcome to yunjisuan" >> /tmp/username
  8.      - name: install httpd
  9.        yum:  name=httpd state=present
  10.      - name: start httpd
  11.        service: name=httpd  state=started enable=true
  12. 模板說明:
  13. ---  #開頭必須有三個小-,頂格寫
  14. - hosts   #正文配置代碼的第一級,必須有兩個空格(-佔一個空格位)
  15. - host: webB   #webB是host參數的值,值和hosts:之間要有一個空格
  16.   tasks:        #tasks:表示接下來要執行的具體任務
  17.   - name:     #相對於tasks再多縮進兩個格(-佔一個空格位),表示屬於tasks的下一級
  18.   - name: test  #test只是要執行的具體命令的名字能夠隨便寫。name:後仍是有一個空格要注意
  19.     shell:  #表示調用shell模塊執行命令相對於tasks仍舊要多縮進兩個空格
  20.     shell: echo "xxx" >> xxx     #shell:後邊仍是要有個空格,須要注意。

執行playbook配置文件,ansible-playbook test_shell.yaml #執行playbook配置文件

實例:用ansible-playbook,在兩臺機器上自動化部署mysql 數據庫

1)準備三臺Linux,其中一臺安裝好ansible,三臺機器互相連通

2)準備.yaml文件,setup.yaml

---
  - hosts: all                                                                               #hosts文件中所有主機
    vars:                                                                                      #定義變量
    - dst: "/service/"                                                                     #變量名爲dst
    tasks:                                                                                    # 任務
    - name: cp cmake mysql                                                       #第一個任務名
      copy: src=/root/service/mysql/  dest={{ dst }}                      #拷貝MySQL下的文件到變量dst中

      notify:  # 若是copy執行完以後~/hosts.dest文件發送了變化,則執行

      - clear copy  # 調用handler
      handlers:
      - name: clear copy
        shell: 'mv ~/hosts.dest hosts.del'  # 僞裝刪除
    - name: install mysql                                                             #第二個任務名
      script: /root/service/mysql/auto_mysql.sh                           #執行腳本模塊, 後邊跟腳本路徑
      register: print_result                                                            #打印執行結果
    - debug: var=print_result

3)準備腳本文件auto_mysql.sh 

#!/bin/bash
#in ansible use
#install myysql
#20180731
mysql_tar="mysql-5.6.40.tar.gz"
mysql_dir="mysql-5.6.40"
cmake_tar="cmake-2.8.6.tar.gz"
cmake_dir="cmake-2.8.6"
dest="/service/"

#刪舊版本
rpm -e mariadb-libs  --nodeps &>/dev/null
rpm -e mysql mysql-server --nodeps &>/dev/null
#關防火牆
rpm -q make gcc gcc-c++ &>/dev/null
if [ $? -ne 0 ];then
 yum -y install  make gcc gcc-c++ &>/dev/null
fi
#安裝cmake

cd $dest
tar xf $cmake_tar -C /usr/src/ &>/dev/null
cd /usr/src/$cmake_dir
./configure &>/dev/null && make &>/dev/null  && make install &>/dev/null
#刪除包
rm -fr /usr/src/$cmake_dir &>/dev/null
cd $dest
rm -fr $cmake_tar
#安裝依賴
yum -y install ncurses ncurses-devel &>/dev/null
groupadd mysql &>/dev/null
useradd -M -s /sbin/nologin  -g mysql mysql &>/dev/null
#解壓源碼包

tar xf $mysql_tar -C /usr/src/ &>/dev/null
#安裝
cd /usr/src/$mysql_dir
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql  -DDEFAULT_CHARSET=utf8  -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all  -DSYSCONFDIR=/etc &>/dev/null &&make &>/dev/null &&make install &>/dev/null
#優化
cd /usr/local/mysql
cp support-files/my-default.cnf  /etc/my.cnf &>/dev/null
#安裝數據

yum -y install autoconf &>/dev/null && /usr/local/mysql/scripts/mysql_install_db  --basedir=/usr/local/mysql  --datadir=/usr/local/mysql/data  --user=mysql &>/dev/null
echo "PATH=$PATH:/usr/local/mysql/bin">>/etc/profile
source  /etc/profile &>/dev/null
chown -R mysql:mysql /usr/local/mysql/ &>/dev/null
cp support-files/mysql.server  /etc/init.d/mysqld &>/dev/null
chmod +x /etc/init.d/mysqld
sed -i -e '1a #chkconfig: 35 50 45' /etc/init.d/mysqld
cd $dest
rm -fr /usr/src/$mysql_dir &>/dev/null
rm -fr $mysql_tar

#啓動服務

/usr/sbin/chkconfig --add mysqld
/etc/init.d/mysqld start

3)準備好安裝包

cmake-2.8.6.tar.gz    mysql-5.6.40.tar.gz放到與腳本同一目錄下

4)ansible-playbook setup.yaml

剩下的時間,你能夠喝杯茶了,休息一下。兩臺機器部署完成,登陸下機器看是否服務啓動

mysql -uroot  -p123456  -h ip

成功登陸。

相關文章
相關標籤/搜索