Ansible自动化运维工具使用

时间:2023-12-22 17:22:08
概述
本文描述自动化运维工具 Ansible 的安装及基础使用方法,包含:
Centos 下的安装
主机配置
Ad-Hoc command(命令行执行)
Playbook (任务剧本)
Ansible 和 Saltstack 是目前主流的两个自动化运维工具,都可以用于同时对大量主机进行系统配置,应用部署等工作,利用这种集成化的自动运维工具最大的优势在于运维体系结构的持续可维护性。本文先着眼于 Ansible 的基础使用,不会进行太多扩展,通过本文可以快速上手使用 Ansible。
安装
Ansible 的一大特点是 agentless,可以通过 SSH 来对服务器进行管理,意味着只需要将 Ansible 部署到一台服务器。
Ansible 并非一定使用 ssh 来与服务器进行通信,它也支持 ZeroMq 的扩展。事实上,如果不是总要同时对一个庞大主机群进行操作,通过 ssh 进行通信在效率上的损失还是可以接受的。
在 Centos 系统上,Ansible 可以用过 yum 来进行安装,前提是需要 EPEL 的源。
以 Centos7 为例执行下列命令安装 EPEL 源:
rpm -Uvh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
1
安装 Ansible
yum install ansible
1
通常情况下,Ansible 可以部署到登录服务器上,登录服务器存放 ssh 私钥,这样在对操作主机群时就无需每次输入密码。
主机配置
Ansible 默认主机配置文件在 /etc/ansible/hosts,你也可以创建新的配置文件来管理主机,如果使用其他主机配置,在执行命令行时就需要通过 -i <path> 参数指定主机配置。
下边是一个主机配置的例子,foo.example.com 这些就是主机的定义,webservers 是主机组的定义,在使用 Ansible 时,可以通过主机组对一组服务器进行操作。
[webservers]
foo.example.com
bar.example.com
1
2
3
Ad-Hoc Command
Ad-Hoc Command 指那些希望立即执行对一组服务器进行操作,而这个操作过程不需要进行保存的方式。例如临时需要对 webservers 这组主机下的 /opt/testfile 文件进行删除,而这种操作是没有必要保存成 Playbook (剧本模式,稍后会说到)的。
$ ansible webservers -m command -a "rm -f /opt/testfile"
1
参数 -m 指定使用的功能模块是 command,-a 设置模块所需参数队列,对于 command 模块来讲,这个参数就是你需要执行的命令。
事实上,command 模块也有几个参数,当需要指定多个参数时,就需要使用 arg1=value1 arg2=value2 这样的键值对方式指定,当没有指定参数时,在这里实际上使用 command 的是 free_form 参数。
Ansible 默认使用的模块是 command,这意味着上述命令行并不需要显式指定功能模块,可以直接使用下列命令行
ansible webservers -a "rm -f /opt/testfile"
再举个简单的例子,批量文件分发:
$ ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/hosts"
1
上述命令将本地 /etc/hosts 分发到 webservers 的 /tmp/hosts。
使用 ansible-doc -l 可以查看 Ansible 支持哪些模块,也可以直接前往 这里 去查看。
使用 ansible-doc -s module_name 可以获取模块的使用帮助。
Playbook
Playbook 可以称之为任务剧本,它允许你按照剧本的方式编排需要完成的任务,使用 YAML 的语法格式。
早期,我们可能使用脚本来完成一些流程相对繁多的任务,脚本可以很好的执行,但可读性差。YAML 这种配置性的语法格式则可读性很好,并且对于没有编程基础的运维人员来讲,它也更容易上手。
看一个 playbook 的例子:
---
- hosts: webservers
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: name=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running (and enable it at boot)
    service: name=httpd state=started enabled=yes
  handlers:
    - name: restart apache
      service: name=httpd state=restarted
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
这个简单的例子完成的任务是部署或更新 webservers 这一组主机的 apache。
hosts:定义操作的主机组
remote_user:使用的用户
task:任务步骤,共分为三步:
1 通过 yum 模块确认 apache 是否安装以及是否是最新版本,如果不是则安装或更新;
2 通过 template 模块来设置配置文件,如果配置有更新则通知 handler 重启 apache;
3 通过 service 模块来判断 apache 是否在运行,如果没有则启动 apache。
handlers:事件处理,处理任务中的 notify
Playbook 完成后,执行就可以完成对一组服务器的操作
ansible-playbook playbook.yml
1
以上就是 Ansible 的基础使用方法,更多的可以去参考 Ansible 的文档
---------------------
一 Ansible简介
   1.absible定义
   ansible是一个轻量级的运维管理工具,基于Python研发。可实现对系统的批量管理配置、程序的批量部署、批量的运行命令等功能。仅需在任意管理主机安装ansible程序即可实现批量管理被管控主机且被管控的主机无需客户端。
   2.ansible特性
   1、no agents:不需要在被管控主机上安装任何客户端;
   2、no server:无服务器端,使用时直接运行命令即可;
   3、modules in any languages:基于模块工作,可使用任意语言开发模块;
   4、yaml,not code:使用yaml语言定制剧本playbook;
   5、ssh by default:基于SSH工作;
   6、strong multi-tier solution:可实现多级指挥。
   3.优点
   1、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
   2、批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
   3、使用python编写,维护更简单,ruby语法过于复杂;
   4、支持sudo
   4.基本架构
   Modules:模块化 
   Core Modules 核心模块 
   Customed Modules 自定义模块 
   Host Iventory 主机库清单,定义要管理的主机 
   Files 可以通过配置文件来实现 
   CMDB 也可以通过外部存储来实现 
   PlayBooks 剧本,定义每个主机所扮演的角色 
   Connection Plugins:连接插件,主要连接各管控主机 
   5.工作机制
