Ansible部分使用记录

Ansible是Linux下常用的集群批量处理应用,记录下部分使用情况。

hosts

在yum安装完ansible后,配置文件默认在/etc/ansible下。ansible.cfg是ansible主要配置文件,hosts则是配置集群主机信息的文件。
hosts主机记录的配置项很多,一般通过密码连接主机的配置样例如下

1
2
[test]
test_1 ansible_ssh_host=192.168.2.1 ansible_ssh_pass=abcededdad

通过密钥连接主机的配置样例:

1
2
[len]
1m ansible_ssh_host=192.168.2.2 ansible_ssh_user="ansible" ansible_ssh_port=3210 ansible_ssh_private_key_file=/etc/ansible/keys/len.key

常用配置项说明
ansible_ssh_user:默认用户是root,如果是普通用户需要加上此项。
ansible_ssh_port:当ssh端口不为22时需要手动配置的。
ansible_ssh_private_key_file:用户私钥。

ansible_python_interpreter=/usr/bin/python2.7:当客户端python版本为3以上的,需要指定可用python2路径,不然有些模块(比如yum)使用会报错。

ansible_become:是否切换用户,true或false。
ansible_become_user:切换成的用户,比如root。
ansible_become_method:切换方式,常用的有sudo、su。
ansible_become_pass:切换用户时需要的密码。

模块

ansible支持的模块很多,可以去官方模块列表里查找你需要的,基本上都能找到。

模块可以用在命令行及playbook剧本里,这个看执行时的需要。

命令行权限问题

在执行命令时,如果是通过普通用户连接远程主机的,要注意权限问题。
命令行上加上–become可以让普通用户使用sudo执行命令。

1
ansible host -m systemd -a "name=httpd state=stopped" --become

如果无sudo权限,只有root密码,则将become方式从sudo改成su。

1
ansible host -m systemd -a "name=httpd state=stopped" --become --become-method=su --ask-become-pass

输入root密码后执行。

常用模块

command

在远程主机上运行系统命令

1
ansible host -m command -a "hostname"

shell

在远程主机上调用/bin/sh运行shell,与command类似,不同的是shell模块可以调用 <, >, |, ;, & 等。
ansible host -m shell -a “ps -ef | grep java”

并不推荐多使用shell及command模块,ansible有各种对应模块来实现command或shell调用的比如yum、systemctl等命令,而且更为安全迅速。

setup

查看主机详细信息,包括IP、MAC、系统内核版本、系统版本、系统语言等各种各样信息。
ansible host -m setup

ping

查看能不能ping通,测试网络时可用
ansible host -m ping

file

文件、目录、软硬链接操作
owner:属主
group:属组
mode:权限,如700
path:必选项,文件或目录路径
recurse:递归设置文件属性,只能目录有效
src:被链接的源文件路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
创建目录:

1
ansible host -m file -a "dest=/mnt/hello mode=755 owner=xx group=xx state=directory"

删除文件:

1
ansible host -m file -a 'dest=/mnt/a.txt state=absent'

改权限属主:

1
ansible host -m file -a 'dest=/mnt/a.txt mode=600 owner=www group=www'

yum

安装、更新、删除软件包
name:包名,必选
state:
absent:确认是不是找不到包,找到就删
installed:确认是不是已安装,未装就装
latest:确认是不是最新版,不是就更新
present:确认是不是存在包,不在就安装
removed:确认是不是已删除,未删就删
安装vsftpd:

1
ansible host -m yum -a 'name=vsftpd state=installed'

service\systemd

服务进程管理,用法相同,可以任用一个。
name:服务名,必选
state:
reloaded:重载
restarted:重启
started:启动
stopped:停止
重启httpd:

1
ansible host -m service -a 'name=httpd state=restarted'

copy

