自动化运维工具Ansible实战(三)常用的配置和相关命令

  1. 云栖社区>
  2. 博客>
  3. 正文

自动化运维工具Ansible实战(三)常用的配置和相关命令

科技小能手 2017-11-12 01:18:00 浏览909
展开阅读全文

     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
[root@Monitor .ssh]# tail -f /var/log/ansible.log 
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
[root@Monitor 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
[root@Monitor ansible]# ansible 192.168.180.6 -m command -a  'chdir=/tmp/test.txt touch test.file'  
[root@Monitor ansible]# ansible 192.168.180.5 -m command -a 'creates=/tmp/lqb.txt touch test.file'
192.168.180.5 | SUCCESS | rc=0 >>
[root@Monitor 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
[root@Monitor 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
[root@Monitor 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
[root@Monitor ansible]# vim script.sh
#/bin/bash
ifconfig -a;
df -h
~  
[root@Monitor ansible]# chmod +x script.sh 
[root@Monitor 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"
    ]
}

  #########也可以直接进行输出如下图

wKiom1mpLjawS8pNAAB8wZpk4Lk589.png



本文转自 lqbyz 51CTO博客,原文链接:http://blog.51cto.com/liqingbiao/1962021

网友评论

登录后评论
0/500
评论
科技小能手
+ 关注