设为首页 收藏本站
查看: 1151|回复: 0

[经验分享] 【mac】ansible安装及基础使用

[复制链接]

尚未签到

发表于 2018-1-2 22:12:04 | 显示全部楼层 |阅读模式
安装
  环境释放
  mac  10.12.5
  

#more /System/Library/CoreServices/SystemVersion.plist  

  

  安装命令
  

#ruby -e "$(curl --insecure -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"  
#brew update
  
#brew install Ansible
  

  

  安装后hosts默认访问位置
  /usr/local/etc/ansible/hosts

公私钥配置
  创建公私钥
  

ssh-keygen -t rsa -C 'yat_ho@163.com'  

  -t 指定密钥类型,默认即 rsa ,可以省略
  -C 设置注释文字,比如你的邮箱
  默认存放位置
  

/Users/jenkins/.ssh/id_rsa  

  将公钥复制到ssh服务器
  

ssh-copy-id jenkins@192.168.1.236  

  


hosts配置
  定义主机与组
  定义一个IP为192.168.1.21, SSH端口为2135的主机
  

192.168.1.21:2135  

  定义一个别名为jumper, SSH端口为22, IP为192.168.1.50的主机
  

jumper ansible_ssh_port=22 ansible_ssh_host=192.168.1.50  

  组成员主机名称范例:
  

  [test]  
  jenkis236 ansible_ssh_port=22 ansible_ssh_host=192.168.1.236
  

  假如你有很多主机遵循某一种模式,你还可以这样来表示他们:
  

  [webservers]  
  web[1:50].lightcloud.com
  

  

  
  [database]
  
  db-[a:f].lightcloud.com
  

  定义主机变量
  主机可以指定变量, 后面可以供Playbooks调用
  

  [test]  
  jenkis236 ansible_ssh_port=22 ansible_ssh_host=192.168.1.236 http_port=8080 
  

  定义组变量
  

[atlanta]  
host1
  
host2
  
[atlanta:vars]
  
ntp_server=ntp.atlanta.example.com
  
proxy=proxy.atlanta.example.com
  

  

  Ansible内置连接主机的变量
  

ansible_ssh_host  
ansible通过ssh连接的IP或者FQDN
  
ansible_ssh_port
  
SSH连接端口
  
ansible_ssh_user
  
默认SSH连接用户
  
ansible_ssh_pass
  
SSH连接的密码(这是不安全的,ansible极力推荐使用--ask-pass选项或使用SSH keys)
  
ansible_sudo_pass
  
sudo用户的密码
  
ansible_connection
  
SSH连接的类型:local,ssh,paramiko,在ansible 1.2之前默认是paramiko,后来智能选择,优先使用基于ControlPersist的ssh(支持的前提)
  
ansible_ssh_private_key_file
  
SSH连接的公钥文件
  
ansible_shell_type
  
指定主机所使用的shell解释器,默认是sh,你可以设置成csh, fish等shell解释器
  
ansible_python_interpreter
  
用来指定python解释器的路径
  
ansible\_\*\_interpreter
  
用来指定主机上其他语法解释器的路径,例如ruby,perl等
  

  


 Ansible常用模块及API
  command: 执行远程主机SHELL命令
  

ansible all -i /Users/jenkins/jenkins/lirbary/ansible_hosts/hosts_test -m command -a "ifconfig"  

  script: 远程执行MASTER本地SHELL脚本.(类似scp+shell)
  

ansible test -i /Users/jenkins/jenkins/lirbary/ansible_hosts/hosts_test -m script -a "../Env_update_shell/test.sh"  

  copy:实现主控端向目标主机拷贝文件, 类似scp功能.
  

ansible test -i /Users/jenkins/jenkins/lirbary/ansible_hosts/hosts -m copy -a "src=~/test.sh dest=/tmp/ owner=root group=root mode=0755"  

  stat:获取远程文件状态信息, 包括atime, ctime, mtime, md5, uid, gid等信息.
  

ansible test -i /Users/jenkins/jenkins/lirbary/ansible_hosts/hosts_test -m stat -a "path=/Users/jenkins/jenkins/"  

  get_url:实现在远程主机下载指定URL到本地.
  

ansible test -i /Users/jenkins/jenkins/lirbary/ansible_hosts/hosts_test -m get_url -a "url=http://www.cnblogs.com/yatho dest=/tmp/index.html mode=0400 force=yes"  

  yum:Linux包管理平台操作, 常见都会有yum和apt, 此处会调用yum管理模式
  

ansible servers -m yum -a "name=curl state=latest"  

  cron:远程主机crontab配置
  

ansible webservers -m cron -a "name='check dir' hour='5,2' job='ls -alh > /dev/null'"  

  service:远程主机系统服务管理
  