复制文件到远程本地
src:源文件
dest:目标文件
backup:是否备份目标文件,默认是no,yes|no,如果选yes,在覆盖时会备份文件
content:用于替代”src”,可以直接设定指定文件的内容
force:是否强制覆盖,默认是yes,如果选no,不强制覆盖与dest同名文件
复制文件到客户端并备份:

1
ansible host -m copy -a 'src=/data/ss.json dest=/data/test/ansible.txt backup=yes'

cron

计划任务设置
minute:分,默认为”*”
hour:时,默认为”*”
day:日,默认为”*”
month:月,默认为”*”
weekday:周几,默认为”*”

远程添加计划任务:

1
ansible host -m cron -a "hour=11 minute='*/2' job='ls -alh' name='check dirs'"

更多模块见:模块列表

playbook剧本

剧本基本

ansible除了命令行,还支持剧本流程化执行,我们可以把需要运行的每个步骤写入一个yaml文件,形成一个剧本,再通过ansible-playbook执行,ansible会自动执行剧本内所记步骤。

简单剧本示例:

1
2
3
4
5
6
7
8
9
10
11
$ cat plays/register_demo.yml
---
- hosts: local
remote_user: game
become: yes
become_method: su
become_user: root
tasks:
- name: cat /home/shell/test.sh
shell: sh /home/shell/test.sh
register: result

剧本按照yaml格式书写,要多注意写书格式,偶尔漏一两个空格也可能让剧本停止运行。
基本说明:
hosts:运行的host或host group,在hosts文件中对应
remote_user:远程主机的用户
become:如果remote_user需要其它用户权限,需要加上become
become_method:取得用户权限方式,一般是su或sudo
become_user:需要取得的权限用户
tasks:任务组,可以包含多个task
name:任务名

剧本逻辑

剧本不完全是从上至下的,也包含逻辑判断的部分。

notify与handlers

例子一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- hosts: test
remote_user: ansible
become: yes
become_method: sudo
become_user: root
tasks:
- name: ensure apache is latest
yum:
name: httpd
state: latest
notify:
- start apache
handlers:
- name: start apache
service:
name: httpd
state: started

例子作用:当httpd在yum源里不是最新版的话,就马上更新并重启,如果是最新版的话就不做任何动作。

这里用了notify与handlers配合,当notify被激活了,就会触发hanlers下对应的任务,就好似机关触动一样。

原理:task运行时会检查是不是需要执行,比如远程复制文件,会先检查两端文件checksum是否一样,如果一样说明文件相同,复制任务就不会进行,如果文件不同,复制任务执行。不需要执行的任务changed为false,需要执行的任务changed为true,在ansible的返回结果能看到changed结果。notify就是根据changed的值来决定是否执行handlers下对应的task,如果notify所在的task发生了changed,就会执行handlers下对应的task,反之则否。notify下的值是需要执行的task name。

register与when

例子二:
客户端新建/data/test.sh,内容如下:

1
2
#!/bin/bash
echo "failed"

创建剧本register_demo.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
---
- hosts: len
remote_user: ansible
become: yes
become_method: sudo
become_user: root
tasks:
- name: task1
shell: sh /data/test.sh
register: result

- name: task2
shell: hostname
when:
result.stdout == 'failed'

- name: task3
fail:
msg="check failed"
when:
result.stdout == 'failed'

- name: task4
shell: id

执行:

1
ansible-playbook register_demo.yml -v

上面的例子,把register的值赋予result,如果result.stdout的值是“failed”,执行task2、task3,输出fail并中断,不执行task4,如果result.stdout的值为其它,跳过task2、task3,直接执行task4,

register是结果寄存器,在运行ansible-playbook时加上-v,task输出的结果字典就是register的内容,when可以根据register中的某个值来决定是不是执行这个task,基本与程序语言中的if相当。而fail可以在剧本执行过程中中断进程并输出自定义错误。

结尾

ansible也是用了很久了,的确是运维不得不学的一个工具,本来想随便写写的,不知不觉写了一大堆,当作复习了。


- - END - -


腾讯云
0%