打开git bash 连接ansible服务器,然后进入deploy用户

#ssh root@192.168.96.188

进入python3.6虚拟环境

#su - deploy

#source .py3-a2.5-env/bin/activate

加载ansible 2.5版本

#source .py3-a2.5-env/ansible/hacking/env-setup -q

验证ansible加载效果

#ansible-playbook --version

1、File模块

登录到目标主机进行预配置工作

#ssh root@test.example.com

创建两个系统用户

# useradd foo
# useradd deploy

 

登出,回到ansible的主机,进入到test_playbooks目录。编辑主任务文件,添加测试任务。保存退出

# vi roles/testbox/tasks/main.yml

ansible 执行shell返回结果 ansible shell例子_nginx

- name: create a file            # 创建文件file
  file: 'path=/root/foo.txt state=touch mode=0755 owner=foo group=foo'
 
#path为文件路径 #state为所用命令 #mode 为文件权限 #owner 为设置的系统用户名称 #group 为宿主

执行测试任务

# ansible-playbook -i inventory/testenv ./deploy.yml

ansible 执行shell返回结果 ansible shell例子_nginx_02

查看文件是否创建成功

# ssh root@test.example.com ls -l /root/foo.txt

创建安装nginx需要的文件,复制下面的脚本,进行保存

# vi roles/testbox/files/nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

2、Copy模块

先创建一个files目录,在目录下创建一个脚本文件,添加一下内容,保存退出

# mkdir roles/testbox/files

# vi roles/testbox/files/foo.sh

echo "This is a test script"

编辑主任务配置文件,保存退出。

 # vi roles/testbox/tasks/main.yml

ansible 执行shell返回结果 ansible shell例子_配置文件_03

- name: copy a file
  copy: 'remote_src=no src=roles/testbox/files/foo.sh dest=/root/foo.sh mode=0644 force=yes'

#remote_src 定义当前拷贝任务是将ansible本地server文件传送到目标主机中

#src 本地文件 传送  #dest 目标主机文件

#mode 设置文件权限  #force 定义拷贝任务强制执行

编辑好文件之后,执行任务

# ansible-playbook -i inventory/testenv ./deploy.yml

ansible 执行shell返回结果 ansible shell例子_ansible 执行shell返回结果_04

3、Stat模块、Debug模块

编辑主任务配置文件,添加以下内容

#  vi roles/testbox/tasks/main.yml

# 获取远程foo.sh的文件状态信息
- name: check if foo.sh exists
  stat: 'path=/root/foo.sh'
  register: script_stat
# 将stat文件信息,放到when的判断语句中,如果判断成功,dubug输出foo.sh exists
- debug: msg="foo.sh exists"
  when: script_stat.stat.exists

编辑好文件之后,执行任务

# ansible-playbook -i inventory/testenv ./deploy.yml

ansible 执行shell返回结果 ansible shell例子_html_05

4、Command/Shell模块

编辑主任务配置文件,添加以下内容

#  vi roles/testbox/tasks/main.yml

# 远程执行foo.sh脚本
- name: run the script
  command: 'sh /root/foo.sh'

编辑好文件之后,执行任务

# ansible-playbook -i inventory/testenv ./deploy.yml

ansible 执行shell返回结果 ansible shell例子_nginx_06

5、Template模块、Packaging模块、Service模块

添加一些参数到testenv的文件当中,添加如下参数

# vi vi inventory/testenv

ansible 执行shell返回结果 ansible shell例子_html_07

server_name=test.example.com
port=80
user=deploy
worker_processes=4
max_open_file=65505
root=/www

创建templates目录,然后创建一个nginx.conf.j2的模块文件,添加配置信息

# mkdir roles/testbox/templates

# vi roles/testbox/templates/nginx.conf.j2

# For more information on configuration, see:
user              {{ user }};                  # user变量
worker_processes  {{ worker_processes }};      # 变量

error_log  /var/log/nginx/error.log;

pid        /var/run/nginx.pid;