# ansible webservers -m service -a "name=crond state=stopped"  
# ansible webservers -m service -a "name=crond state=restarted"
  
# ansible webservers -m service -a "name=crond state=reloaded"
  

  user:user
  

添加用户:  
# ansible webservers -m user -a "name=johnd comment='John Doe'"
  
删除用户:
  
# ansible webservers -m user -a "name=johnd state=absent remove=yes"
  

  

  playbook
  playbook介绍
  playbook是一个不同于使用Ansible命令行执行方式的模式, 其功能是将大量命令行配置集成到一起形成一个可定制的多主机配置管理部署工具.
  它通过YAML格式定义, 可以实现向多台主机的分发应用部署.
  以下给大家详细介绍一个针对nginx嵌套复用结构的playbook部署实例:
  1. 构建目录结构
  

# cd /etc/ansible/  

  
# mkdir group_vars
  

  
# mkdir roles
  

  2.定义host
  

# vi /etc/ansible/hosts  

  
[webservers]
  
client01.example.com
  
client02.example.com
  
[nginx01]
  
client01.example.com
  
[nginx02]
  
client02.example.com
  

  3.定义变量
  

# vi /etc/ansible/group_vars/nginx01  

  
worker_processes: 4
  
num_cpus: 4
  
max_open_file: 65506
  
root: /data
  
remote_user: root
  

  

# vi /etc/ansible/group_vars/nginx02  

  
worker_processes: 2
  
num_cpus: 2
  
max_open_file: 35506
  
root: /www
  
remote_user: root
  

  Tips:这里在group_vars下定义的文件名必须对应hosts文件下的group标签, 通过这里定义的不同参数从而部署不同类型的主机配置.
  4.创建roles入口文件
  

# vi /etc/ansible/site.yml  

  
- hosts: webservers
  
roles:
  
- base_env
  
- hosts: nginx01
  
roles:
  
- nginx01
  
- hosts: nginx02
  
roles:
  
- nginx02
  

  

  Tips: 这里的roles:下的字符串需对应roles目录下的目录名.
  5.定义全局role base_env
  创建目录结构
  

# mkdir -p /etc/ansible/roles/base_env/tasks  

  
# vi /etc/ansible/roles/base_env/tasks/main.yml
  

  

  

  
# 将EPEL的yum源配置文件传送到客户端
  
- name: Create the contains common plays that will run on all nodes
  
copy: src=epel.repo dest=/etc/yum.repos.d/epel.repo
  
- name: Create the GPG key for EPEL
  
copy: src=RPM-GPG-KEY-EPEL-6 dest=/etc/pki/rpm-gpg
  

  
# 关闭SELINUX
  
- name: test to see if selling is running
  
command: getenforce
  
register: sestatus
  
changed_when: false
  

  
# 删除iptables默认规则并保存
  
- name: remove the default iptables rules
  
command: iptables -F
  
- name: save iptables rules
  
command: service iptables save
  

  将对应需要拷贝到远程的文件复制到base_env/files目录下
  

# mkdir -p  /etc/ansible/roles/base_env/files  

  
# cp /etc/yum.repos.d/epel.repo /etc/ansible/roles/base_env/files
  

  
# cp /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 /etc/ansible/roles/base_env/files
  

  6. 定义nginx01和ngnix02 role
  创建目录结构
  

# mkdir -p /etc/ansible/roles/nginx{01,02}  

  
# mkdir -p /etc/ansible/roles/nginx01/tasks
  

  
# mkdir -p /etc/ansible/roles/nginx02/tasks
  

  
# vi /etc/ansible/roles/nginx01/tasks/main.yml
  

  

  

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

  
# 将nginx配置文件传送到远程目录
  
- name: write the nginx config file
  
template: src=nginx.conf dest=/etc/nginx/nginx.conf
  
notify: restart nginx # 重启nginx
  

  
# 创建nginx根目录
  
- name: Create Web Root
  
file: dest={{ root }} mode=775 state=directory owner=nginx group=nginx

  
notify:>  
- name: ensure nginx is running
  
service: name=nginx state=restarted
  

  

  

  

  
# cp /home/ansible/roles/nginx01/tasks/main.yml /home/ansible/roles/nginx02/tasks/main.yml
  

  

  7.定义files
  

# mkdir -p /etc/ansible/roles/nginx01/templates  

  
# mkdir -p /etc/ansible/roles/nginx02/templates
  

  
# vi /etc/ansible/roles/nginx01/templates/nginx.conf
  

  
# For more information on configuration, see:
  

  
user              nginx;
  
worker_processes  {{ worker_processes }};
  
{% if num_cpus == 2 %}
  
worker_cpu_affinity 01 10;
  
{% elif num_cpus == 4 %}
  
worker_cpu_affinity 1000 0100 0010 0001;
  
