Ansible 安装配置及使用

一、ansible 介绍

Ansible是一个简单高效的自动化运维管理工具,用Python开发,能大批量管理N多台机器,可以并发的在多台机器上部署应用、安装软件、执行命令、配置和编排任务。

 
 

一、Ansible工作机制

 
 

从图中可以看出ansible分为以下几个部份:

1> Control Node:控制机器

2> Inventory:主机清单,配置管理主机列表

3> Playbooks:剧本、任务编排。根据规则定义多个任务,模块组织结构清晰,由ansible自动执行。

4> Modules(Core | Custom):模块,用于执行某个具体的任务

5> connection plugin(连接插件):Ansible通过不同的协议连接到远程主机上,执行指定的命令。默认采用ssh协议连接远程主机。

二、Ansible执行流程

 
 

简单理解就是Ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取Inventory中的管理主机列表,并行的在这些主机中执行配置的任务,最后等待执行返回的结果。

Ansible中有两种模式,分别是 Ad-Hoc模式和playbook模式

 
 

二、安装Ansible

一台控制主机:192.168.0.202

三台管理主机:

  • 192.168.100.131
  • 192.168.100.141
  • 192.168.100.231

安装要求:

  • 控制服务器:需要安装 Python2.6/2.7
  • 管理服务器:需要安装 Python2.4 以上版本,若低于 Python2.5 需要安装 pythonsimplejson; 若启用了 selinux,则需要安装 libselinux-python。

本次安装基于CentOS7系统环境、Python2.7.5、root用户。

2.1yum安装(推荐)

# 安装依赖

yum install rpm-build python2-devel sshpass PyYAML python-jinja2 python-paramiko python-six python2-cryptography -y

yum install epel-release -y

yum install ansible -y

2.2pip安装

pip install ansible1

注:pip方式安装不会在/etc/ansible目录下生成默认的相关配置文件

三、ansible配置使用

3.1ansible.cfg 配置

defaults下的配置项,常用的配置参数:

1)inventory 该参数表示资源清单inventory文件的位置,资源清单就是一些Ansible需要连接管理的主机列表 inventory = /root/ansible/hosts

 
 

2)library Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录 library = /usr/share/ansible

 
 

3)forks 设置默认情况下Ansible最多能有多少个进程同时工作,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管理节点的数量来确定。 forks = 5

 
 

4)sudo_user 这是设置默认执行命令的用户,也可以在playbook中重新设置这个参数 sudo_user = root //注意:新版本已经作了修改,如ansible2.4.1下已经为: default_sudo_user = root

 
 

5)remote_port 这是指定连接被关节点的管理端口,默认是22,除非设置了特殊的SSH端口,不然这个参数一般是不需要修改的 remote_port = 22

 
 

6)host_key_checking 这是设置是否检查SSH主机的密钥。可以设置为True或False host_key_checking = False

3.2hosts配置文件

主机登录方式:

方式一:ssh用户+ssh密码

[group_name]

192.168.100.231:22 ansible_ssh_user=root ansible_ssh_pass='123456'

Ssh用户+ssh密码

方式二:ssh用户+ssh密钥

[group_name]

192.168.100.231:22 ansible_ssh_user=root ansible_ssh_private_key_file=idrsapath(密钥路径)

Ssh用户+ssh密钥

 
 

方式三:别名+ssh用户+ssh密钥

[group_name]

test1 192.168.100.231:22 ansible_ssh_user=root ansible_ssh_private_key_file=idrsapath(密钥路径)

别名+ssh用户+ssh密钥

3.3ansible 使用

3.3.1、Ansible 组的使用

规划两个主机组 test_group1 test_group2

 
 

3.3.2、用户密码、密钥登录

场景1 密码登录

安装ssh_pass包

yum –y install sshpass #apt-get install sshpass

示例如下:

[test_group1]

192.168.100.231:22 ansible_ssh_user=root ansible_ssh_pass='dianying123?'

192.168.100.141:22 ansible_ssh_user=root ansible_ssh_pass='dianying123?'

[test_group2]

192.168.100.128:22 ansible_ssh_user=root ansible_ssh_pass='dianying123?'

192.168.100.142:22 ansible_ssh_user=root ansible_ssh_pass='dianying123?'

场景2 密钥登录

  • 生成并配置ssh公钥、私钥

[root@node0 ansible]# ssh-keygen

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):

