自动运维工具ansible详解

配置文件和基本命令

安装: 配置好yum 源之后通过 yum install ansible 安装
配置文件:/etc/ansible/ansible.cfg
主机清单:/etc/ansible/hosts
下面来说下 /etc/ansible/hosts 文件的配置,该文件用来定义不同的主机,可以通过ip 也可以通过域名,请看示例:

# Ex 2: A collection of hosts belonging to the 'webservers' group
 [webservers]  #定义名称为webservers 的主机
 192.168.10.33
 192.168.10.30
[dbserver]   #定义名称为dnserver 的主机
192,168.10.30
[tomcatservers]   #通过域名来定义,前提是能该解析到该域名。
 www.tomcat1.server.com  
同一台主机可以属于不同组。

主程序
ansible
ansible-playbook
ansible-doc

ansible的简单使用格式:
ansible –help 可以看到很多选项,下面来说下常用选项。

-a MODULE_ARGS, --args=MODULE_ARGS  指明使用什么模块,
-C, --check   试运行某个文件,但不是真的运行
--list-hosts 列出主机名称
--syntax-check   进行语法检测
-u REMOTE_USER  远端用户
示例:[root@localhost ansible]# ansible all --list-hosts 列出所有主机
ansible webservers --list-hosts 列出名称为webservers 的所有主机,前提是你必须定义了这个。

ansible的常用模块:

获取模块列表:
ansible-doc -l 会看到有很多模块 总共有七百多个,下面将会挑选常用的模块进行说明。
command 模块
ansible-doc -s MOUDLE-NAME 查看某一个模块的参数
ansible-doc -s command 查看command 模块的参数,command模块是在远程主机运行命令的模块
常用参数:

creates=/xx 如果此处给定的文件或者目录存在则不执行该命令
removes=/xx 如果不存在则执行该命令
chdir=” 更改目录
示例:
[root@localhost ansible]# ansible 192.168.10.33 -m command -a “pwd”
192.168.10.33 | SUCCESS | rc=0 >>
ansible 192.168.10.33 -m command -a “creates=/tmp/test1 touch test1 chdir=/tmp” 先判断192.168.10.33 /tmp/test1 是否存在,如果不存在则创建test1 ,如果存在则跳过。

shell模块

在远程主机在shell进程下运行命令,支持shell特性,如管道等;
举例:[root@localhost ansible]# ansible webservers -m shell -a “echo pass123 | passwd –stdin user1” #使用shell 模块对webservers 组修改user1的密码

copy模块:
是用来复制文件到远程主机的模块

用法:
(1) src= dest=
(2) content= dest=
可选项:owner, group, mode
[root@localhost ~]# ansible all -m copy -a “src=ansibletest dest=/app/ owner=yys group=yys”
[root@localhost ~]# ansible all -m copy -a “content=’hello there’ dest=/app/34txt owner=yys”

cron 模块

计划任务模块,通过该模块可以对远程主机批量执行计划任务。
minute=
day=
month=
weekday=
hour=
job=
*name=
state=
present:创建
absent:删除
示例: [root@localhost ~]# ansible all -m cron -a “name=’dateysnc’ job=’/usr/sbin/ntpdate 172.18.0.1 &> /dev/null’ minute=’*/5’ state=present disabled=false” 这里注意:在执行crontab 计划任务的时候命令最好使用绝对路径。
[[email protected] ~]#crontab -l 可以看到成功了
Ansible: dateysnc
/5 * * * /usr/sbin/ntpdate 172.18.0.1 &> /dev/null

file模块:

设置文件属性的模块
用法:
(1) 创建链接文件:path= src= state=link
(2) 修改属性:path= owner= mode= group=
(3) 创建目录:path= state=directory
state参数
file directory 表示该文件或者文件夹存在的时候才会执行后面的命令,如果不存在则不执行
touch 表示文件不存在会创建该文件,如果文件存在会刷新文件的访问和修改时间,但是不会修改文件的内容。
absent 删除该文件
hard 硬链接
link 软连接
示例:[root@localhost ~]# ansible all -m file -a “path=/app/file3 state=touch owner=yys mode=770” 在远程所有主机上创建/app/file3 文件 ,如果远程主机存在该文件则更新该文件的access time 和modified time
[root@localhost ~]#ansible 192.168.10.33 -m file -a ” src=/app/f3 dest=/app/f3soft state=link owner=user1 mode=770” 创建软连接,state=hard 则是硬链接。

