Ansible实战

栏目: 服务器 · 发布时间: 5年前

内容简介:注意点:1、添加密钥2、设置sudo免密

本文,目标是使用ansible安装lnmp+haproxy。

共四台主机,都是ubuntu14 server版,一台作为ansible管理机,另外三台作为ansible客户机用来部署服务。

客户机A安装nginx+php+mysql,客户机B安装nginx+php,客户机C安装haproxy用来负载均衡。如下图:

Ansible实战

设计

项目结构参考 最佳实践-Content Organization ,如下图:

Ansible实战

注意点:

  • 角色分配简单明确。
  • 在hosts中分组添加变量,指定安装软件。
  • 二次执行脚本时不能影响已经安装的服务。

安装流程

1、添加密钥

2、设置sudo免密

3、更新安装源

4、时间同步

5、安装nginx+php+mysql+haproxy

6、检查安装

实践

文件准备

1、创建项目lnmp

mkdir lnmp && cd lnmp

2、创建角色目录

mkdir roles

mkdir -p roles/{1_key,2_sudo,3_sources,4_chrony,5_software,6_check}/{tasks,handlers,vars,files,templates}

3、创建变量目录

mkdir group_vars host_vars

4、创建hosts文件,分配安装组,内容如下:

[base]
192.168.56.102
192.168.56.103
192.168.56.104

[nginx_php_mysql]
192.168.56.102

[nginx_php]
192.168.56.103

[haproxy]
192.168.56.104

[base:vars]
install_nginx=false
install_php=false
install_mysql=false
install_haproxy=false

[nginx_php_mysql:vars]
install_nginx=true
install_php=true
install_mysql=true
install_haproxy=false

[nginx_php:vars]
install_nginx=true
install_php=true
install_mysql=false
install_haproxy=false

[haproxy:vars]
install_nginx=false
install_php=false
install_mysql=false
install_haproxy=true

5、创建site.yml文件,内容为:

---
- hosts: all
  gather_facts: false
  roles:
    - 1_key
    - 2_sudo
    - 3_sources
    - 4_chrony
    - 5_software
    - 6_check

6、关闭第一次使用ansible连接客户端时命令提示

sudo vim /etc/ansible/ansible.cfg ,如下修改

# line 62, uncomment
host_key_checking = False

添加密钥

1、设置用户和密码

vim group_vars/base.yml ,内容为:

---
ansible_ssh_user: voidking
ansible_ssh_pass: voidking
ansible_sudo: voidking
ansible_sudo_pass: voidking

2、 vim test.yml ,内容为:

---
- hosts: all
  vars_files:
    - group_vars/base.yml
  roles:
    - 1_key

3、 vim roles/1_key/tasks/main.yml ,内容为:

---
- name: copy public key
  copy:
    src: /home/voidking/.ssh/id_rsa.pub
    dest: /home/voidking/.ssh/id_rsa.pub.tmp
    owner: voidking
    group: voidking
    mode: 0600
    force: yes
- name: add public key
  shell: cd /home/voidking/.ssh && cat id_rsa.pub.tmp | tee >> authorized_keys

4、 vim test_hosts ,内容为:

[test]
192.168.56.102

5、执行脚本

ansible-playbook test.yml -i test_hosts --syntax-check
ansible-playbook test.yml -i test_hosts

Ansible实战

5、在客户端查看结果

ll .ssh
Ansible实战

6、测试登录

ssh voidking@192.168.56.102
Ansible实战

sudo免密

1、 vim test.yml ,内容为:

---
- hosts: all
  vars_files:
    - group_vars/base.yml
  roles:
    #- 1_key
    - 2_sudo

2、 vim roles/2_sudo/tasks/main.yml ,内容为:

---
- name: add sudo user
  shell: 'sudo sh -c "echo voidking ALL = NOPASSWD: ALL >> /etc/sudoers"'
  #shell: 'echo "voidking ALL = NOPASSWD: ALL" | sudo tee >> /etc/sudoers'

3、执行脚本

ansible-playbook test.yml -i test_hosts --syntax-check
ansible-playbook test.yml -i test_hosts -s

Ansible实战

4、在客户端查看结果

sudo ls

sudo免密2

上面的方法,虽然成功添加了sudo,但是从提示我们看出,在 shell 模块中sudo马上就不能使用了。

1、 vim roles/2_sudo/tasks/main.yml ,修改如下:

---
- name: add sudo user
  become_user: root
  become: true
  shell: "echo voidking ALL = NOPASSWD: ALL >> /etc/sudoers"

2、执行脚本

ansible-playbook test.yml -i test_hosts --syntax-check
ansible-playbook test.yml -i test_hosts

更新安装源

1、 vim test.yml ,内容为:

---
- hosts: all
  vars_files:
    - group_vars/base.yml
  roles:
    #- 1_key
    #- 2_sudo
    - 3_sources

2、 vim roles/3_sources/files/sources.list ,内容为:

deb http://cn.archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse
deb http://cn.archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://cn.archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://cn.archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse
##測試版源
deb http://cn.archive.ubuntu.com/ubuntu/ trusty-proposed main restricted universe multiverse
# 源碼
deb-src http://cn.archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://cn.archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://cn.archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://cn.archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse
##測試版源
deb-src http://cn.archive.ubuntu.com/ubuntu/ trusty-proposed main restricted universe multiverse
# Canonical 合作夥伴和附加
# deb http://archive.canonical.com/ubuntu/ trusty partner
# deb http://extras.ubuntu.com/ubuntu/ trusty main

3、 vim roles/3_sources/tasks/main.yml ,内容为:

---
- name: replace sources.list
  copy:
    src: ../files/sources.list
    dest: /etc/apt/sources.list
    force: yes
- name: update
  become_user: root
  become: true
  shell: apt update
- name: upgrade
  become_user: root
  become: true
  apt:
    upgrade: yes

4、执行脚本

ansible-playbook test.yml -i test_hosts --syntax-check
ansible-playbook test.yml -i test_hosts

Ansible实战

时间同步

管理机准备

1、管理机安装chrony

apt -y install chrony

2、重启chrony

service chrony restart

3、拷贝chrony.conf

cp /etc/chrony/chrony.conf roles/4_chrony/files/

4、 vim roles/4_chrony/files/chrony.conf ,如下修改:

# line 20,comment
#server 0.debian.pool.ntp.org offline minpoll 8
#server 1.debian.pool.ntp.org offline minpoll 8
#server 2.debian.pool.ntp.org offline minpoll 8
#server 3.debian.pool.ntp.org offline minpoll 8
# line 24,add
server 192.168.56.101 iburst

playbook配置

1、 vim test.yml ,内容为:

---
- hosts: all
  vars_files:
    - group_vars/base.yml
  roles:
    #- 1_key
    #- 2_sudo
    #- 3_sources
    - 4_chrony

2、 vim group_vars/base.yml ,内容为:

---
ansible_ssh_user: voidking
ansible_ssh_pass: voidking
ansible_sudo: voidking
ansible_sudo_pass: voidking
ansible_become_user: root
ansible_become_pass: voidking
ansible_become: true

3、 vim roles/4_chrony/tasks/main.yml ,内容为:

---
- name: install chrony
  apt:
    name: chrony
    state: latest
- name: change config
  copy: 
    src: ../files/chrony.conf 
    dest: /etc/chrony/chrony.conf
    owner: root
    group: root
    mode: 0644
    force: yes
- name: restart chrony
  service:
    name: chrony
    state: restarted

4、执行脚本

ansible-playbook test.yml -i test_hosts --syntax-check
ansible-playbook test.yml -i test_hosts

Ansible实战

5、在客户机验证chrony

chronyc sources
Ansible实战

安装核心软件

1、 vim test_hosts ,内容为:

[test]
192.168.56.102

[test:vars]
install_nginx=true
install_php=true
install_mysql=true
install_haproxy=true

2、 vim test.yml ,内容为:

---
- hosts: all
  vars_files:
    - group_vars/base.yml
  roles:
    #- 1_key
    #- 2_sudo
    #- 3_sources
    #- 4_chrony
    - 5_software

3、 vim roles/5_software/tasks/main.yml ,内容为:

---
- name: install nginx
  apt:
    name: nginx
    state: latest
  when: install_nginx
- name: install php
  apt:
    name: "{{item}}"
    state: latest
    update_cache: yes
  with_items:
    - php5
    - libapache2-mod-php5
    - php5-mcrypt
    - php5-curl
    - php5-imagick
    - php5-cli
    - php5-json
    - php5-fpm
    - php5-mysql
  when: install_php
