ansible 安装部署

一.ansible的介绍

1.1 ansible说明

新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1).连接插件connection plugins:负责和被监控端实现通信;
(2).host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3).各种模块核心模块、command模块、自定义模块;
(4).借助于插件完成记录日志邮件等功能;
(5).playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

1.2 常用模块

1.ping模块
2.raw模块
3.yum模块
4.apt模块
5.pip模块
6.synchronize模块
7.template模块
8.copy模块
9.user 模块与group模块
10.service 模块
11.get_url 模块
12.fetch模块
13.file模块
14.unarchive模块
15.command 模块和shell

1.3 Ansible命令使用

Ansible语法使用ansible <pattern_goes_here> -m <module_name> -a
-m NAME,–module-name=NAME:指定执行使用的模块
-u USERNAME,–user=USERNAME:指定远程主机以USERNAME运行命令
-s,–sudo:相当于Linux系统下的sudo命令
-USUDO_USERNAME,–sudo-user=SUDO_USERNAME:使用sudo,相当于Linux下的sudo命令
-C -check只检查不实际执行
-e EXTRA_VARS,引用外部参数
-i INVENTORY,指定仓库列表,默认/etc/ansible/hosts
–list-hosts,列出执行主机列

1.4 ansible 配置文件常用参数

[root@lanmp ansible]# cat ansible.cfg
[defaults] #通用默认配置
inventory = /etc/ansible/hosts #被控制端IP或者DNS列表
library = /usr/share/my_modules/ ##默认搜寻模块的位置
remote_tmp = ~/.ansible/tmp #远程执行临时文件
local_tmp = ~/.ansible/tmp
plugin_filters_cfg = /etc/ansible/plugin_filters.yml
forks = 5 ##并行线程数
poll_interval = 15 ##回频率或轮询间隔时间
sudo_user = root ##sudo远程执行用户名
ask_sudo_pass = True ##使用sudo,是否需要输入密码
ask_pass = True ##是否需要输入密码
transport = smart ##通信机制
remote_port = 22 ##远程SSH端口
module_lang = C ##模块和系统之间通信的语言
module_set_locale = False
gathering = implicit ##控制默认facts收集(远程系统变量)
gather_subset = all
gather_timeout = 10
roles_path = /etc/ansible/roles ##使用playbook搜索Ansible roles
host_key_checking = False ##是否检查远程主机密钥
sudo_exe = sudo ##sudo远程执行命令
sudo_flags = -H -S -n ##传递sudo之外的参数
timeout = 10 ##SSH超时时间
remote_user = root ##远程登录用户名
log_path = /var/log/ansible.log ##日志文件存放路径
module_name = command ##Ansible命令默认执行的模块
executable = /bin/sh ##执行的shell环境,用户shell模块
hash_behaviour = replace ##特定的优先级覆盖变量
jinja2_extensions = jinja2.ext.do,jinja2.ext.i18 ##允许开启jinja2扩展模块
private_key_file = /path/to/file ##私钥文件存储位置
display_skipped_hosts = True ##显示跳过任何任务的状态
system_warnings = True ##禁用系统运行Ansible潜在问题警告
deprecation_warnings = True ##PlayBook输出禁用“不建议使用”警告
command_warnings = False ##command模块Ansible默认发出警告
nocolor = 1 ##输出带上颜色区别,0表示开启,1表示关闭
pipelining = False ##开启pipe SSH通道优化

[accelerate] ##accelerate缓存加速
accelerate_port = 5099 ##加速连接端口5099
accelerate_timeout = 30 ##命令执行超过时间,单位为s
accelerate_connect_timeout = 5.0 ##上一个活动连接的时间,单位为min
accelerate_daemon_timeout = 30 ##允许多个私钥被加载到daemon
accelerate_multi_key = yes ##任何客户端想要连接daemon都要开启这个选项

二.安装ansible过程

环境:centos6.5 mini
机器名 ip地址 作用
ab01 192.168.1.11 Ansible服务端
ab02 192.168.1.22 被管理
ab03 192.168.1.33 被管理

1.1 关闭各个机器的selinux,iptables,修改hosts

在这里插入图片描述
在这里插入图片描述

1.2 做免密码登录

