ansible常见命令行使用方式

Ansible 可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置. 默认的文件路径为 /etc/ansible/hosts

控制本地同内网机器

一、inventory默认的主机文件情况下(/etc/ansible/hosts):

1、主机与组:

例如:编辑/etc/ansible/hosts文件中,添加主机信息和组信息,如图:

方括号[]中是组名,用于对系统进行分类,便于对不同系统进行个别的管理 , 一台服务器可以同时属于 webserver组 和 dbserver组.这时属于两个组的变量都可以为这台主机所用 ,也可以单独定义主机不属于任何组

注意:主机不一定非要是IP,域名也是可以的(能解析到IP)

如果有主机的SSH端口不是标准的22端口,可在主机名之后加上端口号,用冒号分隔,如下:

主机类信息也可以通过数字或者字母范围来表示,如图:

对于每一个 host,你还可以选择连接类型和连接用户名:

[targets]

localhost              ansible_connection=local
other1.example.com     ansible_connection=ssh        ansible_ssh_user=mpdehaan
other2.example.com     ansible_connection=ssh        ansible_ssh_user=mdehaan

2、主机变量:

分配变量给主机很容易做到,这些变量定义后可在 playbooks 中使用:

#定义主机中的http服务的端口
[webservers]
192.168.226.129 http_port=80 maxRequestsPerChild=808
192.168.226.130 http_port=303 maxRequestsPerChild=909

3、组变量:

定义webservers组变量,用于连接远程机器的认证信息,如图:

上图中设置完webserver:vars组变量后,webservers组成员的所有主机都可以使用此变量(主机登录密码需保持一直,建议采用秘钥形式)

例如:查询主机的磁盘信息,如图:

4、把一个组作为另一个组的成员:

可以把一个组作为另一个组的子成员,以及分配变量给整个组使用. 这些变量可以给 /usr/bin/ansible-playbook 使用,但不能给 /usr/bin/ansible 使用

例如:下面定义组变量source,将webservers和dbservers作为source组的子成员,source成员变量只对组成员有效,如图:

通过组名source来执行命令,如图:

5、分文件定义主机和组变量(hosts文件中不定义变量):

在 inventory 主文件中保存所有的变量并不是最佳的方式.还可以保存在独立的文件中,这些独立文件与 inventory 文件保持关联. 不同于 inventory 文件(INI 格式),这些独立文件的格式为 YAML 或者yml

以默认的inventory路径/etc/ansible/hosts为例子,假如目前有一台主机属于webservers组,还有一台主机属于dbservers组,如图:

现在在/etc/ansible目录下创建文件夹group_vars,在其中创建组变量文件(文件名称必须要和hosts中定义的组名相同),webservers.yml和dbsevers.yml,在其中写入变量名称,注意在”:”后面还有空格,如图:

通过组名webservers来执行命令,如图:

*注:上述组变量文件webservers.yml只对组servers下的主机生效,dbservers.yml只对组dbservers下的主机生效

主机变量:在hosts文件中定义主机信息,别名为hello,如图:

在/etc/ansible目录下创建文件夹host_vars,在其中定义文件hello.yml(注意名字一定要相同),在内部写入主机变量,如图:

*注: Ansible 1.2 及以上的版本中,group_vars/ 和 host_vars/ 目录可放在 inventory 目录下,或是 playbook 目录下. 如果两个目录下都存在,那么 playbook 目录下的配置会覆盖 inventory 目录的配置.

6、inventory参数说明:

如同前面提到的,通过设置下面的参数,可以控制 ansible 与远程主机的交互方式,其中一些我们已经讲到过:

  • ansible_ssh_host:将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置
  • ansible_ssh_port: ssh端口号.如果不是默认的端口号,通过此变量设置
  • ansible_ssh_user:默认的 ssh 用户名
  • ansible_ssh_pass: ssh 密码(这种方式并不安全,我们强烈建议使用 –ask-pass 或 SSH 密钥)
  • ansible_sudo_pass:sudo 密码(这种方式并不安全,我们强烈建议使用 –ask-sudo-pass)
  • ansible_sudo_exe (new in version 1.8): sudo 命令路径(适用于1.8及以上版本)
  • ansible_connection:与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 ‘smart’,’smart’ 方式会根据是否支持 ControlPersist, 来判断’ssh’ 方式是否可行.
  • ansible_ssh_private_key_file:ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
  • ansible_shell_type:目标系统的shell类型.默认情况下,命令的执行使用 ‘sh’ 语法,可设置为 ‘csh’ 或 ‘fish’.
  • ansible_python_interpreter:目标主机的 python 路径.适用于的情况,系统中有多个 Python, 或者命令路径不是”/usr/bin/python”,比如 \*BSD, 或者 /usr/bin/python, 不是 2.X 版本的 Python.我们不使用 “/usr/bin/env” 机制,因为这要求远程用户的路径设置正确,且要求 “python” 可执行程序名不可为 python以外的名字(实际有可能名为python26).

7、用all 参数等同于目标为仓库(inventory)中的所有机器,如图:

8、 如下表示一个或多个groups,多组之间以冒号分隔表示”“的关系,表示执行webservers和dbservers中的主机,如图:

9、用dbservers[0]表示dbservers组中的第一台主机,dbservers[1]表示第二台主机,以此类推,如图:

10、用dbservers[0:2] 表示dbservers组中的第1台到第3台主机(包括第3台),如图:

11、逻辑非!和逻辑与(and)

排除特定的主机 :webservers:!dbservers表示主机必须在webservers组中而不在dbservers组中,如图:

执行交集的主机:webservers:&dbservers表示主机必须同时在这两个组中,如图:

更复杂的表达式: webservers:dbservers:&app:!data 表示主机在webservers或dbservers组中,而且必须在app组中并且不能在data组中,如图:

二、自定义主机文件清单:

上述例子中的所有命令主机都是在默认的主机文件位置(/etc/ansible/hosts),如果要自定义主机清单位置,可按照如下方式

1、创建文件夹inventory(可自定义文件夹名称),在此目录下创建hosts文件(名字可自定义可根据需要定义多个主机文件),创建组变量group_vars和host_vars文件夹,变量文件编写方法和上面一样,如图:

在执行命令时,需要先进入定义的文件夹中,然后通过-i指定主机文件位置(可以是绝对路径或者相对路径),如图:

或者直接通过全路径执行:ansible webservers -i /data/inventory/hosts -m shel -a “free -m”

控制远程主机

如果现在需要在本地的ansible来操作远程主机,此时需要一个跳板机作为中转,比如通过jenkins发版到阿里云的内网机器中,那么/etc/ansible/hosts中可以这样配置:

aliyun_10_23       ansible_ssh_host=192.168.10.23  ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p -q -i /root/.ssh/id_rsa root@125.29.239.129"'
  • aliyun_10.23:主机别名
  • ansible_ssh_host:指向具体的阿里云内网机器
  • ansible_ssh_common_args:指定命令参数
  • -o:SSH客户端选项标志
  • ProxyCommand:这是一个SSH配置选项,用于定义一个命令,该命令将被用来创建连接到远程主机的代理连接。这通常用于通过跳板机(bastion host)或代理服务器来连接到远程主机
  • -W %h:%p:这个选项告诉SSH客户端通过跳板机创建一个到目标主机的隧道。%h%p 分别是目标主机的主机名和端口,它们会被自动替换为实际的远程主机地址和端口,本例子中目标主机为125.29.239.129,端口是默认的22,如果端口有变动,将%p替换为具体端口即可
  • -q:安静模式,减少SSH客户端的输出
  • -i /root/.ssh/id_rsa:指定用于SSH连接的私钥文件路径,这里是本地Linux机器生成的私钥,公钥要放在阿里云的全部机器上,可将公钥粘贴到/root/.ssh/authorized_keys文件中即可
  • root@125.29.239.129:跳板机的用户名和IP地址,此IP为阿里云的公网IP

最后通过ansible aliyun_10_23 -m command -a “free -m” 测试即可

注意:阿里云的内网机器都必须要安装Python才可以,否则会提示找不到解析器,报错:

标签