`
maosheng
  • 浏览: 550752 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自动化运维 Ansible 安装部署

 
阅读更多
一、概述

Ansible 实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible 是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是Ansible所运行的模块,
Ansible只是提供一种框架。

Ansible 采用parmiko 协议库,通过SSH或者ZeroMQ 等连接主机。Ansible在控制主机将Ansible模块通过SSH协议推送到被管节点执行,执行完之后自动删除。

控制主机与被控节点之间支持local、SSH、ZeroMQ三种连接方式,默认使用基于SSH 的连接。

Ansible 提供了一个在线 playbook 分享平台,地址:https://galaxy.ansible.com/


二、Ansible安装

CentOS 7.0,自带python 2.7.5

1、rpm 包安装:

##安装相应的基础模块,建议使用yum直接安装
# yum  install  python26 python26-PyYAML  python26-paramiko  python26-jinja2   python-simplejson  -y

# yum install -y ansible

或者如下

2、tar 包安装:

##下载ansible(http://releases.ansible.com/ansible/)可在改页面选择相应的版本进行下载

# tar -zvxf ansible-2.9.9.tar.gz
# cd ansible-2.9.9
# python setup.py build
# python setup.py install
# mkdir /etc/ansible
# cp -r examples/* /etc/ansible

# ansible --version
# ansible --help

3、设置SSH无密码登录(推荐方法)
为了避免ansible下发指令时输入被管理主机的密码,可以通过证书签名达到SSH无密码登录的效果,使用ssh-keygen产生一对密匙,使用ssh-copy-id来下发生成的公匙
关闭主机与被管理服务器的防火墙

#systemctl stop firewalld.service

# setenforce 0
setenforce: SELinux is disabled

生成密钥:

    ssh-keygen -t rsa   ##有询问直接按回车键即可,将在/root/.ssh/下生成一对密钥,其中id_rsa为私钥,id_rsa.pub为公钥
    使用ssh-copy-id命令来复制Ansible公钥到节点,下发密钥就是控制主把公钥id_rsa.pub下发到被管节点上用户下的.ssh目录,并重命名成authorized_keys,且权限值为400。
    ssh-copy-id  root@节点ip 


# ssh-keygen -t rsa                  ##生产一对密钥
# ssh-copy-id root@192.101.11.159    ##下发生产的公钥
# ssh-copy-id root@192.101.11.160    ##下发生产的公钥
# ssh-copy-id root@192.101.11.161    ##下发生产的公钥

SSH访问测试验证:

# ssh 192.101.11.159
# ssh 192.101.11.160
# ssh 192.101.11.161


4、配置文件
在运行Ansible命令时,命令将会按照预先设定的顺序查找配置文件
1)ANSIBLE_CONFIG:首先,Ansible命令会检查环境变量,及这个环境变量将指向的配置文件
2)~ /.snsible.cfg:再次,将会检查当前用户home目录下的.ansible.cfg配置文件
3)/etc/ansible/ansible.cfg:最后,将会检查在用软件包管理工具安装Ansible 时自动产生的配置文件

ansible主要相关配置文件在/etc/ansible目录下

# cd /etc/ansible/
总用量 24
-rw-r--r--. 1 root root 20269 10月  9 09:34 ansible.cfg            #配置文件
-rw-r--r--. 1 root root  1016 10月  9 09:34 hosts                  #管控主机文件
drwxr-xr-x. 2 root root    6 10月  9 09:34 roles
# pwd
/etc/ansible
# ls
ansible.cfg  hosts  scripts

5、Ansible默认安装好后有一个配置文件/etc/ansible/ansible.cfg,该配置文件中定义了ansible的主机的默认配置部分,如默认是否需要输入密码、是否开启sudo认证、action_plugins插件的位置、hosts主机组的位置、是否开启log功能、默认端口、key文件位置等等,默认的都是关闭,现在需要开启remote_port和private_key_file两个配置。
Ansible命令都是并发执行的,默认的并发数目由ansible.cfg中的forks值来控制。

# vi ansible.cfg
remote_port    = 22                         ####用于连接远程ssh的端口
private_key_file = /root/.ssh/id_rsa_web    ####第三步第一种方式使用,用于免密码登陆的


6、定义hosts主机组(被控制主机)
##ansible通过读取默认主机清单/etc/ansible/hosts文件,修改主机与组配置后,可同时连接到多个被管理主机上执行任务。具体配置如下:

# vi hosts
#[web]                 #被管理主机分类
#192.168.180.4
#192.168.180.5
#[db]                 #被管理主机分类
#192.168.180.2
[k8s]            #被管理主机分类
192.101.11.159
192.101.11.160
192.101.11.161

主机清单/etc/ansible/hosts 定义模式:
[web]                 #被管理主机分类
192.168.180.4  ansible_ssh_pass='123456'  ##定义了SSH登录密码
192.168.180.5  ansible_ssh_pass='123456'  ##定义了SSH登录密码
[docker]
172.17.33.10[1:8]  ## 172.17.33.101 ~  172.17.33.108
[docker:vars]
ansible_ssh_pass='123456'  ##针对docker组使用inventory内置变量定义了SSH登录密码


三、Ansible 使用

# cd /home/ansible-2.9.9/bin/
# ./ansible --version

到此,ansible的环境就部署完成了。
用来测试远程主机的运行状态

######只测试k8s组的主机
# ./ansible k8s -m ping
192.101.11.159 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
192.101.11.160 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
192.101.11.161 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}


[DEPRECATION WARNING]: The TRANSFORM_INVALID_GROUP_CHARS settings is set to allow bad characters in group names by default, this will change, but still be user configurable on
deprecation. This feature will be removed in version 2.10. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details


######只测试web组的主机 负载(uptime)
# ./ansible k8s -m command -a 'uptime'  
192.101.11.160 | CHANGED | rc=0 >>
23:57:09 up 63 days,  2:11,  3 users,  load average: 0.34, 0.38, 0.39
192.101.11.161 | CHANGED | rc=0 >>
00:00:59 up 19 days,  7:18,  3 users,  load average: 0.19, 0.26, 0.26
192.101.11.159 | CHANGED | rc=0 >>
23:57:09 up 63 days,  2:11,  3 users,  load average: 0.23, 0.25, 0.30


######测试所有的主机
# ./ansible  all -m command -a 'uptime'                            
192.101.11.160 | CHANGED | rc=0 >>
23:56:00 up 63 days,  2:10,  3 users,  load average: 0.62, 0.40, 0.39
192.101.11.161 | CHANGED | rc=0 >>
23:59:50 up 19 days,  7:16,  3 users,  load average: 0.24, 0.29, 0.27
192.101.11.159 | CHANGED | rc=0 >>
23:56:00 up 63 days,  2:10,  3 users,  load average: 0.14, 0.24, 0.30



#####查看该主机模块中所定义的主机的IP地址
# ./ansible k8s --list-hosts
# ./ansible k8s --list            ##简写

-------------------------------------------------------------------------------------------------------------------------------------------------------
获取帮助信息
(http://docs.ansible.com/)

# ansible-doc -h
# ansible-doc -l
# ansible-doc -s yum    ##ansible-doc 直接加模块名称,将显示该模块的描述和使用示例

ansible 命令格式:

# ansible 主机清单中IP或分组名称 -m 模块 -a "参数"

1、ansible ping 命令模块使用:

# ansible 主机清单中IP或分组名称 -m ping

# ./ansible k8s -m ping
# ./ansible k8s -m ping -v
# ./ansible k8s -m ping -vv
# ./ansible k8s -m ping -vvv

2、ansible cron 命令模块使用:

# ansible 主机清单中IP或分组名称 -m cron -a "参数"

# ./ansible 192.101.11.159 -m cron -a 'name="test cron1" job="ntpdate time1.aliyun.com" minute=0 hour=*/1'  ##每小时与时钟源同步一次

##远程主机结果
# crontab -l

3、ansible copy 命令模块使用:

# ansible 主机清单中IP或分组名称 -m copy -a "参数"

# ./ansible 192.101.11.159 -m copy -a "src=/etc/hosts dest=/etc/hosts backup=yes owner=root group=root mode=644" -o

帮助文档:
https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module

主控端

被控端

# ./ansible all -m command -a 'df -h'
等同于
# ./ansible all -a 'df -h'

查看目录:
# ./ansible all -a 'ls /data'

添加用户:
# ./ansible all -a 'useradd test1'

查询用户
# ./ansible all -a 'getent passwd test1'

修改密码:
# ./ansible all -m shell -a 'test1|passwd --stdin Ycyt@14#uat'

查询密码
# ./ansible all -a 'getent shadow test1'

显示hostname
# ./ansible all -m shell  -a 'echo $HOSTNAME'

查询enforce状态
# ./ansible all -a 'getenforce'

抓取文件
# ./ansible all -m fetch -a 'src=/var/log/messages dest=/data'

创建空文件f3:
# ./ansible all -m file -a 'name=/data/f3 state=touch'

删除文件f3:
# ./ansible all -m file -a 'name=/data/f3 state=absent'

创建文件夹:
# ./ansible all -m file -a 'name=/data/dir1 state=directory'

删除文件夹:
# ./ansible all -m file -a 'name=/data/f3 state=absent'

创建软连接:
# ./ansible all -m file -a 'src=/etc/fstab dest=/data/fstab.link state=link'

删除软连接:
# ./ansible all -m file -a 'dest=/data/fstab.link state=absent'

修改主机名
# ./ansible 192.101.11.159 -m hostname -a 'name=node1'

创建计划任务
# ./ansible all -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/wall FBI warning" name=warningcron'
查看计划任务
# crontab -e
禁用计划任务(参数job、name必须有,disabled=true或者yes;false或者no)
# ./ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=warningcron'
启用计划任务(参数job、name必须有)
# ./ansible all -m cron -a 'disabled=false job="/usr/bin/wall FBI warning" name=warningcron'
删除计划任务(参数job、name必须有)
# ./ansible all -m cron -a 'job="/usr/bin/wall FBI warning" name=warningcron state=absent'

yum 管理包
安装
# ./ansible all -m yum -a 'name=httpd state=latest'

# ./ansible all -m copy -a 'src=/opt/filebeat-7.11.2-x86_64.rpm dest=/opt/'
# ./ansible all -m yum -a 'name=/opt/filebeat-7.11.2-x86_64.rpm state=latest'
卸载
# ./ansible all -m yum -a 'name=httpd state=absent'

service 管理服务
# ./ansible all -m service -a 'name=filebeat state=started enabled=yes'

user 用户管理
首先通过openssl命令来生成一个密码,因为ansible user的password参数需要接受加密后的值
# echo ansible | openssl passwd -1 -stdin

# ansible docker -m user -a 'name=ansible password="*********"' -f 10 -o

查看机器的所有facts信息
# ansible 172.17.42.107 -m setup
# ansible 172.17.42.107 -m facter

创建用户
# ./ansible all -m user -a 'name=nginx shell=/sbin/nologin system=yes home/var/nginx groups=root,bin'
删除用户
# ./ansible all -m user -a 'name=nginx state=absent remove=yes'

group 组管理
创建组
# ./ansible all -m group -a 'name=nginx system=yes'
删除组
# ./ansible all -m group -a 'name=nginx state=absent'

playbook 编写:playbook1.yml
---
- host: websrvs
  remote_user: root
 
  tasks:
    - name: create new file
  file: name=/data/newfile state=touch
- name: create new user
      user: name=test2 systme=yes shell=/sbin/nologin
    - name: install package
      yum: name=httpd
    - name: copy file
      copy: src=/var/www/html/index.html dest=/var/www/html/
    - name: start service
      service: name=httpd state=started enabled=yes

# ./ansible-playbook -C playbook.yml ##检查

# ./ansible-playbook playbook.yml  --list-tasks    ##列出任务

# ./ansible-playbook playbook.yml  --list-hosts    ##列出运行任务主机

# ./ansible-playbook playbook.yml    ##执行  

# ./ansible websrvs -a 'ls /data -l'

# ./ansible websrvs -a 'getent passwd test2'

# ./ansible websrvs -m shell -a 'ss -tln|grep :80'

playbook 编写:playbook2.yml
---
- host: websrvs
  remote_user: root
 
  tasks:
    - name: install package
      yum: name=httpd
  tags: inshttpd
    - name: copy file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
  notify: restart service           ##对应下面的handlers中的name
    - name: start service
      service: name=httpd state=started enabled=yes
  tags: sthttpd
 
  handlers:
    - name: restart service
      service: name=httpd state=restarted


# ./ansible-playbook -C playbook2.yml ##检查

# ./ansible-playbook playbook2.yml  --list-tasks    ##列出任务

# ./ansible-playbook playbook2.yml  --list-hosts    ##列出运行任务主机

# ./ansible-playbook playbook2.yml    ##执行

# ./ansible-playbook playbook2.yml  --list-tags    ##列出标签tags

# ./ansible-playbook -t inshttpd playbook2.yml    ##执行tags指定的任务

# ./ansible-playbook -t sthttpd playbook2.yml     ##执行tags指定的任务

# ./ansible-playbook -t inshttpd,sthttpd playbook2.yml    ##执行tags指定的任务


playbook 编写:playbook3.yml,变量使用
---
- host: websrvs
  remote_user: root
 
  tasks:
    - name: install package
      yum: name={{pkgname}}
  tags: inshttpd
    - name: copy file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
  notify: restart service           ##对应下面的handlers中的name
    - name: start service
      service: name={{pkgname}} state=started enabled=yes
  tags: sthttpd
 
  handlers:
    - name: restart service
      service: name={{pkgname}} state=restarted


# ./ansible-playbook -C playbook3.yml ##检查

# ./ansible-playbook playbook3.yml  --list-tasks    ##列出任务

# ./ansible-playbook playbook3.yml  --list-hosts    ##列出运行任务主机

# ./ansible-playbook -e 'pkgname=httpd' playbook3.yml    ##执行


playbook 编写:nginx.yml,Nginx安装
---
- host: nginx
  remote_user: root
 
  tasks:
    - name: install ngnix package
      yum: name=nginx state=present
  tags: inshttpd
    - name: copy nginx.conf file
      template: src=./nginx.conf.j2 dest=/etc/nginx/nginx.conf owner=root group=root mode=0644 validate='nginx -t -c %s'
  notify: restart nginx service           ##对应下面的handlers中的name
 
  handlers:
    - name: restart nginx service
      service: name=nginx state=restarted


# cat nginx.conf.j2
----------------此处省略N行------------------------
worker_processed {{ansible_processor_cores}};
----------------此处省略N行------------------------

# ./ansible-playbook -C nginx.yml ##检查

# ./ansible-playbook nginx.yml  --list-tasks    ##列出任务

# ./ansible-playbook nginx.yml  --list-hosts    ##列出运行任务主机

# ./ansible-playbook nginx.yml    ##执行











分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics