ansible 基本使用

1.安裝ansible eple源

cat <<eof>>/etc/yum.repos.d/my.repo
[epel]
name=epel
baseurl=http://mirrors.aliyun.com/epel/7Server/x86_64/
enable=1
gpgcheck=0
eof

yum -y install ansible 安裝

2.安裝ansible 經常使用幫助

ansible-doc -h #列出相關榜示
[root@4cd65df9495a /]# ansible-doc -l | grep yum#用於列出某個模塊
[root@4cd65df9495a /]# ansible-doc -s yum #獲取參數
-C #不對遠程主機作出一些改變,而是預測某些可能發生的改變
-f #指定並行處理的進程數量,默認爲5個
--list-hosts#不會執行任何操做,而是列出匹配到的主機列表
-m#指定要執行的模塊名,默認的模塊爲"command"
-k #密碼
--syntax-check #檢查語法

3.andible.cfg配置參數

Ansible有不少配置參數,如下是幾個默認的配置參數:node

inventory = /etc/ansible/hosts#inventory的位子
library = /usr/share/my_modules/#模塊的目錄
forks = 5
sudo_user = root
remote_port = 22
host_key_checking = False#設置是否檢查SSH主機的密鑰
timeout = 20#設置SSH鏈接的超時間隔,單位是秒
log_path = /var/log/ansible.log

4.設置互信任配置

python

5.inventory 用於定義ansible要管理的主機

cat -n /etc/ansible/hosts
192.168.100.59:22
192.168.100.60 ansible_ssh_pass='123456' ansible_ssh_port=22
[nginx]#分組
192.168.100.5[7:9]
[nginx:vars]#vars主機變量
ansible_ssh_pass='123456'
[webservers:children]#建立webservers組裏麪包含nginx組
nginx

ansible_ssh_user: ssh登陸的用戶名。默認爲root。
ansible_ssh_pass: ssh登陸遠程用戶時的認證密碼。
ansible_ssh_private_key_file: ssh登陸遠程用戶時的認證私鑰。(?)

6.ansible 經常使用模塊總結

command和shell

默認ansible使用的模塊是command,便可以執行一些shell命令。shell和command的用法基本同樣linux

command不能解析變量(如$HOME)和某些操做符("<", ">", "|", ";"以及"&")nginx

ansible-doc -s shell
- name: Execute commands in nodes.
  action: shell
      chdir       # 在執行命令前,先cd到指定的目錄下
      creates     # 用於判斷命令是否要執行。若是指定的文件(可使用通配符)存在,則不執行。
      removes     # 用於判斷命令是否要執行。若是指定的文件(可使用通配符)不存在,則不執行。

案例git

ansible db -m shell -a "echo '123456' | passwd --stdin alex"#設置alex密碼
ansible db -m shell -a "creates=/tmp pwd"#tmp存在因此跳過
ansible db -m shell -a "creates=/tmp2 pwd"#tmp不存在執行
ansible db -m shell -a "removes=/tmp2 pwd"#不存在 不會執行
ansible db -m shell -a "removes=/tmp pwd"#存在執行

script 執行本地文件

- chdir 切換目錄,編譯安裝
- creates 判斷是否存在,若是存在,就不執行被控機
- removes 判斷是否存在,若是存在,就執行

案例web

ansible db -m script -a "1.sh" #執行本地文件
ansible db -m script -a "creates=/root/11.sh /root/1.sh"#判斷被控機上是否存在11.sh 不存在就執行
ansible db -m script -a "removes=/root/1.sh /root/1.sh"#判斷被控制上是否存在 存在就執行

copy 將本地文件複製遠程機器

- backup#建立一個備份文件 以時間戳幾位
- content#直接往裏面寫內容
- scr#源地址
- dest#目標地址
- owner#屬主
- group#屬組
- follow=[yes|no]   # 是否追蹤到連接的源文件
- mode#權限

案例redis

ansible db -m copy -a "src=/etc/fstab dest=/tmp/f"#把fstabl複製遠控主機/tmp/f 屢次執行不改變 不會覆蓋
ansible db -m copy -a "src=/etc/fstab dest=/tmp/f backup=yes"#以文件名加時間戳的方式 備份遠控主機文件
ansible db -m copy -a "src=/etc/fstab dest=/tmp/f backup=yes owner=sshd group=sshd mode=644"#設置下屬主權限
ansible db -m copy -a "src=/etc/init.d dest=/tmp"#複製整個目錄到tmp 沒加/就是整個目錄
ansible db -m copy -a "src=/etc/init.d/ dest=/tmp"#複製整個目錄下全部的文件到tmp目錄下
ansible db -m copy -a "content='11111' dest=/tmp/b"#往被控端寫內容 會覆蓋