二 Ansible安装
   1.ansible需python2.6以上版本
[root@test1 ~]# python -V
Python2.7.5
# 安装python驱动(不然下面会报错)
yum install python-devel -y
   2.安装ansible
#setuptools安装
cd
wget https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz
tar xvzf setuptools-7.0.tar.gz
cd setuptools-7.0
python setup.py install
#pycrypto模块安装
wget https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz
tar -xzf pycrypto-2.6.1.tar.gz
cd pycrypto-2.6.1
python setup.py install
#PyYAML模块安装
cd
wget http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz
tar -xzf yaml-0.1.5.tar.gz
cd yaml-0.1.5
./configure --prefix=/usr/local
make -j `grep processor /proc/cpuinfo| wc -l` && make install
cd
wget https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz
tar -xzf PyYAML-3.11.tar.gz
cd PyYAML-3.11
python setup.py install
#Jinja2模块安装
cd
wget https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz
tar -xzf MarkupSafe-0.9.3.tar.gz
cd MarkupSafe-0.9.3
python setup.py install
cd
wget https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gz
tar xvzf Jinja2-2.7.3.tar.gz
cd Jinja2-2.7.3
python setup.py install
#paramiko模块安装
cd
wget https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.11.tar.gz
tar xvzf ecdsa-0.11.tar.gz
cd ecdsa-0.11
python setup.py install
cd
wget https://pypi.python.org/packages/source/p/paramiko/paramiko-1.15.1.tar.gz
tar xvzf paramiko-1.15.1.tar.gz
cd paramiko-1.15.1
python setup.py install
#ansible 2.2.2安装
cd
wget http://releases.ansible.com/ansible/ansible-2.2.2.0.tar.gz
tar -xzf ansible-2.2.2.0.tar.gz
cd ansible-2.2.2.0
python setup.py install
mkdir /etc/ansible
cp -rp examples/* /etc/ansible/
   3.yum安装
yum install epel-release -y
yum install ansible -y
三 Ansible相关配置
   1.ansible相关文件及命令
主程序目录:/etc/ansible/
主配置文件:/etc/ansible/ansible.cfg
默认主机清单:/etc/ansible/hosts
插件目录:/usr/share/ansible_plugins
主要命令:/usr/bin/ansible
/usr/bin/ansible-console
/usr/bin/ansible-doc
/usr/bin/ansible-galaxy
/usr/bin/ansible-playbook
/usr/bin/ansible-pull
/usr/bin/ansible-vault
#常用格式
ansible <host-pattern>[-f forks][-m module][-a args]
host-pattern # 可以是all,或者配置文件中的主机组名
-v,–verbose 详细模式,如果命令执行成功,输出详细的结果(-vv –vvv -vvvv)
-i PATH,–inventory=PATH 指定host文件的路径,默认是在/etc/ansible/hosts
-f NUM,–forks=NU NUM是指定一个整数,默认是5,指定fork开启同步进程的个数。
-m NAME,–module-name=NAME 指定使用的module名称,默认是command
-m DIRECTORY,–module-path=DIRECTORY 指定module的目录来加载module,默认是/usr/share/ansible,
-a,MODULE_ARGS 指定module模块的参数
-k,-ask-pass 提示输入ssh的密码,而不是使用基于ssh的密钥认证
-sudo 指定使用sudo获得root权限
-K,-ask-sudo-pass 提示输入sudo密码,与–sudo一起使用
-u USERNAME,-user=USERNAME 指定移动端的执行用户
-C,-check 测试此命令执行会改变什么内容,不会真正的去执行
#查看各模块
ansible-doc [options][modules]
# 主要选项有:
-l或--list # 列出可用的模块
-s或--snippet #显示指定模块的简略使用方法
   2.配置文件介绍
   配置文件:/etc/ansible/ansible.cfg
hostfile=/etc/ansible/hosts #指定默认hosts配置的位置
host_key_checking =False#不进行host_key检查,省去目标key发生变化时输入(yes/no)的步骤
ask_pass=True# 每次执行ansible命令是否询问ssh密码
ask_sudo_pass=True# 每次执行ansible命令时是否询问sudo密码
   配置文件:/etc/ansible/hosts
# Ex 1: Ungrouped hosts, specify before any group headers.
直接给出主机,IP主机名都可以
## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10
# Ex 2: A collection of hosts belonging to the 'webservers' group
把几个主机分组,用中括号定义组名
## [webservers]
## alpha.example.org ...
## 192.168.1.100 ...
# If you have multiple hosts following a pattern you can specify
对主机进行通配001:006表示到一个范围
## www[001:006].example.com
# Ex 3: A collection of database servers in the 'dbservers' group
定义一组数据库服务器
## [dbservers]
## db02.intranet.mydomain.net ...
## 10.25.1.56 ...
#参数解释
1, ansible_ssh_host :
指定主机别名对应的真实 IP,如:100 ansible_ssh_host=192.168.1.100,随后连接该主机无须指定完整 IP,只需指定251就行
2, ansible_ssh_port :
指定连接到这个主机的 ssh 端口,默认22
3, ansible_ssh_user:
连接到该主机的 ssh 用户
4, ansible_ssh_pass:
连接到该主机的ssh密码(连-k 选项都省了),安全考虑还是建议使用私钥或在命令行指定-k 选项输入
5, ansible_sudo_pass: sudo 密码
6, ansible_sudo_exe: sudo 命令路径
7, ansible_connection :
连接类型,可以是local、ssh 或 paramiko,ansible1.2之前默认为 paramiko
8, ansible_ssh_private_key_file :私钥文件路径
9, ansible_shell_type :
目标系统的 shell 类型,默认为 sh,如果设置 csh/fish,那么命令需要遵循它们语法
10, ansible_python_interpreter :
python 解释器路径,默认是/usr/bin/python,但是如要要连BSD系统的话,就需要该指令修改 python 路径
11, ansible__interpreter :
这里的"*"可以是 ruby 或 perl 或其他语言的解释器,作用和 ansible_python_interpreter 类似
   3.主机与被控机建立ssh公私匙连接
   1.主机配置文件添加被控端
cat >>/etc/ansible/hosts <<EOF
[web]
192.168.1.168
192.168.1.186
EOF
   2.配置ssh无密码登录
#1.主机生成ssh密钥
[root@test1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in/root/.ssh/id_rsa.
Your public key has been saved in/root/.ssh/id_rsa.pub.
The key fingerprint is:
e4:99:c4:17:c9:68:86:3c:ac:1b:20:19:c4:36:c1:fe root@test1
The key's randomart image is:
+--[ RSA 2048]----+
|==. o . o.. |
|o=. =.+ o. |
|o... . ++ . |
| . o + + |
| . o S |
| E. |
| |
| |
| |
+-----------------+
#2.将公钥发到被管理节点用户的.ssh目录
[root@test1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.168
The authenticity of host '192.168.1.168(192.168.1.168)' can't be established.
ECDSA key fingerprint is 80:a7:8d:c6:6c:14:27:5c:2b:dd:17:5e:ec:60:33:1c.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO:1 key(s) remain to be installed --if you are prompted now it is to install the new keys
root@192.168.1.168's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.1.168'"
and check to make sure that only the key(s) you wanted were added.
#3.验证无密码配置是否成功
[root@test1 ~]# ssh root@192.168.1.168
Last login: Wed Apr 12 11:02:08 2017 from 192.168.1.110
[root@test2 ~]#
#192.168.186执行2,3步即可
    3.测试主机连通性
#测试web组中机器联通性(测试所有用all)
[root@test1 ~]# ansible web -m ping
192.168.1.168| SUCCESS =>{
"changed": false,
"ping":"pong"
}
192.168.1.186| SUCCESS =>{
"changed": false,
"ping":"pong"
}
   4.常见模块
ping:探测目标主机是否存活;
举例: ansible all -m ping
command:在远程主机执行命令;
举例:ansible all -m command -a "ifconfig"
举例:ansible all -m command -a "useradd centos"
shell:在远程主机上调用shell解释器运行命令,支持shell的各种功能,如管道等
举例:ansible all -m shell -a "echo centos |passwd --stdin centos"
copy:复制文件,给定内容生成文件,mode, owner, group,follow,...
拷贝文件
举例:ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=640"
生成文件
举例:ansible all -m copy -a "content='hell\nworld\n' dest=/tmp/fstab.ansible mode=640"
file:设置文件属性
更改文件属主
举例:ansible all -m file -a "path=/tmp/fstab.ansible owner=centos"
删除文件
举例:ansible all -m file -a "path=/tmp/fstab.ansible state=absent"
state 用来定义目标文件状态的
创建指定文件空目录
举例:ansible all -m file -a "path=/tmp/dir.ansible state=directory"
链接文件
举例:ansible all -m file -a "path=/tmp/test.ansible.link src=/tmp/test.ansible
state=link"
fetch:从远程主机拉取一个文件
ansible是用来管理多节点的,从远程拉取多个文件到目标主机显然不近乎仁义。所以用scp就能搞定。略过
cron:用来管理crontab的周期性任务
定义一个任务
举例:ansible all -m cron -a "minute'*/5' job='/usr/sbin/ntpdate 10.1.0.1 &>/dev/null'
name='sync time'"
crontab -l
删除一个任务
举例:ansible all -m cron -a "name='sync time' state=absent"
只删除用ansible定义的名
hostname:定义主机名
举例:
yum:使用yum包管理器,完成程序包管理
举例:ansible all -m yum -a "name=httpd"安装
举例:ansible all -m yum -a "name=httpd state=absent"删除
service:控制服务,控制服务是否开机自动启动
举例:ansible all -m service -a "name=httpd state=started enbaled=true"
script模块:
目的:在指定节点上执行/root/a.sh脚本(该脚本是在ansible主控端)
命令:ansible 10.1.1.113-m script -a ‘/root/a.sh‘
group:添加或者删除组
举例:
user:管理组账号
举例:
setup:收集远程各主机的各种属性之和
举例:ansible all -m setup
   5.PlayBook(各角色定义)(官方实例:https://github.com/ansible/ansible-examples)
   playbook是由一个或多个"play"组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来将,所谓的task无非是调用ansible的一个module。将多个paly组织在一个playbook中,即可以让他们联通起来按事先编排的机制同唱一台大戏。
playbook核心元素:
Tasks:任务,由模块定义的操作的列表;
Variables:变量
Templates:模板,即使用了模板语法的文本文件;
Handlers:由特定条件触发的Tasks;
Roles:角色;自包含,有完整独立实体
playbook的基础组件:
Hosts:运行指定任务的目标主机,可多个;
remote_user:在远程主机以哪个用户身份执行;
sudo_user:非管理员需要拥有sudo权限;
tasks:给出任务列表,执行完一个,执行第二个
模块,模块参数:
格式:
(1) action: module arguments //任务执行过程
(2) module name: arguments //指定运行的模块
   playbook实例1(指挥web组内主机安装httpd并监听8080端口)
- hosts: web
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=latest
tags: installpkg #指明跑某个标签 -t installpkg
- name: install conf file
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
tags: installconf #指明跑某个标签 -t installconf
notify: restart httpd service
- name: start httpd service
service: name=httpd state=started
handlers:#处理器,也是任务,在一定条件触发
- name: restart httpd service
service: name=httpd state=restarted
#检查语法,测试执行
ansible-playbook --syntax-check -t installconf --list-tags httpd.yaml
ansible-playbook --syntax-check httpd.yaml
ansible-playbook --list-hosts --list-tasks httpd.yaml
注意:
handlers:是指在一定条件下触发,指明在一个需要让别人重启服务才生效的任务上使用notify,通知一定是handlers名字
tags:只执行playbook中指定的tags标签,满足部分需要,多个任务可指明一个同tags
也可以一次调用两个标签,如下
annsible-playbook -t installconf,installpkg httpd.yaml
   playbook实例2(自定义变量Varable,可自定义安装任意程序包)
vim name.yaml
- hosts: web
remote_user: root
vars:
- pkgname: memcached #playbook中使用变量Variables
tasks:
- name: install a package
yum: name={{ pakgname }} state=present #自定义变量
#语法测试
ansible-playbook --syntax-check name.yaml
ansible-playbook -e pkgname=httpd/vsftpd/ name.yaml
#对应配置文件hosts设置
vim /etc/ansible/hosts
[web]
192.168.1.168 pkgname=nginx
192.168.1.186 pkgname=httpd
[web:vars]#为一个内不同主机定义相同变量,效果同上
#web组内有一组变量vars,其中变量pkgname值是memcaches
pkgname=memcached
Inventory还可以使用参数:
用于定义ansible远程连接目标主机使用的属性,而非传递给playbook的变量
如:[webserver]
192.168.1.168 ansible_ssh_user= ansible_ssh_pass ansible_sudo_pass
不再是传递给playbook变量,而是主机本身。
    when条件判断
- name: start nginx service on CentOS6
shell: service nginx start
when: ansible_distribution =="CentOS" and ansible_distribution_major_version =="6"
- name: start nginx service
shell: systemctl start nginx.service
when: ansible_distribution =="CentOS" and ansible_distribution_major_version =="7"
   基于字符串列表给出元素 循环:迭代,需要重复执行的任务;
- name: install package
yum: name={{ item }} state=latest
with_items:
- httpd
- php
- php-mysql
- php-mbstring
- php-gd
   基于字典列表出元素 循环:迭代,需要重复任务;
- name: creat groups //第一个任务
yum: name={{ item }} state=latest
with_items:
- groupx1
- groupx2
- groupx3
- name: creat users //第二个任务
user: name={{ item.name }} group={{ item.group }} state=present
with_items://元素列表
-{name:'userx1', group:'groupx1'}//name键值队
-{name:'userx1', group:'groupx1'}//name键值队
-{name:'userx1', group:'groupx1'}//name键值队
   
角色(自包含,按照目录结构来组织)
指定由哪些主机去对应的完成哪个已定义好的角色
roles是以特定的层级目录结构进行组织的tasks、variables、handlers、templates…
role_name/
files/:存储由copy或script等模块调用的文件;
tasks/:核心配置,分发资源和安装软件
handlers/: 发生改变则执行的操作(notify触发)
vars/: 定义变量
templates/:存储由template模块调用的模板文本;
meta/: 说明信息,角色依赖等,一般不用
default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;
Ansible官方文档:http://www.ansible.com.cn/docs/playbooks_intro.html 
学习博客:http://guoxh.blog.51cto.com/10976315/1914287  
学习博客:http://zyxjohn.blog.51cto.com/5313197/1886251 
学习博客:http://51eat.blog.51cto.com/11892702/1891709 
---------------------
原文:https://blog.csdn.net/HzSunshine/article/details/70227803