[root@ab01 yum.repos.d]ssh-keygen
[root@ab01 yum.repos.d]ssh-copy-id ab02
[root@ab01 yum.repos.d]ssh-copy-id ab03
[root@ab02 .ssh]# ssh-keygen
[root@ab02 .ssh]# ssh-copy-id ab01
[root@ab02 .ssh]# ssh-copy-id ab03
[root@ab03 ~]# ssh-keygen
[root@ab03 ~]# ssh-copy-id ab01
[root@ab03 ~]# ssh-copy-id ab02

1.3 安装ansible

[root@ab01 ~]# yum install -y epel-release
[root@ab01 ~]# yum install -y ansible

1.4 定义主机,将所有的被管理主机加入到/etc/ansible/hosts

[root@ab01 ansible]# pwd
/etc/ansible
[root@ab01 ansible]# mv hosts hosts.bak
[root@ab01 ansible]# vi hosts
[web]
192.168.1.22
192.168.1.33

第二模块的使用(ansible 操作目标 -m 模块名 -a 模块参数)

1.5 执行ping存活检测

[root@ab01 ansible]# ansible web -m ping
在这里插入图片描述

1.6 列出执行主机列表

[root@ab01 ansible]# ansible web --list-hosts
在这里插入图片描述

1.7 command模块

在这里插入图片描述

[root@ab01 ansible]# ansible web -m command -a ‘ls’
在这里插入图片描述
#chdir
[root@pxc01 ~]# ansible db -m command -a ‘chdir=/tmp/ ls -l’
在这里插入图片描述
#creates
[root@pxc01 ~]# ansible db -m command -a ‘touch /home/1.txt creates=/home/1.txt’

1.8 shell模块

在这里插入图片描述
[root@ab01 ansible]# ansible web -m shell -a ‘df -hT >1.txt’
在这里插入图片描述
[root@ab01 ansible]# ansible web -m command -a ‘cat 1.txt’
在这里插入图片描述

1.9 setup模块(查看客户机的详细情况)

[root@ansible ansible]# ansible mysql -m setup
在这里插入图片描述
[root@lanmp ~]# ansible lb -m setup -a “filter=ansible_nodename”
在这里插入图片描述
[root@lanmp ~]# ansible lb -m setup -a “filter=ansible_hostname”
在这里插入图片描述
[root@lanmp ~]# ansible lb -m setup -a “filter=ansible_memtotal_mb”
在这里插入图片描述
[root@lanmp ~]# ansible lb -m setup -a “filter=ansible_memfree_mb”
在这里插入图片描述
[root@lanmp ~]# ansible lb -m setup -a “filter=ansible_os_family”
在这里插入图片描述
[root@lanmp ~]# ansible lb -m setup -a “filter=ansible_all_ipv4_addresses”
在这里插入图片描述
[root@lanmp ~]# ansible lb -m setup -a “filter=ansible_processor_vcpus”
在这里插入图片描述

1.10 copy模块(类似scp向客户端传输文件)

主要用于将管理主机上的数据信息传送给多台主机
在这里插入图片描述
[root@pxc01 soft]# ansible db -m copy -a ‘src=/root/soft/ dest=/root/ owner=root group=root mode=0775 force=yes’
在这里插入图片描述
[root@ansible ~]# ansible mysql -m copy -a “src=/root/1.sh dest=/tmp/ owner=root group=root mode=0775 force=yes”
在这里插入图片描述
[root@mysql02 tmp]# ll 1.sh
-rwxrwxr-x 1 root root 0 9月 15 05:56 1.sh

1.11 yum模块

使用yum软件包管理器安装,升级,降级,删除和列出软件包和组。
在这里插入图片描述
[root@pxc01 soft]# ansible db -m yum -a ‘name=telnet state=installed’
在这里插入图片描述

1.12 service模块

用于管理服务运行状态
在这里插入图片描述
[root@pxc01 soft]# ansible db -m service -a ‘name=iptables state=restarted enabled=no’
在这里插入图片描述

1.13 cron模块

定时任务模块
在这里插入图片描述
[root@pxc01 soft]# ansible db -m cron -a “name=‘ntpdate time’ minute=*/10 job=’/usr/sbin/ntpdate 0.cn.pool.ntp.org &>/dev/null’”
在这里插入图片描述
在这里插入图片描述

1.14 fetch模块

功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录
[root@lanmp haproxy]# ansible lb -m fetch -a ‘src=/etc/haproxy/haproxy.cfg dest=/tmp/’
在这里插入图片描述
[root@lanmp haproxy]# pwd
/tmp/192.168.1.186/etc/haproxy
[root@lanmp haproxy]# ls
haproxy.cfg
#会将目录结构,文件也复制到服务端

