自动化运维工具Ansible实战(三)常用的配置和相关命令
Ansible默认安装好后有一个配置文件/etc/ansible/ansible.cfg,该配置文件中定义了ansible的主机的默认配置部分,如默认是否需要输入密码、是否开启sudo认证、action_plugins插件的位置、hosts主机组的位置、是否开启log功能、默认端口、key文件位置等等。
具体如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
[defaults]
# some basic default values...
#inventory = /etc/ansible/hosts
hostfile = /etc/ansible/conf/hosts \\指定默认hosts配置的位置
# library_path = /usr/share/my_modules/
remote_tmp = $HOME/.ansible /tmp
pattern = *
forks = 5
poll_interval = 15
sudo_user = root \\远程 sudo 用户
#ask_sudo_pass = True \\每次执行ansible命令是否询问ssh密码
#ask_pass = True \\每次执行ansible命令时是否询问sudo密码
transport = smart
remote_port = 22
module_lang = C
gathering = implicit
host_key_checking = False \\关闭第一次使用ansible连接客户端是输入命令提示
log_path = /var/log/ansible .log \\需要时可以自行添加。 chown -R root:root ansible.log
system_warnings = False \\关闭运行ansible时系统的提示信息,一般为提示升级
# set plugin path directories here, separate with colons
#action_plugins = /usr/share/ansible/plugins/action
#cache_plugins = /usr/share/ansible/plugins/cache
#callback_plugins = /usr/share/ansible/plugins/callback
#connection_plugins = /usr/share/ansible/plugins/connection
#lookup_plugins = /usr/share/ansible/plugins/lookup
#inventory_plugins = /usr/share/ansible/plugins/inventory
#vars_plugins = /usr/share/ansible/plugins/vars
#filter_plugins = /usr/share/ansible/plugins/filter
#test_plugins = /usr/share/ansible/plugins/test
#strategy_plugins = /usr/share/ansible/plugins/strategy
fact_caching = memory
[accelerate]
accelerate_port = 5099
accelerate_timeout = 30
accelerate_connect_timeout = 5.0
# The daemon timeout is measured in minutes. This time is measured
# from the last activity to the accelerate daemon.
accelerate_daemon_timeout = 30
|
ansible默认的配置都是注释掉的(#),可以通过去掉#来进行开启相应的配置服务,比如启用日志,更改相应的hosts文件的路径等等。 如查看日志,当再次操作ansible的时候就可以查看生成的日志了
1
2
3
4
5
6
7
8
|
192.168.180.4 ^ here Attempted to read "/etc/ansible/conf/hosts" as ini file : /etc/ansible/conf/hosts :7: Expected key=value host variable assignment, got: ansible_ssh_port
2017-09-01 11:09:44,012 p=58662 u=root | 192.168.180.10 | SUCCESS | rc=0 >> 11:07:42 up 46 days, 19:50, 3 users , load average: 0.08, 0.02, 0.01
2017-09-01 11:10:16,229 p=58662 u=root | 192.168.180.2 | SUCCESS | rc=0 >> 11:04:53 up 46 days, 19:52, 3 users , load average: 0.37, 0.41, 0.37
|
(二)Ansible命令参数
(1)命令格式: ansible <host-pattern> [options]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
[[email protected] ansible] # ansible --help
Usage: ansible <host-pattern> [options] Options: -m MODULE_NAME, --module-name=MODULE_NAME 要执行的模块,默认为 command
-a MODULE_ARGS, --args=MODULE_ARGS 模块的参数 -u REMOTE_USER, --user=REMOTE_USER ssh 连接的用户名,默认用root,ansible.cfg 中可以配置
-k, --ask-pass 提示输入 ssh 登录密码,当使用密码验证登录的时候用
-s, -- sudo sudo 运行
-U SUDO_USER, -- sudo -user=SUDO_USER sudo 到哪个用户,默认为root
-K, --ask- sudo -pass 提示输入 sudo 密码,当不是NOPASSWD 模式时使用
-B SECONDS, --background=SECONDS run asynchronously, failing after X seconds(default=N /A )
-P POLL_INTERVAL, --poll=POLL_INTERVAL set the poll interval if using
-B (default=15) -C, --check 只是测试一下会改变什么内容,不会真正去执行 -c CONNECTION 连接类型(default=smart) -f FORKS, --forks=FORKS fork 多少个进程并发处理,默认5 -i INVENTORY, --inventory- file =INVENTORY 指定hosts 文件路径,默认default= /etc/ansible/hosts
-l SUBSET, --limit=SUBSET 指定一个pattern,对<host_pattern>已经匹配的主机中再过滤一次 --list-hosts 只打印有哪些主机会执行这个playbook 文件,不是实际执行该playboo -M MODULE_PATH, --module-path=MODULE_PATH 要执行的模块的路径,默认为 /usr/share/ansible/
-o, --one-line 压缩输出,摘要输出 --private-key=PRIVATE_KEY_FILE 私钥路径 -T TIMEOUT, --timeout=TIMEOUT ssh 连接超时时间,默认10 秒
-t TREE, --tree=TREE 日志输出到该目录,日志文件名会以主机名命名 - v , --verbose verbose mode (-vvv for more , -vvvv to enable connection debugging)
|
以上就是ansible常用的命令格式及参数,在接下来的学习中会逐步运用的。
(2)Ad-Hoc
ansible任务:ad hoc任务就是执行shell命令、或shell脚本。可以执行一些简单的命令,不需要将这些执行的命令特别保存下来。
适合执行简单的命令。
ansible playbook:可以解决比较复杂的任务,可以将命令保存下来。
适合执行配置管理或部署客户机。
Ad-Hoc 是指Ansible下临时执行的一条命令,并且不需要保存的命令,对于复杂的命令会使用playbook。Ad-hoc的执行依赖于模块,ansible官方提供了大量的模块。 如:command、raw、shell、file、cron等,具体可以通过ansible-doc -l 进行查看 。可以使用ansible-doc -s module来查看某个模块的参数,也可以使用ansible-doc help module来查看该模块更详细的信息。接下来我们详细讲解该命令的用法:
1.命令说明: ansible 主机或组-m 模块名-a '模块参数' ansible参数
-
主机和组,是在/etc/ansible/hosts 里进行指定的部分,当然动态Inventory 使用的是脚本从外部应用里获取的主机;
-
模块名,可以通过ansible-doc -l 查看目前安装的模块,默认不指定时,使用的是command模块,具体可以查看/etc/ansible/ansible.cfg 的“#module_name = command ” 部分,默认模块可以在该配置文件中进行修改;
-
模块参数,可以通过 “ansible-doc -s 模块名” 查看具体的用法及后面的参数;
-
ansible参数,可以通过ansible命令的帮助信息里查看到,这里有很多参数可以供选择,如是否需要输入密码、是否sudo等。
2.后台执行。当命令执行时间比较长时,也可以放到后台执行,使用-B、-P参数,如下:
1
2
3
|
ansible all -B 3600-a "/usr/bin/long_running_operation --do-stuff" #后台执行命令3600s,-B 表示后台执行的时间
ansible all -m async_status -a "jid=123456789" #检查任务的状态
ansible all -B 1800-P 60-a "/usr/bin/long_running_operation --do-stuff" #后台执行命令最大时间是1800s即30分钟,-P 每60s检查下状态,默认15s
|
(3)命令执行模块。命令执行模块包含如下 四个模块:
-
command模块:该模块通过-a跟上要执行的命令可以直接执行,不过命令里如果有带有如下字符部分则执行不成功 “ "<", ">", "|", "&" ;
-
shell 模块:用法基本和command一样,不过其是通过/bin/sh进行执行,所以shell 模块可以执行任何命令,就像在本机执行一样;
-
raw模块:用法和shell 模块一样 ,其也可以执行任意命令,就像在本机执行一样;
-
script模块:其是将管理端的shell 在被管理主机上执行,其原理是先将shell 复制到远程主机,再在远程主机上执行,原理类似于raw模块。
注:raw模块和comand、shell 模块不同的是其没有chdir、creates、removes参数,chdir参数的作用就是先切到chdir指定的目录后,再执行后面的命令,这在后面很多模块里都会有该参数 。接下来进行详细的介绍:
1,command模块包含如下选项:
-
creates:创建一个文件名,当该文件存在,则该命令不执行
-
free_form:要执行的linux指令
-
chdir:在执行指令之前,先切换到该指定的目录
-
removes:一个文件名,当该文件不存在,则该选项不执行
-
executable:切换shell来执行指令,该执行路径必须是一个绝对路径
一下是使用的例子
使用chdir的实例:
1
2
3
4
5
6
7
8
9
10
11
12
|
[[email protected] ansible] # ansible 192.168.180.6 -m command -a 'chdir=/tmp/test.txt touch test.file'
[[email protected] ansible] # ansible 192.168.180.5 -m command -a 'creates=/tmp/lqb.txt touch test.file'
192.168.180.5 | SUCCESS | rc=0 >> [[email protected] ansible] # ansible 192.168.180.6 -m command -a 'chdir=/tmp/test.txt touch test.file'
192.168.180.6 | FAILED | rc=0 >> MODULE FAILURE [[email protected] ansible] # ansible 192.168.180.6 -m shell -a 'chdir=/tmp/test.txt touch test.file'
192.168.180.6 | FAILED | rc=0 >> MODULE FAILURE [[email protected] ansible] # ansible 192.168.180.6 -m raw -a 'chdir=/tmp/test.txt touch test.file'
192.168.180.6 | SUCCESS | rc=0 >> Shared connection to 192.168.180.6 closed. |
三个命令都会返回执行成功的状态。不过实际上只有前两个文件会被创建成功。使用raw模块的执行的结果文件事实上也被正常创建了,不过不是在chdir指定的目录,而是在当前执行用户的家目录。
creates与removes示例:
1
2
|
ansible 192.168.1.1 -a 'creates=/tmp/server.txt uptime' ###当/tmp/server.txt文件存在时,则不执行uptime指令
ansible 192.168.1.1 -a 'removes=/tmp/server.txt uptime' ###当/tmp/server.txt文件不存在时,则不执行uptime指令
|
2.script模块实例。首先在ansible服务器上创建一个脚本并赋予可执行权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
[[email protected] ansible] # vim script.sh
#/bin/bash ifconfig -a;
df -h
~ [[email protected] ansible] # chmod +x script.sh
[[email protected] ansible] # ansible 192.168.180.5 -m script -a 'script.sh'
192.168.180.5 | SUCCESS => { "changed" : true ,
"rc" : 0,
"stderr" : "Shared connection to 192.168.180.5 closed.\r\n" ,
"stdout" : "eth0 Link encap:Ethernet HWaddr 00:15:5D:6E:28:0F \r\n inet addr:192.168.180.5 Bcast:192.168.180.255 Mask:255.255.255.0\r\n inet6 addr: fe80::215:5dff:fe6e:280f/64 Scope:Link\r\n UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1\r\n RX packets:8629 errors:0 dropped:0 overruns:0 frame:0\r\n TX packets:2576 errors:0 dropped:0 overruns:0 carrier:0\r\n collisions:0 txqueuelen:1000 \r\n RX bytes:1868783 (1.7 MiB) TX bytes:299303 (292.2 KiB)\r\n\r\nlo Link encap:Local Loopback \r\n inet addr:127.0.0.1 Mask:255.0.0.0\r\n inet6 addr: ::1/128 Scope:Host\r\n UP LOOPBACK RUNNING MTU:16436 Metric:1\r\n RX packets:0 errors:0 dropped:0 overruns:0 frame:0\r\n TX packets:0 errors:0 dropped:0 overruns:0 carrier:0\r\n collisions:0 txqueuelen:0 \r\n RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)\r\n\r\n文件系统\t 容量 已用 可用 已用%% 挂载点\r\n/dev/mapper/VolGroup-lv_root\r\n 50G 4.6G 43G 10% /\r\ntmpfs 935M 0 935M 0% /dev/shm\r\n/dev/sda1 485M 32M 429M 7% /boot\r\n/dev/mapper/VolGroup-lv_home\r\n 72G 180M 68G 1% /home\r\n" ,
"stdout_lines" : [
"eth0 Link encap:Ethernet HWaddr 00:15:5D:6E:28:0F " ,
" inet addr:192.168.180.5 Bcast:192.168.180.255 Mask:255.255.255.0" ,
" inet6 addr: fe80::215:5dff:fe6e:280f/64 Scope:Link" ,
" UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1" ,
" RX packets:8629 errors:0 dropped:0 overruns:0 frame:0" ,
" TX packets:2576 errors:0 dropped:0 overruns:0 carrier:0" ,
" collisions:0 txqueuelen:1000 " ,
" RX bytes:1868783 (1.7 MiB) TX bytes:299303 (292.2 KiB)" ,
"" ,
"lo Link encap:Local Loopback " ,
" inet addr:127.0.0.1 Mask:255.0.0.0" ,
" inet6 addr: ::1/128 Scope:Host" ,
" UP LOOPBACK RUNNING MTU:16436 Metric:1" ,
" RX packets:0 errors:0 dropped:0 overruns:0 frame:0" ,
" TX packets:0 errors:0 dropped:0 overruns:0 carrier:0" ,
" collisions:0 txqueuelen:0 " ,
" RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)" ,
"" ,
"文件系统\t 容量 已用 可用 已用%% 挂载点" ,
"/dev/mapper/VolGroup-lv_root" ,
" 50G 4.6G 43G 10% /" ,
"tmpfs 935M 0 935M 0% /dev/shm" ,
"/dev/sda1 485M 32M 429M 7% /boot" ,
"/dev/mapper/VolGroup-lv_home" ,
" 72G 180M 68G 1% /home"
]
} |
#########也可以直接进行输出如下图