Ansible自动化运维

Ansible

 

安装:yum、编译安装、Git方式、pip安装

配置文件:

/etc/ansible/ansible.cfg 主配置文件,配置ansible特性

/etc/ansible/hosts 主机清单

/etc/ansible/roles/ 存放角色的目录

程序

/usr/bin/ansible 主程序,临时命令执行工具

/usr/bin/ansible-doc 查看配置文档,模块功能查看工具

/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块官网平台

/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具

/usr/bin/ansible-pull 远程执行命令工具

/usr/bin/ansible-vault 文件加密工具

/usr/bin/ansible-console 给予console界面与用户交互执行工具

 

主机清单

[root@ansible ~]#vim /etc/ansible/hosts 
#可以分组 
[websrvs] 192.168.9.101 192.168.9.102 
[dbsrvs] 192.168.9.101 192.168.9.103 
# 可以指定连续的iP 
[appsrvs] 192.168.9.10[1:3] 
# 可以指定端口,指定的ssh的端口 
[port] 192.168.9.103:2222

 

主配置文件

[defaults]

#inventory = /etc/ansible/hosts # 主机列表配置文件

#library = /usr/share/my_modules/ # 开文件存放目录

#remote_tmp = ~/.ansible/tmp # 临时py命令文件存放在远程主机目录

#local_tmp = ~/.ansible/tmp # 本机的临时命令之星目录

#forks = 5 # 默认并发数

#sudo_user = root # 默认并发数

#ask_sudo_pass = True # 每次执行ansible命令是否询问密码

#ask_pass = True

#remote_port = 22

# host_key_checking = False # 检查对应服务器的host_key,建议取消注释

#log_path = /var/log/ansible.log # 日志文件

ansible命令

(ansible 兼容Centos6和Centos5请看:ansible如果兼容Centos5)

-m:指定模块 # ansible 192.168.9.101,192.168.9.102 -m ping -u root -k //ip必须在主机清单

-v 详细过程 -vv -vvv 更详细

--list-hosts:显示主机列表

[root@ansible ~]#ansible all --list-hosts

[root@ansible ~]#ansible websrvs --list-hosts

-k,--ask-pass:输入ssh连接密码,默认key验证

-K,--ask-become-pass 提示输入sudo时的口令

-u:用户名

-T,--timeout=TIMEOUT 执行命令超时时间,默认10s

-u,--user=REMOTE_USER 执行远程知心的用户

-b,--become 代替旧版的sudo切换

 

ansible-doc

-a:列出所有模块文档

-l:列出可用模块

-s 模块名:简单显示模块的使用

模块名:查看模块的帮助文档

 

[root@ansible ~]#ansible dbsrvs -m command -a 'ls /root' -u xuan -k -b -K -m command // 使用的command这个模块 -a 'ls /root' 这个是模块的参数 -u xuan 指定用户 -k 使用密码验证 -b 使用sudo -K 提示输入sudo的密码 
[root@ansible ~]#ansible 'all' -m ping //所有主机 
[root@ansible ~]#ansible '*' -m ping //所有主机 
[root@ansible ~]#ansible 'websrvs:dbsrvs' -m ping //在websrvs组中的和dbsrvs组中的或关系 
[root@ansible ~]#ansible 'websrvs:dbsrvs' --list 
[root@ansible ~]#ansible 'websrvs:&dbsrvs' -m ping //记载websrvs中的又在dbsrvs组中的,与关系 
[root@ansible ~]#ansible 'websrvs:&dbsrvs' --list 
[root@ansible ~]#ansible 'websrvs:!dbsrvs' --list //在websrvs里边,但是不在dbsrvs里边,此处必须为单引号 [root@ansible ~]#ansible "~(web|db)srv" -m ping //正则表达式

 

anseble命令执行过程

ansible命令执行过程

①加载子自己的配置文件,默认/etc/ansible/ansiblecfg

②加载自己对应的模块文件,如command

③通过ansible将模块或命令生成对用的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/ansible/tmp/ansible-tmp-数字/XXX.py文件

④ 给文件x权限

⑤执行并返回结果

⑥删除临时py文件,sleep 0 退出

执行状态,在/etc/ansible/ansible.cfg文件中有说明,475行,[colors]模块

绿色:执行成功并且不需要做改变的操作

黄色:执行成功并对目标主机做变更

红色:执行失败

 

 二、常见模块

ansible常见模块

{ping,command,shell,script,fetch,copy,hostname,cron,file,yum,service,user,group}

command

chdir:切换目录

  [root@ansible ~]#ansible all -a 'chdir=/media ls' //查看/media目录

creates:后边的文件存在就不执行

  [root@ansible ~]#ansible all -a 'creates=/media/cdrom mkdir /media/cdrom' //如果存在/media/cdrom,就创建/media/cdrom

removes:如果存在就执行

  [root@ansible ~]#ansible all -a 'removes=/media/cdrom ls -l -d /media/cdrom/' //如果存在/media/cdrom,就查看该文件

 

shell模块:因为command模块不支持重定向、管道、变量等特殊场景,所以需要shell模块

chdir:切换目录

creates:后边的文件存在就不执行

removes:如果存在就执行

[root@ansible ~]#ansible all -m shell -a 'echo $HOSTNAME' //查看每台机器的主机名 
[root@ansible ~]#ansible all -m shell -a 'echo aptech1! | passwd --stdin root' //批量改密码

 

Script:可以将本地的脚本在所有主机上执行

chdir:切换目录

creates:后边的文件存在就不执行

removes:如果存在就执行

[root@ansible ansible]#vim script1 #!/bin/bash hostname 
[root@ansible ansible]#ansible all -m script -a '/root/ansible/script1'

 

copy:将本地的文件推送到目标文件

backup:将原有文件备份

content:直接编辑内容

dest:目标文件的位置

mode:权限

owner:所有者

src:源文件

[root@ansible ansible]#ansible all -m copy -a 'src=/root/ansible/selinux dest=/etc/selinux/config backup=yes mode=000 owner=xuan' 

#content 
[root@ansible ansible]#ansible all -m copy -a 'content="hello
轩
轩" dest=/tmp/f1'

 

Fetch:从客户端提取文件至服务器端,与copy相反

dest:目标文件的位置

src:源文件

[root@ansible ~]#ansible all -m fetch -a 'src=/etc/sysconfig/network dest=/data' 

[root@ansible ~]#tree /data/
/data/
├── 192.168.9.101
│   └── etc
│       └── sysconfig
│           └── network
├── 192.168.9.102
│   └── etc
│       └── sysconfig
│           └── network
└── 192.168.9.103
    └── etc
        └── sysconfig
            └── network

9 directories, 3 files

 

file:设置文件属性

[root@ansible ansible]#ansible all -m file -a 'name=/data/f3 state=touch' #在/datax下创建文件f3 
[root@ansible ansible]#ansible all -m file -a 'dest=/data/f3 state=absent' #删除/data/f3 
[root@ansible ansible]#ansible all -m file -a 'path=/data/dir1 state=directory' #在/data下创建dir1文件夹 
[root@ansible ansible]#ansible all -m file -a 'path=/data/dir1 state=absent' #删除/data/dir1文件夹 
[root@ansible ansible]#ansible all -m file -a 'src=/etc/fstab dest=/data/f.link state=link' #将/etc/fstab软连接到/data/f.link文件 
[root@ansible ansible]#ansible all -m file -a 'dest=/data/f.link state=absent' #删除软连接

 

hostname:更改主机名,因为每个主机不应该一样,所以后期使用变量批量更改

  [root@ansible ansible]#ansible 192.168.9.101 -m hostname -a 'name=node01'

 

Cron:计划任务

disabled=true、yes、y、fales、no、n.... 禁用或启用

[root@ansible ansible]#ansible all -m cron -a 'minute=* weekday=2,4,6 job="/usr/bin/wall FBI warning" name=xuan'   # 计划任务,在周二、四、六每分钟报警一次 

[root@ansible ansible]#ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=xuan'   # 禁用计划任务,job不加会报错,name不加会新建一个计划任务并注释,原来的并不会被禁用 

[root@ansible ~]#ansible all -m cron -a 'job="/usr/bin/wall" name=xuan state=absent'   # 删除计划任务 

 

Yum:管理包

state=latest:安装,默认就是安装

installed:查看已经安装过的

removed:卸载

disable_gpg_check=yes:忽略key验证

update_cache=yes:更新缓存

[root@ansible ~]#ansible all -m yum -a 'name=ftp'   #安装ftp客户端软件,默认为安装,所以默认不需要state=latest 

[root@ansible ~]#ansible websrvs -m yum -a 'list=installed'   #查看已经安装过的软件 

[root@ansible ~]#ansible websrvs -m yum -a 'name=ftp state=removed'   # 卸载ftp客户端软件 # 同时安装多个包 

[root@ansible ~]#ansible websrvs -m yum -a 'name=ftp,vsftpd,httpd' # 同时卸载多个包,absent和removed都可以 
[root@ansible ~]#ansible websrvs -m yum -a 'name=ftp,vsftpd,httpd state=absent' 

#安装rpm单个包,先使用copy,在使用yum   ①copy复制   [root@ansible
~]#ansible all -m copy -a 'src=/media/cdrom/Packages/dstat-0.7.2-12.el7.noarch.rpm dest=/root'   ②yum安装,并且忽略key验证    [root@ansible ~]#ansible all -m yum -a 'name=/root/dstat-0.7.2-12.el7.noarch.rpm disable_gpg_check=yes' [root@ansible ~]#ansible websrvs -m yum -a 'update_cache=yes' # 更新缓存

 

Service

enabled:开机启动

name:指定服务名

state:started、stopped、restarted、reloaded

[root@ansible ~]#ansible websrvs -m service -a 'state=started enabled=yes name=vsftpd'   # 启动vsftpd,设置为开机启动
 
[root@ansible ~]#ansible websrvs -m service -a 'state=stopped enabled=no name=vsftpd  # 关闭vsftpd,取消开机启动

'

 

User:管理用户

comment:注释

create_home:是否创建家目录

expires:过期时间

group:主组

groups:附加组

home:家目录

name:用户名

password:加密口令

remove:删除,而且删除家目录

system:制定系统账号

shell:shell类型

[root@ansible ~]#ansible websrvs -m user -a 'name=nginx shell=/sbin/nologin system=yes create_home=no groups=wheel uid=80 comment="Nginx server"'    # 创建nginx用户,shell为nologin,是一个系统账户,不创建家目录,uid为80,commend描述

[root@ansible ~]#ansible websrvs -m user -a 'name=nginx shell=/sbin/nologin home=/home/nginx system=yes create_home=yes groups=wheel uid=80 comment="Nginx server"'    # home指定家目录 

[root@ansible ~]#ansible websrvs -m user -a 'name=nginx state=absent remove=yes'   # 删除nginx用户,如果有家目录,也将家目录删除 

 

Group

system:是否是系统组

gid:

state

name

[root@ansible ~]#ansible websrvs -m group -a 'name=nginx system=y gid=80' # 系统组,gid为80

[root@ansible ~]#ansible websrvs -m group -a 'name=nginx state=absent'  # 删除组

 

三、ansible的小命令与Playbook的编写

ansible-galaxy

下载galaxy

  [root@ansible ~]#ansible-galaxy install geerlingguy.nginx

查看galaxy

  [root@ansible ~]#ansible-galaxy list //查看所有角色

  [root@ansible ~]#ansible-galaxy list geerlingguy.nginx //查看单个角色

  [root@ansible ~]#cp -ar .ansible/roles/{geerlingguy.nginx,xuan.nginx} //就等于又创建了一个角色

删除galaxy

  [root@ansible ~]#ansible-galaxy remove geerlingguy.nginx

ansible-pull(push拉,pull推)

速度较快

 

ansible-playbook(后边还有更多介绍)

后缀建议为yml

#第一个plabook
[root@ansible ansible]#vim hello.yml              
---        //第一行的---是一个习惯
- hosts: websrvs      //必须要注意空格,对空格很敏感,hosts代表远程主机,websrvs是之前创建爱你的主机清单组
  remote_user: root   // 在远程使用什么身份执行

  tasks:
    - name: xuan       //playbook的名字
      command: hostname    //command是模块,hostname是命令

ansible-vault:用于加密ansible-playbook

[root@ansible ansible]#ansible-vault encrypt hello.yml # 将hello.yml加密

[root@ansible ansible]#ansible-vault view hello.yml # 查看加密后的文件内容,需要输入解密密码

[root@ansible ansible]#ansible-vault edit hello.yml    # 编辑加密后的文件

[root@ansible ansible]#ansible-vault rekey hello.yml  # 修改口令

[root@ansible ansible]#ansible-vault create hello2.yml  # 创建一个新的,加密的文件

[root@ansible ansible]#ansible-vault decrypt hello.yml  # 将hello.yml解密

ansible-console:2.0+新增,可交互式执行命令,支持tab

[root@ansible ansible]#ansible-console
# 远程执行命令的用户@针对的主机 (3个主机) [f:
5]代表并发数 root@all (3)[f:5]$ # 切换针对的主机为websrvs组 root@all (3)[f:5]$ cd websrvs # 修改并发数为10 root@websrvs (2)[f:5]$ forks 10 # 调用command模块 root@websrvs (2)[f:10]$ command hostname

 

Playbook:YAML语言编写

 

YAML介绍

 

YAML语法简介

 

 

YAML语法

 

 

Playbood核心元素

Hosts 指定的远程主机列表(支持)

Tasks 任务集

tasks中的一个name只能对应一个模块的执行任务,只会执行后边定义的

Varniables 内置变量或自定义变量在playbook中调用

Tempplates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件

Handlers 和 notity集合使用,由特定条件触发的操作,满足条件方执行,否则不执行

[root@ansible ansible]#cat http.yml 
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: install httpd Package
      yum: name=httpd
    - name: copy conf file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=y
      notify: restart service      //当文件发生改变时,使用notify调用handlers的restart server
    - name: start service
      service: name=httpd state=started enabled=y

  handlers:
    - name: restart service     # 这里的名字用于tasks里边的调用
      service: name=httpd state=restarted

tags 标签 指定某条任务执行,用于选择运行playbook 中的部分代码

  多个name公用一个标签,执行的那个标签的时候,都会被执行

[root@ansible ansible]#cat http.yml 
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: install httpd Package
      yum: name=httpd
      tags: install
    - name: copy conf file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=y
    - name: start service
      service: name=httpd state=started enabled=y
      tags: startservice
# 查看文件中定义了哪些模块
[root@ansible ansible]#ansible-playbook --list-tags http.yml
# 使用-t单独指定执行的tags
[root@ansible ansible]#ansible-playbook -t install http.yml

ansible-playbook

-C,--check:不执行,检查与法

--list-hosts:列出运行任务的主机

--list-tags:列出tags

--list-tasks :列出tasks中定义的内容,列出的同时也会有tags信息

--limit:指定运行的主机,前提是主机必须在文件中定义

-t:指定执行的tahs

-v -vv -vvv

 

Playbook执行失败后续怎么继续执行

无论如何返回true方法

tasks:

- name: test1

shell: /aaa || /bin/true

使用playbook自带的忽略错误

tasks:

- name: test2

shell: /aaa

ignore_errors:True

 

 

ShellScripts VS Playbook

 

 

Playbook示例

# 相对路径
[root@ansible ansible]#cat playbook1.yml 
---
- hosts: websrvs
  remote_user: root

  tasks:
   - name: cppy index
     copy: src=files/index.html dest=/var/www/html/    # 相对路径是相对的当前目录

 

 五、变量

变量:字母、数字、下划线组成,字母开头

变量来源

  ①ansible setup facts 远程主机的所有变量可以直接调用

    setup是一个模块,这个模块可以不添加任何参数直接执行,会返回对方主机的很多信息,并且使用变量进行保存

 

# 显示所有变量
[root@ansible ~]#ansible websrvs -m setup 

# 也可以使用-a 加参数,过滤其中的某些参数
[root@ansible ~]#ansible websrvs -m setup -a 'filter=ansible_fqdn'     //显示FQDN主机名
[root@ansible ~]#ansible websrvs -m setup -a 'filter=*address*'    //显示地址,会显示包含address关键字的相关信息
[root@ansible ~]#ansible websrvs -m setup -a 'filter=ansible_eth*'   //也可以看某个网卡的参数

  setup在playbook中的示例

 

[root@ansible ansible]#cat var4.yml 
---
- hosts: websrvs
  remote_user: root

  tasks:
  - name: create log file
    file: name=/data/{{ansible_fqdn}}.log state=touch mode=600 owner=xuan  # ansible_fqdn就是一个setup中的变量

  ②在主机清单中定义

    普通变量:主机组中主机单独定义,优先级高于公共变量

    公共(组)变量:针对主机组中所有主机定义统一变量

[root@ansible ansible]#cat /etc/ansible/hosts
[websrvs]
192.168.9.101 host_port=81       # 普通变量
192.168.9.102 host_port=82

[websrvs:vars]    # 公共(组)变量
nodename=www
domainname=p-pp.cn

# 在playbook中调用
[root@ansible ansible]#cat var3.yml           
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: set hostname
      hostname: name={{nodename}}{{host_port}}.{{domainname}}
  ③通过命令行指定变量,优先级最高
[root@ansible ~]#cat ansible/var1.yml
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: install package
      yum: name={{ pkname1 }}
    - name: install package
      yum: name={{ pkname2 }}
# 在执行时定义
[root@ansible ansible]#ansible-playbook -e "pkname1=httpd pkname2=vsftpd" var1.yml -C
  ④在playbook中定义
[root@ansible ansible]#cat var2.yml 
---
- hosts: websrvs
  remote_user: root
  vars:
    - pkname1: httpd
    - pkname2: vsftpd

  tasks:
    - name: install package1
      yum: name={{ pkname1 }}
    - name: install package2
      yum: name={{ pkname2 }}
  ⑤也可以使用vars_files指定文件
[root@ansible ansible]#cat vars.yml 
var1: httpd
var2: vsftpd

[root@ansible ansible]#cat var5.yml  
---
- hosts: websrvs
  remote_user: root
  vars_files:      //调用文件中的变量
    - vars.yml    //vars.yml是文件的名字
  tasks:
  - name: install package
    yum: name={{var1}},{{var2}}
  - name: create file
    file: name=/data/{{var2}}.log state=touch

在rule中定义

命令行变量 > playbook > 主机清单

原文地址:https://www.cnblogs.com/-xuan/p/10821434.html