file管理文件、目錄的屬性,也能夠建立文件或目錄。

- path #指定待操做的文件,可以使用別名'dest'或'name'來替代path
- ower#屬主
- group#屬組
- mode#權限
- src #建立連接時使用,指定連接的源文件
- state         # directory:若是目錄不存在則遞歸建立
                # file:文件不存在時,不會被建立(默認值)
                # touch:touch由path指定的文件,即建立一個新文件,或修改其mtime和atime
                # link:修改或建立軟連接
                # hard:修改或建立硬連接
                # absent:目錄和其中的文件會被遞歸刪除,文件或連接將取消連接狀態

案例sql

ansible db -m file -a "path=/tmp/alex1 state=directory owner=xiaoqiang"#建立alex目錄 指定屬主
ansible db -m file -a "path=/tmp/alex1.txt state=touch"#建立文件
ansible db -m file -a "path=/tmp/yum src=/var/log/yum.log state=link"#建立軟連接 連接是被控制本身的
ansible db -m file -a "path=/tmp/yum state=absent"#刪除被控機軟連接

fetch拉取文件到本地

從遠程主機將文件拉取到本地端,存儲時使用主機名做爲目錄樹,且只能拉取文件不能拉取目錄。docker

- dest 目標地址
- src 源地址
ansible db -m fetch -a "src=/var/log/yum.log dest=/tmp"#拉取被控主機yum.log到tmp並以主機ip地址或者主機名爲目錄,而且保留了原來的目錄結構

yum模塊安裝

- name#包名
- state
    install
    remove
disablerepo #禁用某個源
enablerepo #啓用某個源

案例shell

 yum grouplist #查包組信息

ansible db -m yum -a "name=dos2unix"#安裝doc2unix
ansible db -m yum -a "name=dos2unix,nginx"#安裝多個包
ansible db-m yum -a "name='@Development Tools'"#安裝組
ansible db -m yum -a "name=nginx state=absent" #卸載

[root@7065dc05e37c tmp]# rpm -q nginx
nginx-1.12.2-2.el7.x86_64

pip模塊安裝

pip freeze > a.txt #將本地環境導出
pip install -r a.txt #安裝全部的包
pip list #查看全部的包
pip uninstall flask #卸載

- cddir#切換目錄
- name#包名
- requirements #導出的文件
- virtualenv #虛擬環境
ansible db -m pip -a "name=flask"

service模塊

ps -ef|grep nginx #查看進程
ss -tnlp # 查看端口信息
systemctl start nginx # centos7啓動nginx
service nginx start  # centos6啓動nginx
systemctl enable nginx # centos7 開機自啓動
chkconfig nginx on # centos6開機自啓動

案例

ansible web -m service -a 'name=nginx state=started' # 啓動nginx
ansible web -m service -a 'name=nginx state=stopped' # 關閉nginx
ansible web -m service -a 'name=nginx state=started enabled=yes' # 設置開機自啓動

docker run --privileged -ti --name test1 centos /usr/sbin/init #若是用docker 須要加privileged 特權  聽說7.2鏡像已經解決了這個問題

cron計劃任務

* * * * * job 
分 時 日 月 周 任務
0 */2 *  * *  job  每隔兩個小時
0 12,13 * * * job 12點和13點
0 12-17 * * * job 12點到17點
0 12-17/2 * * 1,3,6,0 周1,周3,周6,周7 12點到17點每隔兩個小時 
[root@localhost ~]# cat /etc/crontab 
crontab -e # 編輯計劃任務
crontab -l # 查看計劃任務
crontab -r # 刪除計劃任務

參數

- minute #分鐘
- hour #小時
- day #
- month #
- weekday #
- disabled #禁用crontab 表現形式加#
- name #名稱
- user #用戶

例子

ansible db -m cron -a "minute=12 name=touchfile job='touch /tmp/xiaoqiang'"#每一個小時12分執行 建立touch /tmp/xiaoqiang'
ansible db -m cron -a "name=touchfile state=absent"#刪除
absible db -m cron -a "minute=12 name=touchfile2 job='touch /tmp/xiaoqiang.txt' disabled=yes"#註釋

