ansiable安装与使用(二)

文章目录

  • 一、Ansible-playbook 使用介绍
  • 二、Ansible-playbook 替换nginx配置文件
  • 三、playbook 检出svn代码
  • 四、playbook yum安装nginx
  • 五、创建rolse yum安装nginx

一、Ansible-playbook 使用介绍

用法:
Ansible-playbook [剧本文件名.yml] #执行yaml文件
ansible-playbook test.yml --syntax-check #检查yaml文件语法
ansible-playbook -C test.yml #在本地预测试,类似–syntax-check

-k(–ask-pass) 用来交互输入ssh密码
-K(-ask-become-pass) 用来交互输入sudo密码
-u 指定用户

    # ansible-playbook a.yml --syntax-check    #检查yaml文件的语法是否正确
    # ansible-playbook a.yml --list-task       #检查tasks任务
    # ansible-playbook a.yml --list-hosts      #检查生效的主机
    # ansible-playbook a.yml --start-at-task='Copy Nginx.conf'     #指定从某个task开始运行

剧本存放目录:/etc/ansible/roles/

剧本: 就是以.yml结尾的可执行文件

ansible剧本详细介绍:https://blog.51cto.com/13630803/2154192

执行yaml文件的注意事项

1、Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。
2、在运行playbook时(从上到下执行),如果一个host执行task失败,整个tasks都会回滚,请修正playbook 中的错误,然后重新执行即可。
Task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行时幂等的,这意味着多次执行是安全的,因为其结果一致。
3、每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。如果没有定义name,‘action’的值将会用作输出信息中标记特定的task。
4、定义一个task,常见的格式:”module: options” 例如:yum: name=httpd
5、ansible的自带模块中,command模块和shell模块无需使用key=value格式

剧本内容说明与语法介绍:
在语法上必须上下对齐,比如hosts和tasks必须对齐,否则会报错

剧本分为以下几部分组成:

---                       # 顶头三个[-]开头,类似shell的#!/bin/bash 【一、声明这是playbook文件】
- hosts: web-app          # 顶头一个[-]表示一个项目的开始,空格[hosts]定义ansible主机列表【二、主机列表】
  remote_user: root       # [remote_user]定义主机列表中用于执行命令的用户【三、执行用户】
  become: yes             # 2.6版本以后的参数,之前是sudo,意思为切换用户运行
  become_user: mysql      # 指定sudo用户为mysql

  tasks:                                        # 定义任务列表【四、任务列表】
  - name: add user nginx                        # 注意[-]后面有空格,任务列表名称(第一条任务说明)
    user: name=nginx state=present              # 调用[user]模块创建nginx用户,状态为立即创建,可以看帮助[ansible-doc user>]

  - name: add group nginx                       # 任务列表名称(第二条任务说明)
    group: name=nginx state=present             # 调用[group]模块创建nginx组,状态为立即创建

  - name: install nginx                         # 任务列表名称(第三条任务说明)
    yum: name=nginx state=present               # 调用[yum]模块安装nginx,状态为立即安装

  - name: start nginx                           # 任务列表名称(第四条任务说明)
    service: name=nginx state=started           # 调用[service]模块启动nginx,状态为立即启动
      
  - name: scripts test
    command: /bin/bash /home/shell/test.sh

二、Ansible-playbook 替换nginx配置文件

1、ansible本机和远端服务器都安装好nginx,然后通过ansible-playbook 直接将Ansible本机的nginx.conf 替换到远端服务器就可以了(回滚也一样)

注意:如果主机列表有300台主机,但其中35台命令没有执行成功怎么办?没关系,ansible 可以执行多次,因为ansible会自动判断配置文件是否发生改变,如果配置文件没有发生改变是不会做修改操作的,只有配置文件发生改变才会覆盖并备份
比如:
copy模块
源文件与目标文件内容相同,则不做修改
源文件与目标文件内容不同,执行备份并覆盖目标文件

command模块之start
目标nginx服务状态为start,则不做修改
目标nginx服务状态为stop,则执行start命令

[root@localhost roles]# cat /etc/ansible/roles/nginx.yml 
---                                        #书写格式声明,类似于#/bin/bash

- hosts: web-app                           #远程主机列表
  remote_user: root                        #远程主机执行命令用户

  tasks:                                   #定义任务列表
    - name: cp nginx.conf                  #任务列表名称(第一条任务说明)
      copy: src=/etc/nginx/nginx.conf  dest=/etc/nginx/nginx.conf  backup=yes   调用copy模块拷贝文件到远端主机并备份

    - name: restart nginx                  #任务列表名称(第二条任务说明)
      command: /etc/init.d/nginx restart   #调用command模块,启动nginx

    - name: check nginx Port               #任务列表名称(第三条任务说明)
      shell: netstat -npult |grep nginx    #调用command模块,查看nginx是否启动

    - name: chkconfig nginx add            #任务列表名称(第四条任务说明)
      shell: echo -e "#nginx start \n/etc/init.d/nginx start" >> /etc/rc.local       #加入开机启动 

2、使用ansible-playbook 命令执行(没报错表示成功)

[root@localhost roles]# ansible-playbook /etc/ansible/roles/nginx.yml 

PLAY [web-app] *****************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************
ok: [172.16.12.1]
ok: [172.16.12.5]
ok: [172.16.12.7]

TASK [cp nginx.conf] ***********************************************************************************************************
ok: [172.16.12.1]
ok: [172.16.12.5]
ok: [172.16.12.7]

TASK [restart nginx] ***********************************************************************************************************
changed: [172.16.12.1]
changed: [172.16.12.5]
changed: [172.16.12.7]

TASK [check nginx Port] ********************************************************************************************************
changed: [172.16.12.1]
changed: [172.16.12.5]
changed: [172.16.12.7]

PLAY RECAP *********************************************************************************************************************
172.16.12.1                : ok=4    changed=2    unreachable=0    failed=0   
172.16.12.5                : ok=4    changed=2    unreachable=0    failed=0   
172.16.12.7                : ok=4    changed=2    unreachable=0    failed=0  

三、playbook 检出svn代码

1、安装svn服务
2、通过ansible控制webserver组中的服务器检出代码到本地/var/www/html/project1目录

# ansible webserver -a "svn checkout svn://192.168.1.10/project1 /var/www/html/project1 --force --username="wenqiang" --password="wenqiang123" --non-interactive"

四、playbook yum安装nginx

一、编写playbook安装nginx

1、环境
在这里插入图片描述
2、编写playbook
index.html和nginx.conf.j2需要提前准备好

[root@localhost-10 ~]# cat /etc/ansible/myyaml/nginx.yaml 
---
- hosts: webservers
  tasks:

  # 创建组并制定组ID
  - name: create group
    group: name=nginx gid=300

  # 创建用户并加入组,system表示系统用户,shell表示登陆shell
  - name: create user
    user: name=nginx uid=300 groups=nginx system=yes shell=/sbin/nologin

  # 安装扩展包
  - name: install epel-release pachage
    yum: name=epel-release state=present

  # 安装nginx软件包
  - name: install nginx
    yum: name=nginx state=present

  # 拷贝配置文件
  - name: copy nginx.conf
    template: src=./nginx.conf.j2 dest=/etc/nginx/nginx.conf

  # 拷贝index.html文件
  - name: copy index.html
    copy: src=./index.html  dest=/usr/share/nginx/html/index.html

  # 启动nginx服务并设置开机启动
  - name: restart nginx
    service: name=nginx state=started enabled=yes

3、修改nginx.conf.j2文件

# cat /etc/ansible/myyaml/nginx.conf.j2
worker_processes {{ ansible_processor_vcpus }};  # 远端服务器cpu总核数【系统cpu的总个数=cpu的颗数*每颗CPU的核数】

4、测试nginx.yaml语法并预测试

# ansible-playbook -i /etc/ansible/hosts  nginx.yaml --syntax-check  # 检测语法
# ansible-playbook -i /etc/ansible/hosts -C nginx.yaml  # 预测试

5、执行nginx.yaml

# ansible-playbook -i /etc/ansible/hosts  nginx.yaml

6、访问测试

# curl  http://192.168.1.13
hello ansible

# curl  http://192.168.1.14
hello ansible