{% elif num_cpus >= 8 %}
  
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
  
{% else %}
  
worker_cpu_affinity 1000 0100 0010 0001;
  
{% endif %}
  
worker_rlimit_nofile {{ max_open_file }};
  

  
error_log  /var/log/nginx/error.log;
  
#error_log  /var/log/nginx/error.log  notice;
  
#error_log  /var/log/nginx/error.log  info;
  

  
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       80 default_server;
  
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;
  
}
  

  
}
  

  
}
  

  

  Tip: worker_processes, num_cpus, max_open_file, root等参数会调用group_vars目录下配置文件中相应的变量值
  

# cp /etc/ansible/roles/nginx01/templates/nginx.conf  /etc/ansible/roles/nginx02/templates/nginx.conf  

  8.执行playbook
  

# ansible-playbook -i /etc/ansible/hosts /etc/ansible/site.yml -f 10  

  Tips: -f 为启动10个并行进程执行playbook, -i 定义inventory host文件, site.yml 为入口文件
  

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

  
GATHERING FACTS ***************************************************************
  
ok: [client02.example.com]
  
ok: [client01.example.com]
  

  
TASK: [base_env | Create the contains common plays that will run on all nodes] ***
  
ok: [client01.example.com]
  
ok: [client02.example.com]
  

  
TASK: [base_env | Create the GPG key for EPEL] ********************************
  
ok: [client02.example.com]
  
ok: [client01.example.com]
  

  
TASK: [base_env | test to see if selling is running] **************************
  
ok: [client01.example.com]
  
ok: [client02.example.com]
  

  
TASK: [base_env | remove the default iptables rules] **************************
  
changed: [client02.example.com]
  
changed: [client01.example.com]
  

  
TASK: [base_env | save iptables rules] ****************************************
  
changed: [client01.example.com]
  
changed: [client02.example.com]
  

  
PLAY [nginx01] ****************************************************************
  

  
GATHERING FACTS ***************************************************************
  
ok: [client01.example.com]
  

  
TASK: [nginx01 | ensure nginx is at the latest version] ***********************
  
ok: [client01.example.com]
  

  
TASK: [nginx01 | write the nginx config file] *********************************
  
ok: [client01.example.com]
  

  
TASK: [nginx01 | Create Web Root] *********************************************
  
ok: [client01.example.com]
  

  
TASK: [nginx01 | ensure nginx is running] *************************************
  
changed: [client01.example.com]
  

  
PLAY [nginx02] ****************************************************************
  

  
GATHERING FACTS ***************************************************************
  
ok: [client02.example.com]
  

  
TASK: [nginx02 | ensure nginx is at the latest version] ***********************
  
ok: [client02.example.com]
  

  
TASK: [nginx02 | write the nginx config file] *********************************
  
ok: [client02.example.com]
  

  
TASK: [nginx02 | Create Web Root] *********************************************
  
ok: [client02.example.com]
  

  
TASK: [nginx02 | ensure nginx is running] *************************************
  
changed: [client02.example.com]
  

  
PLAY RECAP ********************************************************************
  
client01.example.com       : ok=11   changed=3    unreachable=0    failed=0
  
client02.example.com       : ok=11   changed=3    unreachable=0    failed=0
  

  最终部署目录结构如下
  # tree /etc/ansible/
  

/etc/ansible/  
├── ansible.cfg
  
├── group_vars
  
│   ├── nginx01
  
│   └── nginx02
  
├── hosts
  
├── hosts.bak
  
├── roles
  
│   ├── base_env
  
│   │   ├── files
  
│   │   │   ├── epel.repo
  
│   │   │   └── RPM-GPG-KEY-EPEL-6
  
│   │   └── tasks
  
│   │       └── main.yml
  
│   ├── nginx01
  
│   │   ├── tasks
  
│   │   │   └── main.yml
  
│   │   └── templates
  
│   │       └── nginx.conf
  
│   └── nginx02
  
│       ├── tasks
  
│       │   └── main.yml
  
│       └── templates
  
│           └── nginx.conf
  
└── site.yml
  


jenkins关联配置
  Choice Parameter
  deploy_environment  定义部署环境名 dev,test,uat,pdt
  Execute shell
  开头和结尾的set +x, set -x用来打开和关闭该部分的扩展参数及命令
  cd $WORKSPACE/leon-playbook-phpcms1.1
  ansible --version
  ansible-playbook -i inventory/$deploy_environment ./deploy.yml -e project=phpcms -e branch=$branch_selector -e env=$deploy_environment
  -i 用来自定义ansible host文件路径, ./deploy.yml为ansible-playbook入口文件, -e 后可跟给当前session添加的环境变量.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-430961-1-1.html 上篇帖子: ansible基础☞第一条命令 下篇帖子: ansible轻量级运维工具使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表