user模塊

用戶:
    管理員  root 0
    普通用戶
        系統用戶  不能登陸  1-999 centos7 1-499 centos6
        登陸用戶  能夠登陸  1000-65535 centos7 500-65535 centos6
用戶組:
    管理員組 root 0
    系統用戶組 1-999 centos7 1-499 centos6
    登陸用戶組 1000-65535 centos7 500-65535 centos6
    
[root@localhost ~]# useradd -h     #查看useradd的參數
 -d  #指定用戶的家目錄
 -g  #指定用戶的組
 -G  #執行用戶的附加組
 -s  #指定登陸後使用的shell
 -r  #建立一個系統用戶
 useradd -r wusir  #建立系統用戶, 從999倒序
 useradd -s /sbin/nologin alexsb #建立的是普通用戶,從1000開始升序
 useradd -d /opt/alexsb2 alexsb2 #建立用戶時指定用戶的家目錄
 useradd -u 3000 alexsb6 # 建立用戶並指定用戶的uid
 userdel alex #刪除用戶
 userdel -r alexsb2 #刪除用戶並刪除用戶的家目錄
  
  groupadd yuchao #建立用戶組
  groupdel yuchao #刪除用戶組
- group #
- groups#附加組
- home#家目錄
- name#用戶名
- password#密碼
- remove#當remove=yes 刪除用戶且刪除用戶家目錄
- shell#用戶登錄後使用的shell
- system#建立一個系統用戶
- uid#用來指定用戶的id
- state#狀態

例子

ansible db -m user -a "name=alex10 shell=/sbin/nologin home=/opt/alex10 uid=3000 groups=root"#建立一個用戶 指定 home附加組和uid
ansible db -m user -a 'name=alex10 state=absent remove=yes'#刪除一個用戶 並刪除家目錄
ansible db -m user -a 'name=alex10 state=absent'#刪除用戶不刪除家目錄

group模塊

groupadd 
-g 設置id
-r 系統組
超級管理員組 root 0
普通組
    系統組  1-999 centos7 1-499 centos6 從大到小 
    登陸用戶組 1000-65535 centos7 500-65535 centos6
從小到大
查看
tail /etc/group
- git #組的id
- name#組名
- system#系統組

例子

ansible db -m group -a 'name=wulaoshi system=yes' #建立系統組
ansible db -m group -a 'name=wulaoshi state=absent' # 刪除組

playbook

yaml 或yml後綴結尾

json

- 字典 key:value

- 列表 [] \-