1.15 file模块

file模块主要用于远程主机上的文件操作,file模块包含如下选项:
– force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
– group:定义文件/目录的属组
– mode:定义文件/目录的权限
– owner:定义文件/目录的属主
– path:必选项,定义文件/目录的路径
– recurse:递归的设置文件的属性,只对目录有效
– src:要被链接的源文件的路径,只应用于state=link的情况
– dest:被链接到的路径,只应用于state=link的情况
– state:
   directory:如果目录不存在,创建目录
   file:即使文件不存在,也不会被创建
   link:创建软链接
   hard:创建硬链接
   touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
   absent:删除目录、文件或者取消链接文件
#创建文件
[root@lanmp ~]# ansible lb -m file -a ‘path=/tmp/file.txt state=touch’
[root@lanmp ~]# ansible lb -m file -a ‘path=/tmp/file.txt state=absent’
[root@lanmp ~]# ansible lb -m file -a ‘path=/tmp/1.txt owner=zabbix group=zabbix mode=600’

#创建目录
[root@lanmp ~]# ansible lb -m file -a ‘path=/tmp/test state=directory owner=zabbix group=zabbix’

#创建软链接
[root@lanmp ~]# ansible lb -m file -a ‘src=/tmp/1.txt dest=/var/lib/net/1.txt state=link’

1.16 user模块

功能:管理用户
#添加用户
[root@lanmp ~]# ansible lb -m user -a ‘name=user01 comment=“test user” uid=2048 home=/home/user01 group=user01’
[root@lanmp ~]# ansible lb -m user -a ‘name=user03 comment=“test user03” group=root shell=/sbin/nologin’

#删除用户及其家目录的数据
[root@lanmp ~]# ansible lb -m user -a ‘name=user03 state=absent remove=yes’

1.17 group模块

#添加组
[root@lanmp ~]# ansible lb -m group -a ‘name=user01 gid=88 system=yes’
#删除组
[root@lanmp ~]# ansible lb -m group -a ‘name=user02 gid=197 state=absent’

三.playbook

3.1 playbook初识

1.什么是playbook,playbook翻译过来就是“剧本”,那playbook组成如下
play: 定义的是主机的角色
task: 定义的是具体执行的任务
playbook: 由一个或多个play组成,一个play可以包含多个task任务
简单理解为: 使用不同的模块完成一件事情
在这里插入图片描述

3.2 playbook的优势

1.功能比ad-hoc更全
2.能很好的控制先后执行顺序, 以及依赖关系
3.语法展现更加的直观
4.ad-hoc无法持久使用,playbook可以持久使用

3.3 playbook的配置语法是由yaml语法描述的,扩展名是yaml

缩进
YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成, 不能使用tabs
冒号
以冒号结尾的除外,其他所有冒号后面所有必须有空格。
短横线
表示列表项,使用一个短横杠加一个空格。
多个项使用同样的缩进级别作为同一列表。

3.4 Playbook 变量使用

Playbook定义变量有三种方式

  1. playbook的yaml文件中定义变量赋值
  2. –extra-vars执行参数赋给变量
  3. 在文件中定义变量

3.4.1 playbook的yaml文件中定义变量赋值

[root@pxc01 yarml]#cat f1.yml
---
- hosts: all
  remote_user: root
  vars: #定义变量
    file_name: xuliangwei
  tasks:
    - name: Create New File # {{ file_name }}引用上面定义的变量
      file: name=/tmp/{{ file_name }} state=touch

[root@pxc01 yarml]# ansible-playbook f2.yml

在这里插入图片描述
Playbook执行结果返回颜色状态
红色: 表示有task执行失败或者提醒的信息
黄色:表示执行了且改变了远程主机状态
绿色:表示执行成功

3.4.2 --extra-vars执行参数赋给变量

[root@pxc01 yarml]# cat f2.yml 
---
 - hosts: all
   remote_user: root
   tasks:
     - name: create new file
       file: name=/tmp/{{file_name}} state=touch
[root@pxc01 yarml]# ansible-playbook f2.yml --extra-vars "file_name=huilong02.txt"

在这里插入图片描述

3.4.3 在文件中定义变量: 可以在/etc/ansible/hosts主机组中定义,然后使用palybook进行调度该变量