- name: install mysql
  apt:
    name: "{{item}}"
    state: latest
  with_items:
    - mysql-common
    - mysql-server
    - mysql-client
    - python-mysqldb
  when: install_mysql
- name: config mysql passwd
  mysql_user:
    login_user: root
    login_password: "\n"
    name: root
    password: "voidking"
    host: "{{item}}"
    priv: '*.*:ALL,GRANT'
    state: present
    check_implicit_admin: yes
  with_items:
    - "localhost"
    - "%"
  when: install_mysql
- name: comment bind-address
  shell: sed -i 's/^bind-address/#bind-address/g' /etc/mysql/my.cnf
  when: install_mysql
- name: restart mysql service
  service: 
    name: mysql 
    state: restarted
    enabled: true
  when: install_mysql
- name: install haproxy
  apt:
    name: haproxy
    state: latest
  environment:
    RUNLEVEL: 1
  when: install_haproxy
- name: config haproxy
  shell: sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/haproxy
  when: install_haproxy
- name: config haproxy port
  copy: 
    src: ../files/haproxy.cfg
    dest: /etc/haproxy/haproxy.cfg
    force: yes
  when: install_haproxy
- name: restart haproxy
  service:
    name: haproxy
    state: restarted
  when: install_haproxy

4、 vim roles/5_software/files/haproxy.cfg ,内容为

global
  log /dev/log    local0
  log /dev/log    local1 notice
  chroot /var/lib/haproxy
  user haproxy
  group haproxy
  daemon

defaults
  log     global
  mode    http
  option  httplog
  option  dontlognull
  contimeout 5000
  clitimeout 50000
  srvtimeout 50000
  errorfile 400 /etc/haproxy/errors/400.http
  errorfile 403 /etc/haproxy/errors/403.http
  errorfile 408 /etc/haproxy/errors/408.http
  errorfile 500 /etc/haproxy/errors/500.http
  errorfile 502 /etc/haproxy/errors/502.http
  errorfile 503 /etc/haproxy/errors/503.http
  errorfile 504 /etc/haproxy/errors/504.http

frontend http_front
  bind *:8080
  stats uri /haproxy?stats
  default_backend http_back

backend http_back
  balance roundrobin
  option httpchk GET /index.html
  option forwardfor header X-Forwarded-For
  server node1 192.168.56.102:80 check inter 2000 rise 3 fall 3 weight 30
  server node2 192.168.56.103:80 check inter 2000 rise 3 fall 3 weight 30

5、执行脚本

ansible-playbook test.yml -i test_hosts --syntax-check
ansible-playbook test.yml -i test_hosts

6、在客户机测试

mysql -uroot -p -h 192.168.56.102
Ansible实战

curl localhost
Ansible实战

curl localhost:8080
Ansible实战

整合所有步骤

1、执行脚本

ansible-playbook site.yml -i hosts --syntax-check
ansible-playbook site.yml -i hosts

2、查看安装

curl 192.168.56.102
curl 192.168.56.103
curl 192.168.56.104:8080

检查安装

1、 vim site.yml ,修改为:

---
- hosts: all
  gather_facts: false
  roles:
    #- 1_key
    #- 2_sudo
    #- 3_sources
    #- 4_chrony
    #- 5_software
    - 6_check

2、 vim roles/6_check/tasks/main.yml ,内容为:

---
- name: copy index.html
  template:
    src: ../templates/index.j2
    dest: /usr/share/nginx/html/index.html
    force: yes
  when: install_nginx

3、 vim roles/6_check/templates/index.j2 ,内容为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Home Page</title>
</head>
<body>
    {{ ansible_eth0.ipv4.address }}
</body>
</html>

PS:查看变量 ansible 192.168.56.102 -m setup > var.txt

4、执行脚本

ansible-playbook site.yml -i hosts --syntax-check
ansible-playbook site.yml -i hosts

5、测试访问

curl 192.168.56.104:8080
Ansible实战

多次执行,可以看到两个不同的IP会来回切换。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

编码

编码

查尔斯•佩措尔德 (Charles Petzold) / 左飞、薛佟佟 / 电子工业出版社 / 2012-10-1 / 59.00元

编码:隐匿在计算机软硬件背后的语言,ISBN:9787121181184,作者:(美)佩措尔德(Petzold,C.)著 左飞,薛佟佟译一起来看看 《编码》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

SHA 加密
SHA 加密

SHA 加密工具