yum模块

Manages packages with the `yum’ package manager
name=:程序包名称,可以带版本号;
state=
present, latest ,absent
示例:[root@localhost ansible]# ansible webservers -m yum -a “name=httpd state=present” 安装httpd 服务
其他包管理工具 apt(debain) zypper

service模块

管理服务
name=
state=
started
stopped
restarted
enabled=
runlevel=

git 模块:
repo=
dest= version=
deploy_helper 模块 manager
haproxy 模块

get_url 模块
URL=
dest=
owner group
user模块

管理用户账号
*name= name 是必须项
system=
uid=
shell=
group=
groups=
comment=
home=
示例:[root@localhost ansible]# ansible webservers -m user -a “name=tom1 groups=haproxy state=present uid=3000 shell=/bin/tcsh home=/home/tom generate_ssh_key=true”

group 模块:

gid= 指明group id
system= yes| no 是否为系统账号
state=present|absent
示例: [root@localhost ansible]# ansible webservers -m group -a “name=haproxy system=yes state=present”
192.168.10.30 | SUCCESS => {
“changed”: true,
“name”: “haproxy”,
“state”: “absent”
}

ansible-playbook:

Playbook的核心元素:

Hosts:主机
Tasks:任务列表
Variables: 变量
Templates:包含了模板语法的文本文件;
Handlers:由特定条件触发的任务;
下面将会对这几个核心元素做分别的说明

Hosts:

hosts 行的内容是一个或多个组或主机的 patterns,以逗号为分隔符
写法示例:
- hosts: webservers
remote_user: root
以 - 开头 空格 hosts: 后面有空格

tasks:

1.每一个 play 包含了一个 task 列表(任务列表).一个 task 在其所对应的所有主机上(通过 host pattern 匹配的所有主机)执行完毕之后,下一个 task 才会执行;
2.每个 task 的目标在于执行一个 moudle, 通常是带有特定的参数来执行.在参数中可以使用变量(variables);
3.每一个 task 必须有一个名称 name,这样在运行 playbook 时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个 task 的.
4.推荐使用常见的格式:”module: options”
示例:

tasks:
- name: make sure apache is running
service: name=httpd state=running

5.比较特别的两个 modudle 是 command 和 shell ,它们不使用 key=value 格式的参数,而是这样:

tasks:
  - name: disable selinux
    command: /sbin/setenforce 0

使用 command module 和 shell module 时,我们需要关心返回码信息,如果有一条命令,它的成功执行的返回码不是0, 你可以尝试这样做:
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand || /bin/true

handlers:

任务,在特定条件下触发;
接收到其它任务的通知时被触发;
notify: HANDLER TASK NAME
(当发生改动时)’notify’ actions 会在 playbook 的每一个 task 结束时被触发,而且即使有多个不同的 task 通知改动的发生, ‘notify’ actions 只会被触发一次.
举例来说,比如多个 resources 指出因为一个配置文件被改动,所以 apache 需要重新启动,但是重新启动的操作只会被执行一次.
示例:
- name: template configuration file
template: src=template.j2 dest=/etc/foo.conf
notify:
- restart memcached
- restart apache
说明:当一个文件的内容被改动时,重启两个服务, notify 下列出的即是 handlers.

variables:

(1) facts:可直接调用;
注意:可使用setup模块直接获取目标主机的facters;
(2) 用户自定义变量:
(a) ansible-playbook命令的命令行中的 -e VARS, –extra-vars=VARS
(b) 在playbook中定义变量的方法:
vars:
- var1: value1
- var2: value2
变量引用:{{ variable }}
(3) 通过roles传递变量;
(4) Host Inventory
(a) 用户自定义变量
(i) 向不同的主机传递不同的变量;
IP/HOSTNAME varaiable=value var2=value2
(ii) 向组中的主机传递相同的变量;
[groupname:vars]
variable=value
示例:webservers:vars

你可能感兴趣的:(自动运维工具ansible详解)