brew install ansible
ansible --version
详细目录testenv【testenv环境下的server清单】
[testservers] -> Server组列表
test.example.com -> 目标部署服务器主机名
[testserver:vars] -> Server组列表参数,用来定义目标主机所用到的所有key/value参数对,作为Server的变量声明
server_name=test.example.com
user=root
output=/root/test.txt
主任务文件main.yml【特定role下面具体执行的任务乐章,保存一个或多个task作为音符】
-name: Print server name and user to remote testbox -> 任务名称,表示task是做什么的
shell: "echo 'Currently {{user}} is logining {{server_name}}' > {{output}}" -> 执行的任务,使用shell模块(调用Ansible内嵌模块)执行命令,其中的变量使用的是inventory/testenv文件中的变量声明值
以上代码的含义是执行上述的task,通过Ansible的shell模块在目标主机下打印一句话并重定向到目标主机下对应output文件中
任务入口文件deploy.yml【作为核心文件直接与Ansible Playbook命令直接对话,将Playbook下所有编排命令全部展示给Ansible进行最终的play演奏,执行到最终的主机中】
- hosts: "testservers" -> Server列表对应inventory下的文件中的server主标签,声明要部署的目标主机为test.example.com的主机
gather_facts: true -> 获取Server基本信息
remote_user: root -> 目标服务器系统用户指定
roles:
- testbox -> 进入roles/testbox任务目录执行里面的所有tasks
在使用Ansible执行命令之前,由于Ansible是使用SSH作为通信协议,为了保证Ansible服务器可以操作目标服务器,我们需要配置Ansible主机与目标主机的密钥认证,保证Ansible主机与目标主机可以实现部署操作
106.54.32.234 test.example.com
】ssh-keygen -t rsa
,一路回车创建对应的私钥[id_rsa]和公钥[id_rsa.pub]ssh-copy-id -i /home/deploy/.ssh/id_rsa.pub [email protected]
,其中[email protected]
表示目标主机用户名@目标主机域名
。执行命令后需要输入yes确认连接,且输入目标主机root用户名的密码,输入完密码后就可以将本地的ssh公钥传递到目标主机中,从而建立了Ansible服务器端与目标主机间的密钥认证,实现免密登录ansible-playbook -i inventory/testenv ./deploy.yml
ssh [email protected]
并查看/root/test.txt
文件有对应的输出内容在目标主机创建文件或目录,并赋予其系统权限
实例:使用file模块执行Ansible Task任务
- name: create a file
file: 'path=/root/foo.txt state=touch mode=0755 owner=foo group=foo'
实现Ansible服务端到目标主机的文件传送
实例:使用copy模块执行Ansible Task任务
- 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
stat: 'path=/root/foo.sh'
表示要获取文件状态信息的路径register: script_stat
将stat获取的文件信息传递给script_stat变量打印语句到Ansible执行输出
实例
- debug: msg="foo.sh exists" -> 定义使用debug模块输出的语句内容为foo.sh exists
when: script_stat.stat.exists -> when是Ansible内嵌的条件语句,script_stat.stat.exists判断变量中的值是否存在,若存在则打印上述信息
用来执行Linux目标主机命令行,Shell模块可以调用Linux系统下的/bin/bash,可以使用系统环境变量、重定向符和管道符等
实例
- name: run the script
command: "sh /root/foo.sh"
- name: run the script
shell: "echo 'test' > /root/test.txt" -> 推荐使用shell模块
实现Ansible服务端到目标主机的jinja2模板传送
实例
- name: write the nginx config file
template: src=roles/testbox/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf -> src指定模板文件,dest指定目标文件路径,其中传递过程中会替换对应的变量信息
调用目标主机系统包管理工具(yum,apt)进行安装,常用这个模块去安装对应发行版下的app安装包
实例
- name: ensure nginx is at the latest version
yum: pkg=nginx state=latest -> 使用yum安装,安装包是nginx包,版本是最新[此方式适用于CentOS/Rethat系统]
- name: ensure nginx is at the latest version
apt: pkg=nginx state=latest -> 使用apt安装,安装包是nginx包,版本是最新[此方式适用于Debian/Ubuntu系统]
管理目标主机系统服务
实例
- name: start nginx service
service: name=nginx state=started -> 启动nginx服务
到目标服务器上执行如下命令进行预配置工作
useradd foo
useradd deploy #添加两个系统用户
mkdir /etc/nginx #创建目录
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm #给yum源添加nginx安装包
修改roles/testbox/tasks/main.yml
- name: create a file
file: 'path=/root/foo.txt state=touch mode=0755 owner=foo group=foo'
执行ansible-playbook执行上述任务创建foo文件
ansible-playbook -i inventory/testenv ./deploy.yml
在role/testbox下添加test目录,并创建foo.sh文件添加文件内容
mkdir roles/testbox/files
vi roles/testbox/files/foo.sh
# 添加文件内容如下
# echo "This is a test script"
在main.yml中添加新的Copy任务
- 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'
执行ansible-playbook执行上述任务拷贝文件
ansible-playbook -i inventory/testenv ./deploy.yml
在main.yml中添加获取文件状态和判断文件是否存在并打印输出信息任务
- 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
执行ansible-playbook执行上述任务进行文件是否存在的判断
ansible-playbook -i inventory/testenv ./deploy.yml
在main.yml中添加执行脚本文件的任务
- 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"
执行ansible-playbook运行上述任务执行shell脚本
ansible-playbook -i inventory/testenv ./deploy.yml
添加变量参数到testenv中
[testservers]
test.example.com
[testservers:vars]
server_name=test.example.com
user=root
output=/root/test.txt
port=80
user=deploy
worker_processes=4
max_open_file=65505
root=/www
在roles/testbox下创建templates目录mkdir roles/testbox/templates
在templates文件创建nginx.conf.j2模板文件,使用nginx.conf文件并修改对应字段为{{变量}}
# For more information on configuration, see:
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 }};
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;
}
}
}
在main.yml中添加传送替换后的nginx.conf文件模板任务、yum安装nginx任务和启动远程nginx服务任务
- 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: Write the nginx config file
template: src=roles/testbox/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf
- name: Ensure nginx is at the latest version
yum: pkg=nginx state=latest
- name: Start nginx service
service: name=nginx state=started
执行ansible-playbook运行上述模块任务
ansible-playbook -i inventory/testenv ./deploy.yml
进入目标主机查看nginx.conf文件是否成功替换模板,且通过ps -ef | grep nginx
命令查看是否启动nginx服务