[root@pxc01 yarml]# vim /etc/ansible/hosts
在这里插入图片描述
[root@pxc01 yarml]# ansible-playbook f2.yml
如果定义的变量出现重复,且造成冲突,优先级如下:

1.extra-vars外置传参的优先级最高 [所有执行的主机都生效]
2.定义在yml文件中的优先级其次 [所有执行的主机都生效]
3.hosts文件中定义的变量优先级最低 [当前主机组定义会生效]

3.5 Playbook 条件语句

[root@lanmp yml]# cat when.yml 
---
- hosts: lb
  remote_user: root
  tasks:
#系统为centos 的主机才会执行
    - name: Centes 
      yum: name=httpd state=present
      when: (ansible_distribution == "CentOS")

[root@lanmp yml]# ansible-playbook -C when.yml
在这里插入图片描述

3.6 playbook循环语句

1.标准循环使用场景-批量安装软件

[root@lanmp yml]# cat for.yml 
---
 - hosts: lb
   remote_user: root
   tasks:
     - name: yum installed Pkg
       yum: name={{ item }} state=present
       with_items:
             - wget
             - tree
             - telnet
[root@lanmp yml]# ansible-playbook for.yml

在这里插入图片描述
2.标准循环使用场景-批量创建用户

[root@lanmp yml]# cat for2.yml 
---
 - hosts: lb
   remote_user: root
   tasks:
     - name: add users
       user: name={{ item.name }} groups={{ item.groups }} state=present
       with_items:
         - { name: 'test01',groups: 'user01' }
         - { name: 'test02',groups: 'root' }
[root@lanmp yml]# ansible-playbook  for2.yml

在这里插入图片描述

3.7 playbook 异常处理

默认Playbook会检查命令和模块的返回状态,如遇到错误就中断playbook的执行
加入参数: ignore_errors: yes 忽略错误

[root@lanmp yml]# cat error.yml 
---
 - hosts: lb
   remote_user: root
   tasks:
     - name: ignore error
       command: /bin/test
       ignore_errors: yes

在这里插入图片描述

3.8 playbook tags标签

1.打标签
对一个对象打一个标签
对一个对象打多个标签
对多个对象打一个标签

2.标签使用,通过tags和任务对象进行捆绑,控制部分或者指定的task执行

-t: 执行指定的tag标签任务
–skip-tags: 执行–skip-tags之外的标签任务

#正常执行

[root@lanmp yml]# cat tags.yml 
---
- hosts: lb
  remote_user: root
  tasks:
    - name: start_iptables
      service: name=iptables state=started
      tags: 
        - start_iptables
        - start_firewall
    - name: start_keepalived
      service: name=keepalived state=started
      tags: start_keepalived
[root@lanmp yml]# ansible-playbook tags.yml

在这里插入图片描述
#使用-t指定tags执行, 多个tags使用逗号隔开即可
[root@lanmp yml]# ansible-playbook -t start_iptables tags.yml
在这里插入图片描述
#使用–skip-tags排除不执行的tags
[root@lanmp yml]# ansible-playbook --skip-tags start_firewall tags.yml
在这里插入图片描述

3.9 playbook Handlers

#批量安装zabbix_agent
[root@lanmp jiaoben]# cat /root/jiaoben/zabbix_agent.sh

