423212 发表于 2017-9-7 11:11:41

自动化运维工具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
   
    # 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_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
# 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>

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
# ansible --help
Usage: ansible <host-pattern>
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
# ansible 192.168.180.6 -m command -a'chdir=/tmp/test.txt touch test.file'
# ansible 192.168.180.5 -m command -a 'creates=/tmp/lqb.txt touch test.file'
192.168.180.5 | SUCCESS | rc=0 >>
# ansible 192.168.180.6 -m command -a'chdir=/tmp/test.txt touch test.file'
192.168.180.6 | FAILED | rc=0 >>
MODULE FAILURE
# ansible 192.168.180.6 -m shell -a'chdir=/tmp/test.txt touch test.file'      
192.168.180.6 | FAILED | rc=0 >>
MODULE FAILURE
# 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
# vim script.sh
#/bin/bash
ifconfig -a;
df -h
~
# chmod +x script.sh
# 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:EthernetHWaddr 00:15:5D:6E:28:0F\r\n          inet addr:192.168.180.5Bcast:192.168.180.255Mask:255.255.255.0\r\n          inet6 addr: fe80::215:5dff:fe6e:280f/64 Scope:Link\r\n          UP BROADCAST RUNNING MULTICASTMTU:1500Metric: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.1Mask:255.0.0.0\r\n          inet6 addr: ::1/128 Scope:Host\r\n          UP LOOPBACK RUNNINGMTU:16436Metric: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                     50G4.6G   43G10% /\r\ntmpfs               935M   0935M   0% /dev/shm\r\n/dev/sda1             485M   32M429M   7% /boot\r\n/dev/mapper/VolGroup-lv_home\r\n                     72G180M   68G   1% /home\r\n",
    "stdout_lines": [
      "eth0      Link encap:EthernetHWaddr 00:15:5D:6E:28:0F",
      "          inet addr:192.168.180.5Bcast:192.168.180.255Mask:255.255.255.0",
      "          inet6 addr: fe80::215:5dff:fe6e:280f/64 Scope:Link",
      "          UP BROADCAST RUNNING MULTICASTMTU:1500Metric: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.1Mask:255.0.0.0",
      "          inet6 addr: ::1/128 Scope:Host",
      "          UP LOOPBACK RUNNINGMTU:16436Metric: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",
      "                     50G4.6G   43G10% /",
      "tmpfs               935M   0935M   0% /dev/shm",
      "/dev/sda1             485M   32M429M   7% /boot",
      "/dev/mapper/VolGroup-lv_home",
      "                     72G180M   68G   1% /home"
    ]
}




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




页: [1]
查看完整版本: 自动化运维工具Ansible实战(三)常用的配置和相关命令