linux

ansible使用

2022-03-07  本文已影响0人  wangfeiq

Ansible使用

整体介绍

整体架构

img

配置文件

/etc/ansible/ansible.cfg 主配置文件 ansible的配置文件

/etc/ansible/hosts Inventory 要远程控制的主机列表

/usr/bin/ansible-doc 帮助文件

/usr/bin/ansible-playbook 指定运行任务文件

Host主机配置

配置文件

默认: /etc/ansible/hosts

inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成。

语法

定义主机和主机组

100.0.0.1 ansible_ssh_pass='123456' # 配置两台主机

100.0.0.2 ansible_ssh_pass='123456'

[docker] # 定义主机组,包含100.0.0.11-100.0.0.13三台主机

100.0.0.1[1:3]

[docker:vars] # 定义主机组的内置参数

ansible_ssh_pass='123456' # 定义登陆docker组使用的ssh登陆密码

[ansible:children] # 定义ansible组,ansible组包含docker组

docker

常用内置参数

参考解释例子ansible_ssh_host将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.ansible_ssh_host=192.169.1.123ansible_ssh_portssh端口号.如果不是默认的端口号,通过此变量设置.ansible_ssh_port=5000ansible_ssh_user默认的 ssh 用户名ansible_ssh_user=cxpadminansible_ssh_passssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)ansible_ssh_pass=’123456’

ansible2.0,ansible_ssh_user, ansible_ssh_host, ansible_ssh_port已经改变为ansible_user, ansible_host, ansible_port。具体参考官网

http://docs.ansible.com/ansible/latest/intro_inventory.html

模块

常见的模块及使用参考:ansible基本使用教程 - 陈小跑 - 博客园

常用模块:

ping    测试指定主机是否能连接

   # ansible all -m ping

shell   在远程主机上运行命令

   尤其是用到管道变量等功能的复杂命令

   # ansible all -m shell -a 'echo magedu | passwd --stdin user1'

script  将本地脚本复制到远程主机并运行之

   # ansible all -m script -a '/tmp/test.sh'

copy    复制文件(复制本地文件到远程主机的指定位置)

   src     定义本地源文件路径

   dest    定义远程目录文件路径(绝对路径)

   owner   属主

   group   属组

   mode    权限

   content 取代src=,表示直接用此处的信息生成为文件内容

   # yum -y install libselinux-python

   # ansible all -m copy -a 'src=/etc/fstab dest=/tmp/fstab.ansible owner=root mode=640'

   # ansible all -m copy -a 'content="hello ansiblenHi ansible" dest=/tmp/test.ansible'

cron        计划任务    

   month   指定月份

   minute  指定分钟

   job     指定任务

   day     表示那一天

   hour    指定小时

   weekday 表示周几

   state   表示是添加还是删除

       present:安装

       absent:移除

   # ansible webserver -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"'   #不写默认都是*,每个任务都必须有一个名字

   # ansible webserver -a 'crontab -l'

   # ansible webserver -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job" state=absent'  #移除任务   

setup   收集远程主机的facts

   每个被管理节点在接受并运行管理命令之前,会将自己主机相关信息,如操作系统版本,IP地址等报告给远程的ansible主机

   # ansible all -m setup

service 管理服务运行状态

   enabled 是否开机自动启动

   name    指定服务名

   state   指定服务状态

       started     启动服务

       stoped      停止服务

       restarted   重启服务

   arguments   服务的参数

   # ansible webserver -m service -a 'enabled=true name=httpd state=started'

ansible命令行使用

语法:ansible <host-pattern> [-f forks] [-m module_name] [-a args]

host-pattern.  : IP或主机/主机组,可以填ip,inventory中的主机[组],或者all

-f forks       : 一次处理多少台主机

-m module_name : 要使用的模块

-a args        : 模块特有的参数

例子: ansible docker -m shell -a "echo hello"

ansible-playbook使用说明

命令行方式一次只能执行单条命令,如果命令量较多,可以使用playbook的方式。https://segmentfault.com/a/1190000038230424

变量

playbook文件编写

playbook使用yaml格式编写。组成结构如下:

inventory       #以下操作应用的主机

modules         #调用哪些模块做什么样的操作

ad hoc commands #在这些主机上运行哪些命令

playbooks  

   tasks       #任务,即调用模块完成的某操作

   variable    #变量

   templates   #模板

   handlers    #当关注的资源发生变化时,需要采取的操作

   roles       #角色

举例如下:

# cat apache.yml

- hosts: webserver

 remote_user: root

 vars:

 - package: httpd

 - service: httpd

 tasks:

 - name: install httpd package

   yum: name={{ package }} state=latest

 - name: install configuration file for httpd

   copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf

   notify: # notify调用handlers中的操作。

   - restart httpd

 - name: start httpd service

   service: enabled=true name={{ service }} state=started

 handlers: # 当httpd发生

 - name: restart httpd

   service: name=httpd state=restarted

使用参考:https://segmentfault.com/a/1190000038230424

ansible-playbook命令使用

ansible-playbook test.yaml --extra-vars "hosts=www user=abc"

帮助

ansible-doc -l               # 列出ansible所有的模块

ansible-doc -s MODULE_NAME   # 查看指定模块具体适用

Q&A

问题1:不能使用密码登陆,只能通过key

报错信息

"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."

解决:

  1. 首先安装sshpass
  2. 然后修改ansible配置文件/etc/ansible/ansible.cfg ,将#host_key_checking = False 将#号去掉即可

问题2: 后台执行命令自动退出

通常情况下,通过&指定的后台任务在终端退出后会自动退出执行。一般来说,加上nohup即可在后台一直执行。但在使用ansible时,发现ansible all -m shell -a 'nohup cmd &'命令无法在后台一直执行。后来想了个办法,将命令写入脚本,然后通过执行脚本来实现。
脚本内容为

nohup cmd  > /xxx/xxx/log.log & 
sleep 3

ansible命令为ansible all -m script -a 'bash xxx.sh'。sleep的原因是退出太快可能脚本没跑起来就退出了。

上一篇 下一篇

猜你喜欢

热点阅读