Ansible默认安装好后有一个配置文件/etc/ansible/ansible.cfg,该配置文件中定义了ansible的主机的默认配置部分,如默认是否需要输入密码、是否开启sudo认证、action_plugins插件的位置、hosts主机组的位置、是否开启log功能、默认端口、key文件位置等等。
具体如下:
[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的时候就可以查看生成的日志了
[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]
[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参数,如下:
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的实例:
[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示例:
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服务器上创建一个脚本并赋予可执行权限
[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" ] }
#########也可以直接进行输出如下图