```shell
- alex
- wusir
- yantao
- yuchao
[alex,wusir,yantao,yuchao]

-C, --check #白跑,執行可是不會有結果
--list-hosts #列出符合的主機
-f FORKS, --forks=FORKS #作併發
--syntax-check #檢查語法
ansible-playbook --syntax-check
-k, --ask-pass #輸入密碼

- hosts: web #主機列表
  tasks: #任務
  - name: creategroup #任務名稱
    group: name=alex10 #模塊名:參數
  - name: cretaeuser #任務名稱
    user: name=wusir10 #模塊名:參數

單個playbook

- hosts: web
  remote_user: root
  tasks:
  - name: createuser
    user: name=alex20 home=/opt/alex20 uid=4000

多個playbook

- hosts: web
  remote_user: root
  tasks:
  - name: createuser
    user: name=alex20 home=/opt/alex20 uid=4000 
  - name: copyfile
    copy: src=/etc/fstab dest=/tmp/fs


冪等性 沒更改無論執行多少次,獲得的結果都是同樣的 

傳參第一種方式

- hosts: web
  tasks:
  - name: create{{user}}
    user: name={{user}}
ansible
-playbook -e user=wusir20 p3.yml

傳參第二種方式

在配置文件中
[web]
192.168.226.[101:102] user=alex30 192.168.226.104 user=alex100

傳參第三種方式

在配置文件中
[web:vars]#表示組的參數 user=alex31

傳參第四種方式

- hosts: web
  vars:
  - user: alex32
  tasks:
  - name: create{{user}}
    user: name={{user}}

傳參第五種方式

- hosts: web
  tasks:
  - name: yum
    yum: name=bc
  - name: sum
    shell: echo 11+22|bc
    register: user
  - name: echo
    shell: echo {{user.stdout}} > /tmp/echo.txt 
  - name: create{{user.stdout}}
    user: name=alex{{user.stdout}}

優先級

-e > playbook > hosts

setup 收集模塊

ansible db -m setup

ansible db -m setup -a 'filter="*ipv4*"' #過濾某個

ansible_all_ipv4_addresses #全部的ipv4地址
ansible_all_ipv6_addresses #全部的ipv6地址
ansible_architecture #系統的架構
ansible_date_time #系統時間
ansible_default_ipv4 #默認的ipv4地址
    address ip地址
    alias 網卡名稱
    broadcast 廣播地址
    gateway 網關
    netmask 子網掩碼
    network 網段
ansible_default_ipv6 #默認的ipv6地址
ansible_device_links #系統的磁盤信息
ansible_distribution #系統名稱
ansible_distribution_file_variety #系統的基於公司
ansible_distribution_major_version #系統的主版本
ansible_distribution_version #系統的所有版本
ansible_dns #系統的dns 默認udp 端口53
ansible_domain #系統的域 ldap
ipv4 #ipv4地址
ansible_env #系統的環境
ansible_fqdn #系統的完整主機名
ansible_hostname #系統的簡寫主機名
ansible_kernel #系統的內核版本
ansible_machine #系統的架構
ansible_memtotal_mb #系統的內存
ansible_memory_mb #系統的內存使用狀況
ansible_mounts #系統的掛載信息
ansible_os_family #系統家族
ansible_pkg_mgr #系統的包管理工具
ansible_processor #系統的cpu
ansible_processor_cores #每顆cpu的核數
ansible_processor_count #cpu的顆數
ansible_processor_vcpus #cpu的個數=cpu的顆數*每顆cpu的核數
ansible_python #系統python信息
ansible_python_version #系統python的版本
ansible_system #系統名字

tags 單獨執行某一條指令

- hosts: web
  tasks:
  - name: install
    yum: name=redis
  - name: copyfile
    copy: dest=/etc/redis.conf src=/etc/redis.conf
    tags: copy
  - name: start
    service: name=redis state=started

ansible-playbook -t copy p7.yml #只執行copy

handlers 觸發

- hosts: db
  tasks:
  - name : install
    yum : name=redis
    notify: restart
  handlers:
  - name : restart#此name名稱和notify後面的名稱保持一致
    service: name=redis state=started

template

- hosts: web
tasks:
- name: installredis
yum: name=redis
- name: copyfile
template: src=/etc/redis.conf dest=/etc/redis.conf
- name: start
service: name=redis state=started
#在控制端conf中 吧bind修改爲 如下
配置文件: bind {{ ansible_default_ipv4.address }} 

when 條件判斷

- hosts: db
  tasks:
  - name: createfile
    copy: content='111111111111' dest=/tmp/a.txt
    when: a=='1'
  - name: createfile
    copy: content='22222222222' dest=/tmp/a.txt
    when: a=='2'

ansible-playbook -e 'a="3"' when.yml
- hosts: db
  tasks:
  - name: copy
    copy: content='6666666666' dest=/tmp/6.txt
    when: ansible_distribution_major_version=="6"
  - name: copy
    copy: content='777777777' dest=/tmp/7.txt
    when: ansible_distribution_major_version=="7"

with_items循環

- hosts: db
  tasks:
  - name: createuser
    user: name={{item}}
    with_items:
    - alex50
    - wuser50
    - taibai50

嵌套循環

- hosts: web
  tasks:
  - name: crateuser
    user: name={{item.name}}  group={{item.group}}
    with_items:
    - {"name":alex52,"group":alex60}
    - {"name":wusir52,"group":wusir60}
    - {"name":taibai52,"group":taibai60}

yuml定時任務

- hosts:db
  tasks:
  - name: cron
    cron: hour=02 minute=30 job='tar zcf `date +%F`_etc.tar.gz /etc'

nginx基於uwsgi部署Django回顧

1.安裝nginx

yum install -y nginx(須要epel源)

2.安裝uwsgi

yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel python-devel
pip install uwsgi

3.安裝django

pip install django==1.11

4.建立django項目

#/data   目錄下建立mysite項目
django-admin startproject mysite

5.建立app

python manage.py startapp app01

6.修改mysite/settings.py

ALLOWED_HOSTS = ['*']

7.關閉防火牆

關閉內置防火牆selinux

#暫時中止selinxu
setenforce 0
#永久關閉selinux
vi /etc/selinux/conf 
修改以下行
SELINUX=enforcing
重啓機器,使得selinx永久關閉

關閉軟件防火牆

iptables -F    #清空防火牆規則
systemctl stop firewalld     #關閉軟件防火牆
systemctl disable  firewalld  #刪除iptables的開機自啓

八、uwsgi配置文件

複製代碼
uwsgi支持ini、xml等多種配置方式,本文以 ini 爲例, 在/etc/目錄下新建uwsgi.ini,添加以下配置:
#三種配置方法可任選其中一種,選擇哪一種則將哪一種的註釋打開便可
[uwsgi]
http = 0.0.0.0:8000      #第一種配置方法
#socket = 0.0.0.0:8000    #第二種配置方法
#the local unix socket file than commnuincate to Nginx
#socket = /data/mysite/mysite.socket   #第三種配置方法
# the base directory (full path)
chdir = /data/mysite
# Django's wsgi file
wsgi-file = mysite/wsgi.py
# maximum number of worker processes
processes = 4
#thread numbers startched in each worker process
threads = 2
# clear environment on exit
vacuum          = true
daemonize = /data/mysite/uwsgi.log
py-autoreload=1
複製代碼

第一種使用http = 0.0.0.0:8000,對應nginx配置文件以下:

vi /etc/nginx/nginx.conf

location / {
        include  /etc/nginx/uwsgi_params;
        proxy_pass http://127.0.0.1:8000;
        }

第二種使用socket = 0.0.0.0:8000,對應nginx配置文件以下:

vi /etc/nginx/nginx.conf

location / {
        include  /etc/nginx/uwsgi_params;
        uwsgi_pass 127.0.0.1:8000;
        }

第三種使用socket = /data/mysite/mysite.socke,對應nginx配置文件以下:

vi /etc/nginx/nginx.conf

location / {
        include  /etc/nginx/uwsgi_params;
        uwsgi_pass unix:/data/mysite/mysite.socket;
        }

啓動uwsgi

uwsgi --ini /etc/uwsgi.ini

啓動nginx

systemctl start nginx

ansible之roles

以前咱們已經瞭解tasks和handlers,那怎麼組織playbook纔是最好的方式 用roles

Roles一個已知文件結構 自動加載vars files tasks handlers,基於roles對內容進行分組,使得咱們能夠與其餘用戶分享roles

文件夾裏面是要建立的每個角色,每個角色一個文件夾

每個角色裏面都有tasks(必須的),templates,files,handlers,vars目錄

#roles文件目錄樹參考以下:
--roles文件夾
    --角色1文件夾
           --templates
           --files
           --tasks
        --main.yml
           --vars
           --handlers
        --main.yml
    --角色2文件夾
           --templates
           --files
           --tasks
        --main.yml
           --vars
           --handlers
        --main.yml

roles/nginx/
├── files -- 靜態文件
│   └── c.txt
├── handlers -- 觸發的任務
│   └── main.yml
├── tasks -- 任務(必須的)
│   ├── copyfile.yml
│   ├── install.yml
│   ├── main.yml
│   └── start.yml
├── templates -- 動態文件,須要傳遞參數
│   └── nginx.conf
└── vars -- 變量
└── main.yml

查找順序

- 主文件看到roles,就回去roles目錄下面找對應的目錄
- 先去tasks目錄裏面找main.yml文件,若是遇到import_task則加載任務
- 若是遇到了template,則去templates目錄裏面找文件
- 若是遇到了copy,則去files目錄裏面找文件
- 若是遇到了變量,則去vars目錄裏面找main.yml文件
- 若是遇到了notify,則去handlers目錄裏面找main.yml文件

setenforce 0

還能夠在劇本以前使用

wsgi是用nginx的 install.yml

 

 

ansible_playbooks

  roles文件夾

    nginx文件

                   files文件

                    handlers文件

                         main.yml

                           - name: restart nginx

                           service: name=nginx state=reloaded

                    tasks文件

                         install.yml

                            - name: install nginx
                              yum: name=nginx
                            - name: confignginx
                              template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
                              notify:
                               - restart nginx
                            - name: start
                              service: name=nginx state=started

                          main.yml

                            - import_tasks: install.yml

                    templates文件

                          nginx.conf.j2

                    vars文件

         nginx.yml

 

練習 用roles 載安裝nginx+uwsgi+mariadb + redis的目錄框架

相關文章
相關標籤/搜索