Ad-Hoc更倾向于解决简单、临时性任务。
基本语法:
1 ansible <host-pattern> [options]
<host-pattern>:指Inventory中定义的主机或主机组,可以为ip、hostname、Inventory中的group组名等。同时支持具有“.”、“*”或“:”等特殊字符的匹配型字符串。
提示:<>表示该选项为必选,[]表述是该选项中的参数任选其一或多个。
1 [options]:
2 -v,--verbose:输出更详细的执行过程信息,-vvv可得到执行过程所有信息;
3 -i PATH,--inventory=PATH:指定inventory信息,默认/etc/ansible/hosts;
4 -f NUM,--forks=NUM:并发线程数,默认5个线程;
5 --private-key=PRIVATE_KEY_FILE:指定秘钥文件;
6 -m NAME,--module-name=NAME:指定执行使用的模块。
提示:-m指定模块名称, 默认情况下是指command模块, 可以省略不写。
1 -M DIRECTORY,--module-path=DIRECTORY:指定模块存放路径,默认/usr/share/ansible;
2 -a 'ARGUMENTS',--args=‘ARGUMENTS’"模块参数;
3 -k,--ask-pass SSH:认证密码;
4 -K,ask-sudo=pass sudo:用户的密码(--sudo时使用);
5 -o,--one-line:标准输出至一行;
6 -s,--sudo:相当于Linux系统下的sudo命令;
7 -t DIRECTORY,--tree=DIRECTORY:输出信息至DIRECTORY目录下,结果文件以远程主机命名;
8 -T SECONDS,--timeout=SECONDS:指定连接远程主机的最大超时,单位是秒;
9 -B NUM,--background=NUM:后台执行命令,超NUM秒后中止正在执行的任务;
10 -P NUM,--poll=NUM:定期返回后台任务进度;
11 -u USERNAME,--user=USERNAME:指定远程主机以USERNAME运行命令;
12 -U SUDO_USERNAME,--sudo-user=SUDO_USERNAME:使用sudo,相当于Linux系统下的sudo命令;
13 -c CONNECTION,--connection=CONNECTION:指定连接方式,可用选项paramiko(SSH)、ssh、local,local方式常用于crontab和kickstarts;
14 -l SUBSET,--limit=SUBSET:指定运行主机;
15 -l ~REGEX,--limit=~REGEX:指定运行主机(正则);
16 --list-hosts:列出符合条件的主机列表,不执行任何命令。
1 [root@manage ~]# ansible myhost -f 5 -m ping
解析:
172.24.8.32:表示执行命令的主机;
SUCCESS:表示命令成功执行;
=> {……}:表示详细返回结果;
"changed": false,:表示没有对主机做变更;
"ping": "pong":表示执行ping命令返回结果为pong。
1 [root@manage ~]# ansible myhost1 -s -m command -a 'hostname' -vvv
解析:
执行过程图如下:
1 [root@manage ~]# ansible myhost --list-hosts
1 [root@manage ~]# time ansible 172.24.8.31 -B 5 -P 2 -T 2 -m command -a 'sleep 20' -u root
1 [root@manage ~]# ansible myhost -a "df -hl"
解析:rc=0表示ResultCode=0,即命令执行成功。
1 [root@manage ~]# ansible myhost -m shell -a "free -m"
ansible-doc
ansible-doc是Ansible模块文档说明,针对每个模块都有详细的用法及应用案例介绍,类似Linux的man。
基本语法:
1 ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
参数:
-v,--version:显示工具版本号;
-h,--help:显示该help说明;
-M MODULE_PATH,--module-path=MODULE_PATH:指定Ansible模块的默认加载目录;
-l,--list:列出所有可用模块;
-s,--snippet:只显示playbook说明的代码段;
示例:
1 [root@manage ~]# ansible-doc -l #列出支持的模块
2 [root@manage ~]# ansible-doc yum #查看模块功能说明
1 [root@manage ~]# ansible myhost -m yum -a 'name=redhat-lsb state=present' #安装软件
解析:
"changed":true:主机是否有变更,true表示有,false表示没有;
"msg":安装过程信息;
"rc":0,resultcode:结果返回码,非0返回码往往是红色并且错误的返回。
1 [root@manage ~]# ansible myhost -a 'lsb_release -a'
1 [root@manage ~]# ansible myhost -m yum -a 'name=mariadb,mariadb-server state=present'
2 [root@manage ~]# ansible myhost -m service -a 'name=mariadb state=started enabled=yes'
1 [root@manage ~]# ansible myhost -m service -a 'name=ntpd state=started' --limit "172.24.8.31"
--limit:通过limit参数限定主机做变更
1 [root@manage ~]# ansible 172.24.8.32 -m command -a "systemctl start ntpd"
1 [root@manage ~]# ansible 172.24.8.31:172.24.8.33 -m command -a "systemctl start ntpd"
解析:使用:指定多台服务器,:非31-33,而是31和33两台主机。
1 [root@manage ~]# ansible 172.24.8.3* -m command -a "systemctl stop ntpd"
参数 | 必填 | 默认值 | 选项 | 说明 |
---|---|---|---|---|
append | 否 | No | Yes/no | yes:增量添加group no:全量变更group,只设置groups指定的group组 |
comment | 否 | 用户的描述信息 | ||
createhome | 否 | yes | Yes/no | yes:添加用户同时创建家目录; no:添加用户时不创建家目录; |
force | 否 | No | Yes/no | 强制,结合state=absent使用, 相当于userdel --force |
generate_ssh_key | 否 | No | Yes/no | 是否生成秘钥,不会覆盖已有SSH key |
group | 否 | 可选,设定用户的主组 | ||
groups | 否 | 设置用户附属组,用逗号分隔的组; 当groups设定为空,则会移除除主组外其他所有组 | ||
home | 否 | 可选,设定为用户的home目录 | ||
login_class | 否 | 可选,设定FreeBSD/OpenBSD/NetBSD系统的用户 登陆class | ||
name | 是 | 用户名 | ||
move_home | 否 | No | Yes/no | 若为yes,则会临时迁移家目录到特定目录 |
non_unique | 否 | No | Yes/no | 可选,结合-u使用,允许改变用户ID为非唯一值 |
password | 否 | 可选,设定用户的密码(加密后的密码) | ||
remove | 否 | No | Yes/no | 结合state=absent使用, 相当于userdel --remove |
seuser | 否 | 可选,设置seuser类型启用SELinux | ||
shell | 否 | 可选,设定用户的shell | ||
skeleton | 否 | 可选,设置用户skel目录, 需和createhome参数结合使用 | ||
ssh_key_bits | 否 | 2048 | 可选,设定SSH key的加密位数 | |
ssh_key_comments | 否 | $HOSTHOME | 可选,定义SSH key注释信息 | |
ssh_key_file | 否 | .sha/id_rsa | 可选,定义SSH key文件名 | |
ssh_key_passphrase | 否 | 设置SSH key密码,若没有提供,则默认不加密 | ||
ssh_key_type | 否 | Rsa | 可选,指定SSH key类型 | |
state | 否 | Present | Present Absent | present:新增用户 absent:删除用户 |
system | 否 | No | Yes/no | 创建为系统账号,不会改变已经存在的用户 |
uid | 否 | 可选,设定为用户的uid | ||
update_password | 否 | Always | Always On_create | always:只有当用户密码不同才会更新密码 on_create:只为新用户设置密码 |
需求描述:为myhost1服务器,新增用户dba,使用BASH Shell,附加组为adm、mysql,家目录为/home/dba。
1 [root@manage ~]# ansible myhost1 -m user -a "name=dba shell=/bin/bash append=yes groups=adm,mysql home=/home/dba state=present"
需求描述:修改DBA附加组为mysql(即删除adm属组)。
1 [root@manage ~]# ansible myhost1 -m user -a "name=dba groups=mysql append=no"
需求描述:设置dba用户密码为x120952576。
1 [root@manage ~]# pip install passlib #使用pip安装psslib
提示:pip安装参考《001.Pip简介及使用》,passlib对于不同Python版本使用方式略有差异,Python多版本管理参考《Python多环境管理》。
1 [root@manage ~]# python -c "from passlib.hash import sha512_crypt;import getpass;print (sha512_crypt.encrypt(getpass.getpass()))" #使用Python3.x sha512加密算法加密
2 Password: #输入密码x120952576
提示:sha512加密的密码包括特殊元字符,如\n,在传输至远程服务器可能导致密码被转移异常的问题。
1 [root@manage ~]# python -c 'import crypt;print(crypt.crypt("x120952576","dba"))' #使用Python3.x 普通加密算法加密
略
略
略
1 [root@manage ~]# ansible myhost1 -m user -a "name=dba password=dbX.h0rUHw3Kc update_password=always"
参考文档:http://blog.51cto.com/hellocjq/2064114
需求描述:删除用户dba,并删除其家目录和邮件列表。
1 [root@manage ~]# ansible myhost1 -m user -a "name=dba remove=yes state=absent"
需求描述:新增用户dba,并设置密码为x123456.
1 [root@manage ~]# ansible myhost2 -m win_user -a "name=dba passwd=x123456 group=Administrator"
需求描述:新增MySQL用户dba,设置登录密码为x123456,对mysql.host表有ALL权限。
1 [root@manage ~]# ansible myhost1 -m mysql_user -a "login_host=localhost login_password=x120952576 login_user=root name=dba password=x123456 priv=mysql.host:ALL state=present"
提示:mysql_user需要MySQL-python模块,可先安装mysql-devel和MySQL-python组件。