/root/.ssh/id_rsa already exists.

Overwrite (y/n)? y

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

66:7b:8b:17:19:65:73:24:9f:5e:28:24:28:53:dc:ec root@node0

The key's randomart image is:

+--[ RSA 2048]----+

| o.+. o.. |

| o o oo+o.o |

| o . o.o+ .|

| E o . |

| S o . |

| o .o |

| . .. |

| o.. |

| ... |

+-----------------+

[root@node0 ansible]#

 
 

拷贝密匙到指定主机

[root@node0 ansible]# ssh-copy-id 192.168.100.128

root@192.168.100.128's password:

Now try logging into the machine, with "ssh '192.168.100.128'", and check in:

 
 

.ssh/authorized_keys

 
 

to make sure we haven't added extra keys that you weren't expecting.

 
 

[root@node0 ansible]#

 
 

2、ansible 配置文件

3、执行操作

方法一

 
 

方法二

 
 

 
 

 
 

3.4 ansiblead-hoc模式

3.4.1 什么是ad-hoc模式

Ad-Hoc 是指ansible下临时执行的一条命令,并且不需要保存的命令,对于复杂的命令会使用playbook。Ad-hoc的执行依赖于模块,ansible官方提供了大量的模块。 如:command、raw、shell、file、cron等,具体可以通过ansible-doc -l 进行查看 。可以使用ansible-doc -s module来查看某个模块的参数,也可以使用ansible-doc help module来查看该模块更详细的信息。

Ad-Hoc 简而言之,就是"临时命令"。

 
 

 
 

3.4.2 ad-hoc模式使用场景

批量执行、查看 、拷贝

 
 

3.4.3 ad-hoc模式命令使用

ansible <host-pattern> [options] 可用选项,那么使用ansible这个命令,有哪些功能和选项呢?

ansible命令的参数,如下:

-v, --verbose:输出更详细的执行过程信息,-vvv可得到所有执行过程信息。

-i PATH, --inventory=PATH:指定inventory信息,默认/etc/ansible/hosts。

-f NUM, --forks=NUM:并发线程数,默认5个线程。

--private-key=PRIVATE_KEY_FILE:指定密钥文件。

-m NAME, --module-name=NAME:指定执行使用的模块。

-M DIRECTORY, --module-path=DIRECTORY:指定模块存放路径,默认/usr/share/ansible,也可以通过ANSIBLE_LIBRARY设定默认路径。

-a 'ARGUMENTS', --args='ARGUMENTS':模块参数。

-k, --ask-pass SSH:认证密码。

-K, --ask-sudo-pass sudo:用户的密码(—sudo时使用)。

-o, --one-line:标准输出至一行。

-s, --sudo:相当于Linux系统下的sudo命令。

-t DIRECTORY, --tree=DIRECTORY:输出信息至DIRECTORY目录下,结果文件以远程主机名命名。

-T SECONDS, --timeout=SECONDS:指定连接远程主机的最大超时,单位是:秒。

-B NUM, --background=NUM:后台执行命令,超NUM秒后kill正在执行的任务。

-P NUM, --poll=NUM:定期返回后台任务进度。

-u USERNAME, --user=USERNAME:指定远程主机以USERNAME运行命令。

-U SUDO_USERNAME, --sudo-user=SUDO_USERNAM:E使用sudo,相当于Linux下的sudo命令。

-c CONNECTION, --connection=CONNECTION:指定连接方式,可用选项paramiko (SSH), ssh, local。Local方式常用于crontab 和 kickstarts。

-l SUBSET, --limit=SUBSET:指定运行主机。

-l ~REGEX, --limit=~REGEX:指定运行主机(正则)。

--list-hosts:列出符合条件的主机列表,不执行任何其他命令

 
 

 
 

 
 

 
 

 
 

 
 

 
 

 
 

 
 

 
 

 
 

Ansible <host-pattern> [options]

主机/组/ip地址 参数命令

[root@node0 ansible]# ansible 192.168.100.* -a "hostname"

192.168.100.231 | SUCCESS | rc=0 >>

localhost.localdomain

192.168.100.128 | SUCCESS | rc=0 >>

test1

192.168.100.141 | SUCCESS | rc=0 >>

nginx_1

192.168.100.142 | SUCCESS | rc=0 >>

localhost.localdomain