五、创建rolse yum安装nginx

一、roles介绍
roles表示角色的意思,主要对playbook文件实行目录结构规范,把原来写在一个剧本里面的文件、模块、任务、变量,拆开放入多个目录中,方便日后调用和维护,使之更加结构化。

1、角色(roles)目录结构如下
角色文件(nginx.yaml)需要和roles处于同级目录
main.yaml文件是管理其他yaml的文件,使用include就能调用其他yaml文件

# tree /root/ansible/
/root/ansible/
├── mysql_role.yaml
├── nginx_role.yaml                  # 这是nginx角色文件,这个文件需要和roles处于同级目录
├── php_role.yaml
└── rolse                            # 用于存放角色文件的目录
    ├── mysql                        # 第一个角色文件
    │   ├── files
    │   ├── handlers
    │   ├── tasks
    │   ├── templates
    │   └── vars
    ├── nginx                        # nginx角色文件对应的nginx角色目录,由nginx_role.yaml文件调用
    │   ├── files                    # 存放一些文件或包,可以由copy模块调用
    │   │   └── index.html
    │   ├── handlers                 # 该目录中的文件由task中的任务来触发,通常由notify触发
    │   │   └── main.yaml
    │   ├── tasks                    # 任务目录,里面存放nginx的主要安装文件
    │   │   ├── copy.yaml
    │   │   ├── group.yaml
    │   │   ├── install.yaml
    │   │   ├── main.yaml            # 其他yaml文件都由main.yaml来管理和调用(使用include调用)
    │   │   ├── start.yaml
    │   │   └── user.yaml
    │   ├── templates                # 存放模板文件的目录,比如一些配置文件,由template模块调用
    │   │   └── nginx.conf.j2
    │   └── vars                     # 存放变量的目录
    │       └── main.yaml
    └── php                          # 第三个角色文件
        ├── files
        ├── handlers
        ├── tasks
        ├── templates
        └── vars

二、通过roles实现nginx的部署

1、先创建nginx角色的目录结构和相关文件
之前通过一个剧本文件(playbook)就可以完成nginx的安装,这次将使用rolse来完成:创建组、创建用户、拷贝文件、安装epel-release和安装nginx、启动nginx

(1) 先创建存放角色的roles目录
[root@localhost-11 ~]# mkdir -p /home/ansible/roles

(2) 再创建nginx角色目录
[root@localhost-11 ~]# mkdir -p /home/ansible/roles/nginx/{files,handlers,tasks,templates,vars}

(3) 创建main.yaml文件、index.html文件、nginx.conf.j2文件
# cd /home/ansible/roles/
# echo "hello ansible" >>  nginx/files/index.html
# touch nginx/tasks/main.yaml
# cp /etc/nginx/nginx.conf nginx/templates/nginx.conf.j2  # 提前准备好nginx配置文件并做好优化

(4) 修改nginx.conf.j2文件
# cat /home/ansible/roles/nginx/templates/nginx.conf.j2
worker_processes {{ ansible_processor_vcpus }};  # 远端服务器cpu总核数【系统cpu的总个数=cpu的颗数*每颗CPU的核数】
include /etc/nginx/conf.d/*.conf;                # 虚拟主机存放目录

(5) 创建虚拟主机模板文件
# cp /alidata/nginx/conf.d/vhost.conf /home/ansible/roles/nginx/templates/vhosts.conf.j2
# cat /home/ansible/roles/nginx/templates/vhosts.conf.j2 
server {
        listen        80;
        server_name  www.abc.org; 
        location / {
            # root   html;           # 默认站点目录(/alidata/server/nginx-1.11.10/html/)
            root   /alidata/www/www_xialan_com;     # 自定义站点目录
            index  index.php  index.html index.htm;
	   }

        # 禁止访问.svn|.git|.cvs结尾的文件或目录
	    location ~ .*.(svn|Git|cvs) {
        deny all;
        }
}

2、创建nginx_role.yaml文件
该文件需要和roles处于同级目录
通过该文件去调用/home/ansible/roles/下的nginx角色目录

# cd /home/ansible/
# cat nginx_role.yaml 
---
  # 指定主机组
- hosts: webservers
  # 调用roles模块:创建role、version变量,这里的nginx就是nginx目录角色
  roles:
  - { role: nginx, version: 1.16.1 }

3、进入/home/ansible/tasks/目录创建相关任务文件

# cd /home/ansible/roles/nginx/tasks/

(1) 创建 group.yaml
# cat group.yaml 
- name: create group
  # 调用group模块:创建nginx组并指定gid
  group: name=nginx gid=300
    
(2) 创建 user.yaml
# cat user.yaml 
- name: create user
  # 调用user模块:创建nginx用户并制定uid,加入nginx组,system表示系统用户,shell表示登陆环境
  user: name=nginx uid=300 groups=nginx system=yes shell=/sbin/nologin
        
(3) 创建 install.yaml
# cat install.yaml 
- name: install epel-release package
  # 调用yum模块:安装扩展包
  yum: name=epel-release state=present

- name: install nginx package
  # 调用yum模块: 安装nginx并制定版本  state表示动作, present表示立即安装
  yum: name=nginx-{{ version }} state=present
    
(4) 创建 copy.yaml
# cat copy.yaml 
- name: create site directory
  # 调用file模块: 创建站点目录
  file: name=/alidata/www/www_xialan_com  state=directory

- name: copy index.html
  # 调用copy模块:src表示原文件会自动去files中找 dest表示目标路径
  copy: src=index.html  dest=/alidata/www/www_xialan_com/index.html

- name: copy nginx.conf
  # 调用template模块:src表示原文件会自动去templates目录中找 dest表示目标路径
  template: src=nginx.conf.j2  dest=/etc/nginx/nginx.conf
        
(5) 创建vhosts.yaml
# cat vhosts.yaml 
- name: create vhosts
  # 调用template模板:将templates目录中的虚拟站点文件拷贝到目标目录
  template: src=vhosts.conf.j2  dest=/etc/nginx/conf.d/vhosts.conf
        
(6) 创建start.yaml
# cat start.yaml 
- name: start nginx
  # 调用service模板:启动nginx并加入开机启动
  service: name=nginx state=started enabled=yes

(7) 编辑main.yaml
# cat main.yaml 
- include: group.yaml    # 第一步创建组
- include: user.yaml     # 第二步创建用户
- include: install.yaml  # 第三部安装软件包
- include: copy.yaml     # 第四步拷贝配置文件
- include: vhosts.yaml   # 第五步创建虚拟主机
- include: start.yaml    # 第六步启动nginx

4、检查语法和预测试

# ansible-playbook -i /etc/ansible/hosts /home/ansible/nginx_role.yaml --syntax-check
playbook: /home/ansible/nginx_role.yaml
    
# ansible-playbook -i /etc/ansible/hosts -C /home/ansible/nginx_role.yaml

5、执行nginx_role.yaml文件

# ansible-playbook -i /etc/ansible/hosts /home/ansible/nginx_role.yaml 

PLAY [webservers] *************************************************************************************

TASK [Gathering Facts] ********************************************************************************
ok: [192.168.1.14]
ok: [192.168.1.13]

TASK [nginx : create group] ***************************************************************************
changed: [192.168.1.14]
changed: [192.168.1.13]

TASK [nginx : create user] ****************************************************************************
changed: [192.168.1.13]
changed: [192.168.1.14]

TASK [nginx : install epel-release package] ***********************************************************
changed: [192.168.1.14]
changed: [192.168.1.13]

TASK [install nginx package] **************************************************************************
changed: [192.168.1.13]
changed: [192.168.1.14]

TASK [nginx : copy index.html] ************************************************************************
changed: [192.168.1.13]
changed: [192.168.1.14]

TASK [copy nginx.conf] ********************************************************************************
ok: [192.168.1.13]
ok: [192.168.1.14]

TASK [start nginx] ************************************************************************************
changed: [192.168.1.13]
changed: [192.168.1.14]

PLAY RECAP ********************************************************************************************
192.168.1.13               : ok=8    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.1.14               : ok=8    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

6、测试结果

# curl http://www.abc.org
hello ansible

你可能感兴趣的:(ansible,ansible)