#!/bin/bash
groupadd zabbix
useradd -g zabbix -m zabbix
cd /usr/local/src/
tar -zxvf zabbix-3.4.8.tar.gz 
yum install -y gcc pcre*
cd zabbix-3.4.8
./configure --prefix=/usr/local/zabbix --enable-agent
make && make install
sed -i 's/Server=127.0.0.1/Server=192.168.1.170/g' /usr/local/zabbix/etc/zabbix_agentd.conf
sed -i 's/ServerActive=127.0.0.1/ServerActive=192.168.1.170/g' /usr/local/zabbix/etc/zabbix_agentd.conf
sed -i ‘s/Hostname=Zabbix server/’Hostname=$HOSTNAME’/g’ /usr/local/zabbix/etc/zabbix_agentd.conf
cp misc/init.d/tru64/zabbix_agentd /etc/init.d/
chmod +x /etc/init.d/zabbix_agentd 
ln -s /usr/local/zabbix/sbin/* /usr/local/sbin/
ln -s /usr/local/zabbix/bin/* /usr/local/bin/
service zabbix_agentd start
echo "service zabbix_agentd start">>/etc/rc.d/rc.local

[root@lanmp jiaoben]# cat /etc/ansible/yml/zabbix_agent.yml

- hosts: base
  remote_user: root
  tasks:
  - name: copy sh
    copy: src=/root/jiaoben/zabbix_agent.sh dest=/usr/local/src/zabbix_agent.sh mode=0700
  - name: sent tar
    copy: src=/root/soft/zabbix-3.4.8.tar.gz dest=/usr/local/src/zabbix-3.4.8.tar.gz
    notify: install shell
  handlers:
  - name: install shell
shell: /usr/local/src/zabbix_agent.sh
[root@lanmp yml]# ansible-playbook zabbix_agent.yml

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.10 Playbook Include

include用来动态的包含tasks任务列表
[root@lanmp yml]# cat f{1…2}.yml

- name: create file01
  command: touch file01
- name: create file02
  command: touch file02
[root@lanmp yml]# cat main.yml 
---
- hosts: lb
  remote_user: root
  tasks:
    - include: f1.yml
    - include: f2.yml
[root@lanmp yml]# ansible-playbook main.yml 

在这里插入图片描述

3.11 playbook role

3.11.1 role介绍

角色是ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中

运维复杂的场景:建议使用roles,代码复用度高

3.11.2 roles目录结构

playbook.yml
roles/
project/
tasks/
files/
vars/
templates/
handlers/
default/
meta/

3.11.3 Roles各目录作用

roles/project/ :项目名称,有以下子目录

files/ :存放由copy或script模块等调用的文件
templates/:template模块查找所需要模板文件的目录
tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
vars/:定义变量,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含
default/:设定默认变量时使用此目录中的main.yml文件,比vars的优先级低

3.11.4 创建 role

创建role的步骤
(1) 创建以roles命名的目录
(2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等
(3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建
(4) 在playbook文件中,调用各角色

3.11.5 实现 httpd 角色

#创建角色相关目录
[root@lanmp roles]# pwd
/etc/ansible/roles
[root@lanmp roles]# mkdir -pv httpd/{tasks,handlers,files}

#创建角色相关文件
[root@lanmp tasks]# pwd
/etc/ansible/roles/httpd/tasks
[root@lanmp httpd]# cd tasks/
[root@lanmp tasks]# ls
config.yml  group.yml  index.yml  install.yml  main.yml  service.yml  user.yml
[root@lanmp tasks]# vim main.yml
[root@lanmp tasks]# cat main.yml 
- include: group.yml
- include: user.yml
- include: install.yml
- include: config.yml
- include: index.html
- include: service.yml
[root@lanmp tasks]# cat user.yml 
- name: create apache user
  user: name=apache system=yes shell=/sbin/nologin home=/var/www/ uid=80 group=apache
[root@lanmp tasks]# cat group.yml 
- name: create apache group
  group: name=apache system=yes gid=80

[root@lanmp tasks]# cat install.yml 
- name: install httpd package
  yum: name=httpd 
[root@lanmp tasks]# cat config.yml 
- name: config file
  copy: src=/etc/ansible/roles/httpd/files/httpd.conf dest=/etc/httpd/conf/ backup=yes
  notify: restart 
[root@lanmp tasks]# cat index.yml 
- name: index.html
  copy: src=/etc/ansible/roles/httpd/files/index.html dest=/var/www/html 
[root@lanmp tasks]# cat service.yml 
- name: start service
  service: name=httpd state=started enabled=yes
[root@lanmp tasks]# cat ../handlers/main.yml 
- name: restart
  service: name=httpd state=restarted

#准备一下文件
[root@lanmp httpd]# cd files/
[root@lanmp files]# ls
[root@lanmp files]# touch httpd.conf index.html

[root@lanmp files]# tree /etc/ansible/roles/httpd/
在这里插入图片描述
#在playbook中调用角色

[root@lanmp ansible]# pwd
/etc/ansible
[root@lanmp ansible]# cat role_httpd.yml 
---
- hosts: lb
  remote_user: root
  roles:
- httpd
[root@lanmp ansible]# ansible-playbook role_httpd.yml

在这里插入图片描述
在这里插入图片描述

3.11.6 调用角色方法

调用角色方法1
在这里插入图片描述
调用角色方法2:
键role用于指定角色名称,后续的k/v用于传递变量给角色
在这里插入图片描述
调用角色方法3:

还可基于条件测试实现角色调用
在这里插入图片描述
roles中tags 使用
在这里插入图片描述
#http://www.yunweipai.com/34669.html

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页