[root@node0 ansible]#

 
 

[root@node0 ansible]# ansible test_group2 -a "hostname"

192.168.100.128 | SUCCESS | rc=0 >>

test1

192.168.100.142 | SUCCESS | rc=0 >>

localhost.localdomain

[root@node0 ansible]# ansible test_group1 -a "hostname"

192.168.100.231 | SUCCESS | rc=0 >>

localhost.localdomain

192.168.100.141 | SUCCESS | rc=0 >>

nginx_1

[root@node0 ansible]#

 
 

 
 

 
 

3.4.4 ad-hoc模式常用模块

模块名

作用

用例

command

默认模板

ansible webservers –a "/sbin/reboot" –f 10

shell

执行shell命令

ansible test –m shell "echo $HOSTNAME"

file

transfer

文件传输

ansible test –m copy –a "src=/etc/hosts dest=/tmp/hosts"

managing

packages

管理软件包

ansible test –m yum –a "name=nginx state=present"

user and group

用户和组

ansible test –m user –a "name=json password=123456"

deploying

部署模块

ansible test –m git –a "repo=https://github.com/iopsgroup/imoocc dest=/opt/iops version=HEAD"

managing

services

服务管理

ansible test –m service –a "name=nginx state=started"

background

operations

后台运行

ansible test –B 3306 –a "/usr/bin/running_operation –do-stuff"

gathering

facts

收集系统信息

ansible test –m setup

filter

匹配

filter=name*

  

  

  

 
 

 
 

3.4.5 场景演示

Shell 模块

ansible test_group -m shell -a "hostname"

Copy模块

ansible test_group -m copy -a "src=/etc/hosts dest=/etc/ "

yum 模块

ansible test_group1 -m yum -a "name=nginx" -f 10 -l 192.168.100.136

ansible test_group1 -m yum -a "name=nginx" -f 10 -l 192.168.100.136 -vvv

 
 

 
 

Service模块

 
 

[root@node0 ansible]# ansible test_group1 -m service -a "name=nginx state=started" -f 10 -l 192.168.100.136

192.168.100.136 | SUCCESS => {

"changed": false,

"name": "nginx",

"state": "started"

}

[root@node0 ansible]# ansible test_group1 -m shell -a "netstat -lntup|grep nginx" -f 10 -l 192.168.100.136

192.168.100.136 | SUCCESS | rc=0 >>

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 31730/nginx

 
 

[root@node0 ansible]#

Git 模块

git--使用git指定服务器

ansible test_group -m git -a "repo=https://github.com/iopsgroup/imoocc dest=/opt/imoocc version=HEAD" -f 10 -l 192.168.100.136

 
 

[root@node0 ~]# ansible test_group -m git -a "repo=https://github.com/iopsgroup/imoocc dest=/opt/imoocc version=HEAD" -f 10 -l 192.168.100.136

192.168.100.136 | SUCCESS => {

"after": "9b0f58b04bca0d266b6c633b873471229cfb2568",

"before": null,

"changed": true

}

[root@node0 ~]#

 
 

3.5ansibleplaybook模式

3.5.1 什么是playbook及其组成

play:定义的是主机的角色

task:定义的是具体执行的任务

playbook:由一个或多个play组成,一个play可以包含多个task

 
 

 
 

3.5.2 playbook的优势

1、功能比adhoc更全

2、控制好依赖

3、展现更直观

4、持久使用

 
 