events {
    worker_connections  {{ max_open_file }};   #变量
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    # Load config files from the /etc/nginx/conf.d directory
    # The default server is in conf.d/default.conf
    #include /etc/nginx/conf.d/*.conf;
    server {
        listen       {{ port }} default_server;      # 端口变量
        server_name  {{ server_name }};          #服务器名称变量

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   {{ root }};          # root变量
            index  index.html index.htm;
        }

        error_page  404              /404.html;
        location = /404.html {
            root   /usr/share/nginx/html;
        }

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

    }

}

编辑主任务配置文件,添加以下下内容

#  vi roles/testbox/tasks/main.yml

# 将模板写入目标主机配置文件
- name: write the nginx config file
  template: src=roles/testbox/templates/nginx.conf.j2 dest=/etc/nginx/conf.d/default.conf

# yum安装nginx
- name: ensure nginx is at the latest version
  yum: pkg=nginx state=latest

# 启动nginx服务
- name: start nginx service
  service: name=nginx state=started

编辑好文件之后,执行任务

# ansible-playbook -i inventory/testenv ./deploy.yml

ansible 执行shell返回结果 ansible shell例子_ansible 执行shell返回结果_08

检查nginx.conf.j2文件的参数变量,是否写入nginx主配置文件

# ssh root@test.example.com cat /etc/nginx/conf.d/default.conf

ansible 执行shell返回结果 ansible shell例子_ansible 执行shell返回结果_09

检查远程主机nginx是否启动

# ssh root@test.example.com ps -ef  | grep nginx

ansible 执行shell返回结果 ansible shell例子_nginx_10

main.yml文件

- name: Print server name and user to remote testbox
  shell: "echo 'Currently {{ user }} is logining {{ server_name }}' > {{ output }}"
- name: create a file
  file: 'path=/root/foo.txt state=touch mode=0755 owner=foo group=foo'
- name: copy a file
  copy: 'remote_src=no src=roles/testbox/files/foo.sh dest=/root/foo.sh mode=0644 force=yes'
- name: check if foo.sh exists
  stat: 'path=/root/foo.sh'
  register: script_stat
- debug: msg="foo.sh exists"
  when: script_stat.stat.exists
- name: run the script
  command: 'sh /root/foo.sh'
- name: Create a directory if it does not exist
  file: 'path=/etc/nginx state=directory mode=0755'
- name: write the nginx config file
  template: src=roles/testbox/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf
- name: copy a file
  copy: 'remote_src=no src=roles/testbox/files/nginx.repo dest=/etc/yum.repos.d/nginx.repo mode=0644 force=yes'
- name: ensure nginx is at the latest version
  yum: pkg=nginx state=latest
- name: start nginx service
  service: name=nginx state=started
- name: Print server name and user to remote testbox
  shell: "echo 'Currently {{ user }} is logining {{ server_name }}' > {{ output }}"

  # 远程创建文件
- name: create a files                                                                             
  file: 'path=/root/foo.txt state=touch mode=0755 owner=foo group=foo'

  # 将本地的文件拷贝到远程主机
- name: copy a files                                                                               
  copy: 'remote_src=no src=roles/testbox/files/foo.sh dest=/root/foo.sh mode=0644 force=yes'

  # 获取文件状态
- name: check if foo.sh exists
  stat: 'path=/root/foo.sh'
  register: script_stat

  # 判断文件是否存在
- debug: msg="foo.sh exists"
  when: script_stat.stat.exists

  # 远程执行脚本文件
- name: run the script
  command: 'sh /root/foo.sh'

  # 创建一个nginx的目录
- name: Create a directory if it does not exist
  file: 'path=/etc/nginx state=directory mode=0755'

  # 从本地模板中写入nginx.conf文件
- name: write the nginx config file
  template: src=roles/testbox/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf

  # 拷贝本地nginx安装需要的脚本
- name: copy a file
  copy: 'remote_src=no src=roles/testbox/files/nginx.repo dest=/etc/yum.repos.d/nginx.repo mode=0644 force=yes'

  # yum安装nginx
- name: ensure nginx is at the latest version
  yum: pkg=nginx state=latest

  # 启动nginx
- name: start nginx service
  service: name=nginx state=started