3.5.3 playbook的配置方法(语法)

  • 基本使用
  • playbook基础使用

    ansible-playbook playbook.yml {options}
    执行选项较多

    https://www.imooc.com/article/22729

     
     

    【具体参数】

    -u REMOTE_USER, --user=REMOTE_USER

    # ssh 连接的用户名

    -k, --ask-pass

    #ssh登录认证密码

    -s, --sudo

    #sudo 到root用户,相当于Linux系统下的sudo命令

    -U SUDO_USER, --sudo-user=SUDO_USER

    #sudo 到对应的用户

    -K, --ask-sudo-pass

    #用户的密码(—sudo时使用)

    -T TIMEOUT, --timeout=TIMEOUT

    # ssh 连接超时,默认 10 秒

    -C, --check

    # 指定该参数后,执行 playbook 文件不会真正去执行,而是模拟执行一遍,然后输出本次执行会对远程主机造成的修改

    -e EXTRA_VARS, --extra-vars=EXTRA_VARS

    # 设置额外的变量如:key=value 形式 或者 YAML or JSON,以空格分隔变量,或用多个-e

    -f FORKS, --forks=FORKS

    # 进程并发处理,默认 5

    -i INVENTORY, --inventory-file=INVENTORY

    # 指定 hosts 文件路径,默认 default=/etc/ansible/hosts

    -l SUBSET, --limit=SUBSET

    # 指定一个 pattern,对- hosts:匹配到的主机再过滤一次

    --list-hosts

    # 只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook –

    -list-tasks

    # 列出该 playbook 中会被执行的 task

    –-private-key=PRIVATE_KEY_FILE

    # 私钥路径

    --step

    # 同一时间只执行一个 task,每个 task 执行前都会提示确认一遍

    --syntax-check

    # 只检测 playbook 文件语法是否有问题,不会执行该 playbook

    -t TAGS, --tags=TAGS

    #当 play 和 task 的 tag 为该参数指定的值时才执行,多个 tag 以逗号分隔

    --skip-tags=SKIP_TAGS

    # 当 play 和 task 的 tag 不匹配该参数指定的值时,才执行

    -v, --verbose

    #输出更详细的执行过程信息,-vvv可得到所有执行过程信息。

     
     

     
     

     
     

  • 使用场景
  • playbook的配置

    ---

    - host : 192.168.100.136

    remote_user : root

    vars :

    touch : imoocc:file

    tasks :

  • name : touch file

    shell : "touch /tmp/{{touch_file}}"

     
     

  • 执行

    ansible-playbook -i /etc/ansible/hosts --list-hosts /etc/ansible/1.yml

     
     

    [root@node0 ansible]# pwd

    /etc/ansible

    [root@node0 ansible]# ansible-playbook ./1.yml

  • 执行结果返回

    红色: 表示有task执行失败或者提醒的信息

    黄色: 表示执行了且改变了远程主机状态

    绿色: 表示执行成功

  • 主机匹配

    指定主机创建文件夹

     
     

    [root@node0 ansible]# cat 1.yml

    ---

    - hosts: 192.168.100.136

    remote_user: root

    vars:

    touch_flile: imoocc.file

    tasks:

    - name: touch file

    shell: "touch /tmp/{{touch_flile}}"

    ...

     
     

     
     

     
     

  • yaml语法和变量

    1、yaml语法

    大小写敏感

    使用缩进表示层级关系(只能空格不能tab)

    yaml文件以"---"作为文件的开始

    支持的数据结构

    字典 列表 纯量:数字、布尔、字符串

    {name:jeson} -apple

    -orange

    -strawberry

    -mango

    yaml变量的引用

    myname : jeson

    name : "{{myname}}"

    [root@node0 ansible]# cat 1.yml

    ---

    - hosts: 192.168.100.136

    remote_user: root

    vars:

    touch_file: imoocc.file21

    touch_file1: imoocc.file22

    tasks:

    - name: touch file

    shell: "touch /tmp/{{touch_file}}"

    - name: touch file1

    shell: "touch /tmp/{{touch_file1}}"

    [root@node0 ansible]#

    2、playbook变量

    变量名可以为字母,数字以及下划线。

    playbook的yaml文件中定义变量赋值

    --extra-vars 执行参数赋给变量

     
     

    在文件中定义变量

    [root@node0 ansible]# cat 1.yml ;cat hosts ; ansible-playbook -i /etc/ansible/hosts 1.yml

    ---

    - hosts: 192.168.100.136

    remote_user: root

    # vars:

    # touch_file: imoocc.file21

    tasks:

    - name: touch file

    shell: "touch /tmp/{{touch_file}}"

     
     

    [test_group1]

    192.168.100.231:22 ansible_ssh_user=root ansible_ssh_pass='dianying123?'

    192.168.100.141:22 ansible_ssh_user=root ansible_ssh_pass='dianying123?'

    192.168.100.136:22 ansible_ssh_user=root ansible_ssh_pass='dianying123?'

    [test_group2]

    192.168.100.142:22 ansible_ssh_user=root

    192.168.100.128:22 ansible_ssh_user=root

    [test_group:children]

    test_group1

    test_group2

    [test_group1:vars]

    touch_file=testfile1

     
     

     未完待续

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

     
     

wen, zhongjie

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: