澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

ansible自动化运维入门,Ansible权威指南笔记

2019-09-22 作者:澳门新萄京官方网站   |   浏览(140)

1.ansible的安装

#

http://www.tuicool.com/wx/vUfYVfA

ansible自动化运维工具使用详解

一、ansible简介

1.ansible

ansible是新出现的自动化运维工具,基于Python研发。糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。仅需在管理工作站上安装ansible程序配置被管控主机的IP信息,被管控的主机无客户端。ansible应用程序存在于epel(第三方社区)源,依赖于很多python组件

参考站点:

澳门新萄京官方网站 1

2.ansible特性

模块化设计,调用特定的模块来完成特定任务,本身是核心组件,短小精悍;

基于Python语言实现,由Paramiko(python的一个可并发连接ssh主机功能库), PyYAML和Jinja2(模板化)三个关键模块实现;

部署简单,agentless无客户端工具;

主从模式工作;

支持自定义模块功能;

支持playbook剧本,连续任务按先后设置顺序完成;

期望每个命令具有幂等性:

3.ansible架构

ansible core:ansible自身核心模块

host inventory:主机库,定义可管控的主机列表

connection plugins:连接插件,一般默认基于ssh协议连接

modules:core modules(自带模块)、custom modules(自定义模块)

playbooks:剧本,按照所设定编排的顺序执行完成安排任务

澳门新萄京官方网站 2

4.配置文件:

(1)ansible应用程序的主配置文件:/etc/ansible/ansible.cfg

(2) Host Inventory定义管控主机:/etc/ansible/hosts

遵循INI风格;中括号中的字符是组名;一个主机可同时属于多个组;

示例:

# Ex 1: Ungrouped hosts, specify before any groupheaders.直接在任何组的头部前面指定,不属于任何组的主机

green.example.com

blue.example.com

192.168.100.1

192.168.100.10

# Ex 2: A collection of hosts belonging to the'webservers' group;一批主机属于一个组,例如定义为'webservers'的组

[webservers]

alpha.example.org

beta.example.org

192.168.1.100

192.168.1.110

注意:默认是以root用户执行,但是基于ssh连接操作要多次输入密码,为方便可以使用基于ssh密钥方式进行认证

二、ansible应用程序命令

1.ansible-doc命令:获取模块列表,及模块使用格式;

ansible-doc-l:获取列表

ansible-doc-s module_name:获取指定模块的使用信息

2.ansible命令格式

ansible [-f forks][-m module_name] [-a args]

指明管控主机,以模式形式表示或者直接给定IP,必须事先定义在文件中;all设置所有

[-f forks]

指明每批管控多少主机,默认为5个主机一批次

[-m module_name]

使用何种模块管理操作,所有的操作都需要通过模块来指定

[-a args]

指明模块专用参数;args一般为key=value格式

注意:command模块的参数非为kv格式,而是直接给出要执行的命令即可;

注意:默认读取/etc/ansible/hosts,也可以指明自定义文件路径

-iPATH, --inventory=PATH:指明使用的host inventory文件路径;

常用模块(module_name):

1)command:默认模块,可省略。在远程主机上进行操作命令

-a 'COMMAND'

注意:comand模块的参数非key=value格式,直接给出要执行的命令

[[email protected] ~]# ansible all -m command -a 'ifconfig'

2)user:

-a'name= state={present(创建)|absent(删除)} force=(是否强制操作删除家目录)system= uid= shell=home='

[[email protected] ~]# ansible all -m user -a 'name=ansible state=present'

3)group:

-a'name=state={present|absent} gid= system=(系统组)'

[[email protected] ~]# ansible all -m group -a 'name=mygroup state=presentsystem=true'

4)cron:

-a 'name=state= minute= hour=day= month= weekday=job='

[[email protected] ~]# ansible all -m cron -a 'name='Time' state=presentminute='*/5' job='/usr/sbin/ntpdate 172.168.0.1 &> /dev/null''

5)ping:

无参数

[[email protected] ~]# ansible all -m ping

6)file:文件管理

-a'path= mode= owner=group=state={file|directory|link|hard|touch|absent} src=(link,链接至何处)'

[[email protected] ~]# ansible all -m file -a 'path=/tmp/testdirstate=directory'

[[email protected] ~]# ansible all -m file -a 'path=/tmp/test.txt state=touchmod=600 owner=user1'

7)copy:

-a'dest=(远程主机上路径) src=(本地主机路径) content=(直接指明内容)owner= group= mode='

[[email protected]]# ansible web -m copy -a 'src=/etc/yum.repos.d/aliyun.repodest=/etc/yum.repos.d/'

8)template

-a 'dest=src='#'" content= owner=group= mode='

9)yum:

-a'name= conf_file=(指明配置文件)state={present|latest|absent}enablerepo=disablerepo='

[[email protected] ~]# ansible all -m yum 'name=httpd state=present'

10)service:

-a'name=state={started|stopped|restarted}enabled=(是否开机自动启动) runlevel='

[[email protected] ~]# ansible all -m service -a 'name=httpd state=started'

11)shell:

-a'COMMAND' 运行shell命令

[[email protected]澳门新萄京官方网站, ~]# ansible all -m shell -a echo "123456789" |passwd --stdin user1'

12)script:

-a'/PATH/TO/SCRIPT'运行脚本

[[email protected] ~]# ansible all -m script -a '/tmp/a.sh'

13)setup:获取指定主机的facts变量;

澳门新萄京官方网站 3

三、Playbooks剧本

1.playbook组织格式:YAML语言格式

playbooks是ansible更强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行

(1)YAML简介

YAML:YAML Ain't Markup Language; Yet Another Markup Language;

类似于半结构化数据,声明式配置;可读性较高的用来表达资料序列的格式,易于与脚本语言交互

官方站点:

(2)语法格式

1)任何书记结构都用缩进来标识,可以嵌套

2)每一行是一个键值数据key:value,冒号隔开。若想在一行标识需要用{ }和,分隔格式

3)列表用 - 标识

2.inventory参数:主机库ssh参数设置

ansible基于ssh连接inventory中指定的远程主机时,将以此处的参数指定的属性进行;

ansible_ssh_port

指定ssh端口

ansible_ssh_user

指定ssh用户

ansible_ssh_pass

指定ssh用户登录是认证密码,明文密码不安全

ansible_sudo_pass

指明sudo时候的密码

实例:

[websrvs]

192.168.0.101 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=xuding

192.168.0.102

注意:在/etc/ansible/hosts中直接定义连接时候的密码不安全,一般建议基于ssh的密钥认证方式实现

3.playbooks

(1)核心元素

Tasks任务、Variables变量、Templates模板、Handlers处理器、Roles角色

(2)playbooks中定义任务:

- name: task description注释描述信息

module_name: module_args 声明模块:定义ansible模块参数

澳门新萄京官方网站 4

(3)ansible-playbook执行命令:

ansible-playbook ... [options]

澳门新萄京官方网站 5

4.playbook--- 变量

(1)变量命名:字母、数字和下划线组成,仅能以字母开头;

(2)变量种类:

1)facts:由远程主机发回的主机特有的属性信息,这些信息被保存在ansible变量中;无须声明,可直接调用;

2)自定义变量:

通过命令行传递:ansible-playbook test.yml --extra-vars "host=www user=test"

通过roles传递

3)主机变量:定义在inventory中的主机之后的变量;直接传递给单个主机的变量

实例:

[[email protected] ~]# vim /etc/ansible/hosts中直接定义在主机之后

[web]

192.168.0.101 host=mail

192.168.0.102

192.168.0.103

4)组变量:定义在inventory中的组上的变量(例如在默认的文件/etc/ansible/hosts上编辑)

[group_name:vars]

var1=value

var2=value

注意:组名要事先存在,实例如下:

[websrvs]

192.168.0.101

192.168.0.102

[websrvs:vars]

host=mail

变量使用示例:

[[email protected]~]# vimuseradd.yml

- hosts: websrvs

remote_user: root

vars:

username: testuser

password: xuding

tasks:

-name: add user

user: name={{ username }} state=present

-name: set password

shell: /bin/echo {{ password }} |/usr/bin/passwd --stdin {{ username }}

注释:

1) {{ }} 调用变量

2) #ansible-playbook/PATH/TO/SOME_YAML_FILE { -eVARS|--extra-vars=VARS} 变量的重新赋值调用方法

[[email protected] ~]# ansible-playbookuseradd.yml --extra-vars "username=ubuntu"

5.playbook--- tasks

(1)条件测试:

在某task后面添加when子句即可实现条件测试功能;when语句支持Jinja2语法;

实例:当时RedHat系列系统时候调用yum安装

tasks:

-name: install web server package

yum: name=httpd state=present

when: ansible_os_family == "RedHat"

(2)迭代:item

在task中调用内置的item变量;在某task后面使用with_items语句来定义元素列表;

tasks:

-name: add four users

user: name={{ item }} state=present

with_items:

-testuser1

-testuser2

-testuser3

-testuser4

ansible自动化运维入门,Ansible权威指南笔记。注意:迭代中,列表中的每个元素可以为字典格式;

实例:

-name: add two users

user: name={{ item.name }} state=presentgroups={{ item.groups }}

with_items:

- { name: 'testuser5', groups: 'wheel' }

- { name: 'testuser6', groups: 'root' }

6.playbook--- handlers:处理器;触发器

只有其关注的条件满足时,才会被触发执行的任务;

实例:配置文件发生改变触发重启服务

-hosts: websrvs

remote_user: root

tasks:

-name: install httpd

yum:name=httpd state=present

-name: install config file

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

notify: restart httpd

-name: start httpd service

service: name=httpd state=started

handlers:

-name: restart httpd

service: name=httpd state=restarted

7.playbook模板

templates:

用于生成文本文件(配置文件);模板文件中可使用jinja2表达式,表达式要定义在{{}},也可以简单地仅执行变量替换;

roles:

roles用于实现“代码复用”;

roles以特定的层次型格式组织起来的playbook元素(variables,tasks, templates, handlers);

可被playbook以role的名字直接进行调用;

用法:在roles/下建立[group_name]子目录,并非全部都要创建;例如:

/etc/ansible/roles/(在/etc/ansible/ansible.cfg定义roles目录)

webserver/

files/:此角色中用到的所有文件均放置于此目录中;

templates/:Jinja2模板文件存放位置;

tasks/:任务列表文件;可以有多个,但至少有一个叫做main.yml的文件;

handlers/:处理器列表文件;可以有多个,但至少有一个叫做main.yml的文件;

vars/:变量字典文件;可以有多个,但至少有一个叫做main.yml的文件;

meta/:此角色的特殊设定及依赖关系;

一、ansible简介 1.ansible ansible是新出现的自动化运维工具,基于Python研发。糅合了众多老牌运维工具的优点实...

一、 ansible 简介

1)使用源码安装Python3.5

在托管节点上安装

一、ansible 安装

  1. ansible

安装支持包

python

ansible 依赖于python2.6或更高的版本、paramiko、PyYAML及Jinja2。

ansible是新出现的 自动化 运维工具 , 基于Python研发 。 糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。 仅需在管理工作站上安装 ansible 程序配置被管控主机的 IP 信息,被管控的主机无客户端。 ansible 应用程序存在于 epel( 第三方社区 ) 源,依赖于很多 python 组件

yum -y install lrzsz vim net-tools gcc gcc-c ncurses ncurses-devel unzip zlib-devel zlib openssl-devel openssl

解释器

https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz

澳门新萄京官方网站 6

tar xf Python-3.5.2.tgz -C /usr/src/

ansible myhost --sudo -m raw -a "yum install -y python2 python-simplejson"

tar xvzf Python-2.7.8.tgz

2.ansible 特性

./configure --prefix=/usr/local/python/

#

cd Python-2.7.8

模块化 设计 ,调用特定的模块来完成特定任务 ,本身是核心组件,短小精悍 ;

make && make install

各个平台上安装

./configure --prefix=/usr/local

基于Python语言实现,由Paramiko (python 的一个可并发连接 ssh 主机功能库 ) , PyYAML和Jinja2 ( 模板化 ) 三个关键模块实现;

ln -s /usr/local/python/bin/python3 /usr/bin/python3

ansible

make --jobs=grep processor/proc/cpuinfo | wc -l

部署简单,agentless 无客户端工具;

2)使用pip3安装ansible

#python

make install

将python头文件拷贝到标准目录,以避免编译ansible时,找不到所需的头文件

主从模式 工作;

/usr/local/python/bin/pip3 install ansible

多环境管理:

cd /usr/local/include/python2.7

支持自定义模块 功能;

ln -s /usr/local/python/bin/ansible /usr/local/bin/

pyenv

cp -a ./* /usr/local/include/

备份旧版本的python,并符号链接新版本的python

支持playbook 剧本,连续任务按先后设置顺序完成;

2.模块简单使用

cd /usr/bin

期望每个命令具有 幂等性:

1)ansible的配置文件

virutalenv

mv python python2.6

3.ansible 架构

vim /etc/ansible/hosts

etc/ansible: ansible.cfg hosts

ln -s /usr/local/bin/python

修改yum脚本,使其指向旧版本的python,已避免其无法运行

ansible core : ansible 自身核心模块

机器1 ansible_ssh_host=ip ansible_ssh_port=22 ansible_ssh_user=root

#ansible.cfg

vim /usr/bin/yum

host inventory: 主机库,定义可管控的主机列表

机器2 ansible_ssh_host=ip ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=666666

inventory

!/usr/bin/python --> #!/usr/bin/python2.6

1.1 编译安装

解决依赖关系

connection plugins: 连接插件,一般默认基于 ssh 协议连接

  1. ansible_ssh_host ===>主机IP
  2. ansible_ssh_port ===>ssh的默认端口
  3. ansible_ssh_user ===>ssh的用户名
  4. ansible_ssh_pass ===>ssh的用户的连接密码

library

yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto

解压安装包

https://github.com/ansible/ansible/archive/v1.7.2.tar.gz

modules:core modules ( 自带模块 ) 、 custom modules ( 自定义模块 )

如果我们已经设置了ssh免密钥了。那么就不需要写密码了。例如:webA

module_name

tar xf ansible-1.5.4.tar.gz # cd ansible-1.5.4

编译安装

playbooks :剧本,按照所设定编排的顺序执行完成安排任务

  我们要是没有设置免密钥,那么就需要安装sshpass工具,并在/etc/ansible/hosts文件里写上主机的连接密码。

########################################

python setup.py build # python setup.py install

拷贝配置文件

澳门新萄京官方网站 7

wget -O /etc/yum.repos.d/epel.repo

ansible all -m ping -u root --sudo

mkdir /etc/ansible # cp -r examples/* /etc/ansible

1.2 rpm包安装

使用阿里云镜像源即可,这里为了方便使用,就直接使用yum安装了。

Fedora 用户可直接安装Ansible, 但RHEL或CentOS用户,需要 配置 EPEL # yum install -y epel-release # yum install -y ansible

注意:不同版本的ansible的功能差异可能较大。

二、配置

配置文件:/etc/ansible/ansible.cfg

hostfile=/etc/ansible/hosts #指定默认hosts配置的位置 host_key_checking = False #不进行host_key检查,省去目标key发生变化时输入(yes/no)的步骤 ask_pass=True # 每次执行ansible命令是否询问ssh密码 ask_sudo_pass=True # 每次执行ansible命令时是否询问sudo密码

主机清单:/etc/ansible/hosts

主程序:ansible、ansible paly-book、ansible-doc

1、将要管理的主机纳入 /etc/ansible/hosts配置文件中,可以填写IP或是主机名

[WebServers] 10.10.10.3 10.10.10.4

2、.基于ssh的方式与被管理的主机进行通信,在管理的主机上(部署ansible的主机上)生成一对非对称密钥,将公钥发给被管理的主机。

a,生成密钥对:ssh-keygen -t rsa

b,将密钥发放到要管理的主机:ssh-copy-id -i 10.10.10.3 或 ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.10.3

3、使用ansible命令测试

  1. 配置 文件:

yum -y install sshpass

ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab owner=root group=root

ansible all -m ping

[ansible自动化运维入门,Ansible权威指南笔记。root@wlm yum.repos.d]# ansible all -m ping 10.10.10.4 | SUCCESS => { "changed": false, "ping": "pong" }

三、基本使用

1、常用命令

ansible-doc 命令:获取模块列表、模块使用格式。

ansible-doc -l :获取列表

ansible-doc -s module_name:获取指定模块信息

2、ansible 命令格式

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

<host-pattern> 指明管控主机,以模式表示或者直接指定ip,必须事先指定在文件中;all所有

[-f forks] 指明每批管控多少主机,默认是5个主机一批次

[-m module_name] 使用何种模块操作,所有操作都需要通过模块指定

[-a args] 指明模块专用参数;args 一般是 key=value格式。注:command模块的参数不是kv模式,而是直接给出要执行的命令。

注意:<host-pattern> 默认读取/etc/ansible/hosts,也可以指明自定义文件路径 -iPATH,--inventory=PATH:指明使用的 host inventory文件路径;

3、常用模块介绍

1、command模块:远程主机上运行命令

例:ansible hosts -m command -a "ls /tmp" 注:command模块也可以省略。

给远程主机添加用户、设置密码:

ansible hosts -a 'useradd user1'

ansible hosts -a 'echo abc | passwd --stdin user1'

(1)ansible 应用程序的 主配置文件:/etc/ansible/ansible.cfg

2)进行ansible远程执行命令测试

mode=644 backup=yes"

直接这样使用不会成功,只会添加用户密码不会设置成功,不支持管道符,下面介绍shell模块

2、shell模块:远程主机在shell进程下运行命令,支持shell特性,也支持管道符。

(2) Host Inventory 定义管控主机 :/etc/ansible/hosts

ansible -i /etc/ansible/hosts 主机或主机组 -m 指定模块 -a 命令

ansible-galaxy init,install,list,remove

ansible hosts -m shell -a 'echo abc | passwd --stdin user1'

10.10.10.4 | SUCCESS | rc=0 >>

3、copy模块:把当前主机文件复制到远程主机位置,可以指定mode、own、group

遵循 INI风格;中括号中的字符是组名;一个主机可同时属于多个组;

使用ping模块用来查看服务器是否连接正常,ping模块不需要-a指定参数

ansible-pull

ansible hosts -m copy -a 'src=/tmp/abc.txt dest=/root/ mode=644 owner=ansible group=root'

10.10.10.4 | SUCCESS => { "changed": true, "checksum": "325287cee456533bf76025312e5d05e842cb43a9", "dest": "/root/abc.txt", "gid": 0, "group": "root", "md5sum": "1c6d47c6e4d59c630751b47fff140b89", "mode": "0644", "owner": "ansible", "size": 15, "src": "/root/.ansible/tmp/ansible-tmp-1484639082.19-114656107854348/source", "state": "file", "uid": 0 }

4、cron模块:在远程主机指定crontab周期性计划任务

minute= hour= day= month= weekday= job= name= (必须填写) state=

ansible all -m cron -a "minute=*/10 job='/sbin/ntpdate 10.10.10.10 & >/dev/null' name=synctime" 可使用crontab -l查看

在管理的主机上可以删除制定的计划任务

示例:

ansible 主机1    -m ping

定期执行任务

ansible all -m cron -a 'state=absent name=synctome'

10.10.10.4 | SUCCESS => { "changed": true, "envs": [], "jobs": [] }

5、fetch模块:和copy相反,从远程主机拷贝文件到本地主机

# Ex 1: Ungrouped hosts, specify before any groupheaders. 直接在任何组的头部前面指定,不属于任何组的主机

  1. [root@ansible .ssh]# ansible all -m ping
  2. webA | SUCCESS => {
  3. "changed": false,
  4. "ping": "pong"
  5. }
  6. webB | SUCCESS => {
  7. "changed": false,
  8. "ping": "pong"
  9. }

ansible-doc -l

ansible all -m fetch -a "src=/root/abc.txt dest=/root/kel/ flat=yes"

可以不要flat=yes参数,但作用:

当dest=/root/kel/ ,abc.txt会保存在/root/kel/目录下

当dest=/root/kel ,会拷贝abc.txt文件,并命名成kel

6、file模块:file模块包含了文件、文件夹、超级链接类的创建、拷贝、移动、删除

green.example.com

3)ansible模块command(不支持管道,不建议使用)

ansible-doc ping

ansible all -m file -a

blue.example.com

 ansible all -m command -a "pwd"

ansible-playbook playbook.yml

修改文件的所有组、人、权限

path=/etc/foo.conf owner=foo group=foo mode=0644

192.168.100.1

ansible all -m command -a "echo bb >> /tmp/testansible"

ansible-vault encrypt/decrypt xx.yml 

操作连接的案例

src=/file/to/link/to dest=/path/ro/symlink owner=foo group=foo state=link

192.168.100.10

-a 'name= state={present(创建)|absent(删除)} force=(是否强制操作删除家目录) system= uid= shell= home='

加密解密

参数化案例

src=/tmp/{{item.path}} dest={{item.dest}} state=link with_items:

  • { path: 'x',dest: 'y' } - { path: 'z',dest: 'k' }

# Ex 2: A collection of hosts belonging to the'webservers' group ;一批主机属于一个组,例如定义为 'webservers' 的组

4)ansible模块shell(支持管道,支持重定向)

########hosts

使用touch创建一个空文件并定义权限

path=/etc/foo.conf state=touch mode="u=rw,g=w,o=r"

[webservers]

 ansible all -m shell -a "echo testansible | grep a"

192.168.1.1

touch一个空文件,并修改权限

path=/etc/foo.conf state=touch mode="u w,g-w,o-rw"

7、yum模块:用于yum安装安装和卸载

alpha.example.org

 ansible all -m shell -a "echo bb >> /tmp/testansible"

ntp.mmm.com:222

ansible all -m yum -a "name=httpd"

8、service模块:服务管理

beta.example.org

 ansible all -m shell -a "cat /etc/passwd | awk -F":" '{print $1}'"

[xxx]

ansible all -m service -a "name=httpd state=started/stopped enabled=yes"

9、user/group模块:user模块管理用户;group模块管理group

192.168.1.100

 5)ansible的copy模块批量下发文件或文件夹

xx[10:20].xx.com

ansible all -m user -a 'name=user1 group=root' 添加用户,更改属组

192.168.1.110

 ansible all -m copy -a "src=/service/scripts/test.txt dest=/service/scripts/"

[xxx:vars]

ansible all -m user -a 'name=user1 state=absent remove=yes' 删除用户

注意:默认是以 root 用户执行,但是基于 ssh 连接操作要多次输入密码,为方便可以使用基于 ssh 密钥方式进行认证

 ansible webB -m copy -a "src=/service/scripts/test.txt dest=/service/scripts/"

xx=aa

ansible all -m group -a "name=test1 state=absent" 删除用户组

四、Playbook剧本

playbook 是ansible更强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行。playbook组织格式为使用YAML语言来编写的。

playbook 是由一个或多个“play”组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上讲,所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让他们联通起来按事先编排的机制生效。

1、例子:

在ansible主机上的root目录下创建httpd目录,将本机的httpd.conf文件拷贝到该目录下,修改配置文件里的监听端口是8081

二、 ansible 应用程序命令

copy模块拷贝文件夹,如果目标路径里有与我拷贝的文件同名文件的话,会直接覆盖目标路径下的文件

cc=bb

vim web.yaml

  • hosts: webservers

remote_user:root #root前不能有空格

tasks: #任务列表

  • name:install httpd package #设置任务名称非必要

yum name=httpd state=present #yum后的: 删除掉

  • name:install configure file

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

  • name:start httpd service

service name=httpd state=started

注意:yaml文件中支持#;下面的操作要跟上面的name对齐。

测试:

ansible-playbook --check playbook :只检测可能会发生的改变,但不真正执行操作

ansible-playbook playbook :直接执行

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

澳门新萄京官方网站 8

image.png

2、playbook介绍

设置在特定条件下触发:

a,某任务的状态在运行后为changed时,可通过“notify”通知给相应的handles;

handles:任务在特定条件下触发;接收到其他任务的通知是被触发;

b,任务可以通过“tags”打标签,而后可在ansible-playbook命令上使用-t指定进行调用;

  1. ansible-doc命令:获取模块列表,及模块使用格式;

参数:backup=yes ===>意思是,如果目标路径下,有与我同名但不同内容的文件时,在覆盖前,对目标文件先进行备份。

[webservers:children]

ansible-doc -l :获取列表

ansible webB -m copy -a "src=/service/scripts/ dest=/service/scripts/ backup=yes"

xx

ansible-doc -s  module_name :获取指定模块的使用信息

6)ansible的script模块批量运行脚本

cc

2.ansible 命令格式

ansible all   -m script -a "/root/service/mysql/auto_mysql.sh"

ansible_ssh_host

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

在指定的机器上执行本地脚本

ansible_ssh_port

<host-pattern>

指明管控主机,以模式形式表示或者直接给定 IP ,必须事先定义在文件中; all 设置所有

[-f forks]

指明每批管控多少主机,默认为 5 个主机一批次

[-m module_name]

使用何种模块管理操作,所有的操作都需要通过模块来指定

[-a args]

指明模块专用参数; args 一般为 key=value 格式

注意:command模块的参数非为kv格式,而是直接给出要执行的命令即可;

7)service:

ansible_ssh_user

注意: <host-pattern> 默认读取 /etc/ansible/hosts ,也可以指明自定义文件路径

-a 'name= state={started|stopped|restarted} enabled=(是否开机自动启动) runlevel=' [root@localhost ~]# ansible all -m service -a 'name=httpd state=started'

ansible_ssh_pass

-iPATH, --inventory=PATH:指明使用的host inventory文件路径;

3.变量种类:

ansible_ssh_private_key_file=

常用模块 (module_name) :

1)facts:由远程主机发回的主机特有的属性信息,这些信息被保存在ansible变量中;无须声明,可直接调用;

############################

1) command:默认模块 ,可省略。在远程主机上进行操作命令

2)自定义变量: 通过命令行传递:ansible-playbook test.yml --extra-vars "host=www user=test" 通过roles传递

ansible webs -m service -a "name=httpd state=restarted"

-a  'COMMAND'

3)主机变量:定义在inventory中的主机之后的变量;直接传递给单个主机的变量

ansible "webs1:webs2"

注意: comand 模块的参数非 key=value 格式,直接给出要执行的命令

例子:

ansible "webs1:!xxx"

[root@localhost ~]# ansible all -m command -a  'ifconfig'

[root@localhost~]# vim useradd.yml

ansible "webs1:&xx:!xxxx"

2)user:

  • hosts: websrvs
    remote_user: root
    vars:
    username: testuser
    password: xuding
    tasks:
    -name: add user
    user: name={{ username }} state=present
    -name: set password
    shell: /bin/echo {{ password }} |/usr/bin/passwd --stdin {{ username }}

ansible ~web1*    #

-a 'name=  state={present ( 创建 ) |absent ( 删除 ) }  force= ( 是否强制操作删除家目录 )   system=  uid=  shell= home='

|--extra-vars=VARS} 变量的重新赋值调用方法

正则匹配主机

[root@localhost ~]# ansible all -m user -a 'name=ansible state=present'

ansible-playbookuseradd.yml --extra-vars "username=ubuntu"

###################################

3)group:

4)playbook--- tasks

ansible -i inventory

-a 'name= state={present|absent}  gid=  system= ( 系统组 ) '

条件测试:

-f

[root@localhost ~]# ansible all -m group -a 'name=mygroup state=presentsystem=true'

在某task后面添加when子句即可实现条件测试功能;when语句支持Jinja2语法; 实例:当时RedHat系列系统时候调用yum安装

线程数

4)cron:

例子:

--private-key

-a  'name= state=  minute=  hour= day=  month=  weekday= job='

-name: install web server package

-m

[root@localhost ~]# ansible all -m cron -a 'name='Time' state=presentminute='*/5' job='/usr/sbin/ntpdate 172.168.0.1 &> /dev/null''

yum: name=httpd state=present

-M

5)ping:

when: ansible_os_family == "RedHat"

模块路径

无参数

 item

-k

[root@localhost ~]# ansible all -m ping

在task中调用内置的item变量;在某task后面使用with_items语句来定义元素列表;

认证密码

6) file: 文件管理

-name: add four users

-K sudo

-a 'path=  mode=  owner= group= state={file|directory|link|hard|touch|absent}  src= (link ,链接至何处 ) '

user: name={{ item }} state=present

密码

[root@localhost ~]# ansible all -m file -a 'path=/tmp/testdirstate=directory'

with_items:

-o

[root@localhost ~]# ansible all -m file -a 'path=/tmp/test.txt state=touchmod=600 owner=user1'

-testuser1

输出成一行

7)copy:

-testuser2

-s  sudo

-a 'dest= ( 远程主机上路径 )   src= ( 本地主机路径 )   content= ( 直接指明内容 )  owner=  group=  mode='

-testuser3

-T

[root@localhosttmp]# ansible web -m copy -a 'src=/etc/yum.repos.d/aliyun.repodest=/etc/yum.repos.d/'

-testuser4

时间

8)template

注意:迭代中,列表中的每个元素可以为字典格式;

-B

-a  'dest= src='#'" content=  owner= group=  mode='

实例:

后台执行命令的时间

9)yum:

-name: add two users

-u

-a 'name=  conf_file= ( 指明配置文件 )  state={present|latest|absent} enablerepo= disablerepo='       

user: name={{ item.name }} state=present groups={{ item.groups }}

用户

[root@localhost ~]# ansible all -m yum 'name=httpd state=present'

with_items:

-l

10)service:

- { name: 'testuser5', groups: 'wheel' }

指定运行的主机

-a 'name= state={started|stopped|restarted} enabled= ( 是否开机自动启动 )   runlevel='

- { name: 'testuser6', groups: 'root' }

###################

[root@localhost ~]# ansible all -m service -a 'name=httpd state=started'

5)handlers:处理器;触发器

ansible proxy -f 5 -m ping

11)shell:

只有其关注的条件满足时,才会被触发执行的任务; 实例:配置文件发生改变触发重启服务

ansible proyx -s -m command -a "hostname"

-a 'COMMAND'   运行 shell 命令

-hosts: websrvs
remote_user: root
tasks:
-name: install httpd
yum:name=httpd state=present
-name: install config file
copy: src=/root/httpd.conf   dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
-name: start httpd service
service: name=httpd state=started
handlers:
-name: restart httpd
service: name=httpd state=restarted

ansible proxy --list

[root@localhost ~]# ansible all -m shell -a echo "123456789" |passwd --stdin user1'

 

time ansible 192.168.1.1 -B 5 -P 2 -T 2 -m command -a 'sleep 20' -u root ##

12)script:

 

-a '/PATH/TO/SCRIPT' 运行脚本

 

192.168.1.1

[root@localhost ~]# ansible all -m script -a '/tmp/a.sh'

4.ansible-playbook的初步使用

以用户

13) setup:获取指定主机的facts 变量 ;

核心元素

root

澳门新萄京官方网站 9

Tasks任务、Variables变量、Templates模板、Handlers处理器、Roles角色

执行

三、 Playbooks 剧本

playbook的使用,playbook可以把ansible的模块进行组合

sleep 20

1.playbook 组织格式:YAML 语言格式

cat test_shell.yaml  #playbook的执行模板

,设置最大连接超时时长为

playbooks 是 ansible 更强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行

  1. ---         #开头三个小-开头
  2. - hosts: webB
  3. tasks:
  4. - name: test
  5. shell: echo "welcome to yunjisaun" >> /tmp/username
  6. - name: test2
  7. shell: echo "welcome to yunjisuan" >> /tmp/username
  8.      - name: install httpd
  9.        yum:  name=httpd state=present
  10.      - name: start httpd
  11.        service: name=httpd  state=started enable=true
  12. ``
  13. 模板说明:
  14. ---  #开头必须有三个小-,顶格写
  15. - hosts:   #正文配置代码的第一级,必须有两个空格(-占一个空格位)
  16. - host: webB   #webB是host参数的值,值和hosts:之间要有一个空格
  17. tasks:        #tasks:表示接下来要执行的具体任务
  18. - name:     #相对于tasks再多缩进两个格(-占一个空格位),表示属于tasks的下一级
  19. - name: test  #test只是要执行的具体命令的名字可以随便写。name:后还是有一个空格要注意
  20. shell:  #表示调用shell模块执行命令相对于tasks仍旧要多缩进两个空格
  21. shell: echo "xxx" >> xxx     #shell:后边还是要有个空格,需要注意。

#2s

(1)YAML 简介

执行playbook配置文件,ansible-playbook test_shell.yaml #执行playbook配置文件

,且设置为后台运行模式,执行过程每

YAML : YAML Ain't  Markup Language;  Yet Another Markup Language;

实例:用ansible-playbook,在两台机器上自动化部署mysql 数据库

2s

类似于半结构化数据,声明式配置;可读性较高的用来表达资料序列的格式,易于与脚本语言交互

1)准备三台Linux,其中一台安装好ansible,三台机器互相连通

输出一次进度,如

官方站点: http://www.yaml.org

2)准备.yaml文件,setup.yaml

5s

(2) 语法 格式


还未执行完则终止该任务。

1) 任何书记结构都用缩进来标识,可以嵌套

  - hosts: all                                                                               #hosts文件中全部主机
    vars:                                                                                      #定义变量
    - dst: "/service/"                                                                     #变量名为dst
    tasks:                                                                                    # 任务
    - name: cp cmake mysql                                                       #第一个任务名
      copy: src=/root/service/mysql/  dest={{ dst }}                      #拷贝MySQL下的文件到变量dst中

ansible apps -a "df -lh"

2) 每一行是一个键值数据 k ey :v alue ,冒号隔开。若想在一行标识需要用 { } 和 , 分隔格式

      notify:  # 如果copy执行完之后~/hosts.dest文件发送了变化,则执行

ansible apps -m shell -a "free -m"

3) 列表用 - 标识

      - clear copy  # 调用handler
      handlers:
      - name: clear copy
        shell: 'mv ~/hosts.dest hosts.del'  # 假装删除
    - name: install mysql                                                             #第二个任务名
      script: /root/service/mysql/auto_mysql.sh                           #执行脚本模块, 后边跟脚本路径
      register: print_result                                                            #打印执行结果
    - debug: var=print_result

ansible apps -m yum -a "name=redhat-lsb state=present"

  1. inventory参数 :主机库 ssh 参数设置

3)准备脚本文件auto_mysql.sh 

ansible apps -m yum -a "name=ntp state=present"

ansible基于ssh连接inventory中指定的远程主机时,将以此处的参数指定的属性进行;

#!/bin/bash
#in ansible use
#install myysql
#20180731
mysql_tar="mysql-5.6.40.tar.gz"
mysql_dir="mysql-5.6.40"
cmake_tar="cmake-2.8.6.tar.gz"
cmake_dir="cmake-2.8.6"
dest="/service/"

ansible apps -m service -a "name=ntpd state=started enabled=yes"

ansible_ssh_port

指定 ssh 端口

ansible_ssh_user

指定 ssh 用户

ansible_ssh_pass

指定 ssh 用户登录是认证密码,明文密码不安全

ansible_sudo_pass

指明 sudo 时候的密码

#删旧版本
rpm -e mariadb-libs  --nodeps &>/dev/null
rpm -e mysql mysql-server --nodeps &>/dev/null
#关防火墙
rpm -q make gcc gcc-c &>/dev/null
if [ $? -ne 0 ];then
 yum -y install  make gcc gcc-c &>/dev/null
fi
#安装cmake

ansible apps -m command -a "service ntpd status" --limit "192.168.1.22"

实��:

cd $dest
tar xf $cmake_tar -C /usr/src/ &>/dev/null
cd /usr/src/$cmake_dir
./configure &>/dev/null && make &>/dev/null  && make install &>/dev/null
#删除包
rm -fr /usr/src/$cmake_dir &>/dev/null
cd $dest
rm -fr $cmake_tar
#安装依赖
yum -y install ncurses ncurses-devel &>/dev/null
groupadd mysql &>/dev/null
useradd -M -s /sbin/nologin  -g mysql mysql &>/dev/null
#解压源码包

###################################

[websrvs]

tar xf $mysql_tar -C /usr/src/ &>/dev/null
#安装
cd /usr/src/$mysql_dir
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql  -DDEFAULT_CHARSET=utf8  -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all  -DSYSCONFDIR=/etc &>/dev/null &&make &>/dev/null &&make install &>/dev/null
#优化
cd /usr/local/mysql
cp support-files/my-default.cnf  /etc/my.cnf &>/dev/null
#安装数据

##

192.168.0.101  ansible_ssh_port=22  ansible_ssh_user=root  ansible_ssh_pass=xuding

yum -y install autoconf &>/dev/null && /usr/local/mysql/scripts/mysql_install_db  --basedir=/usr/local/mysql  --datadir=/usr/local/mysql/data  --user=mysql &>/dev/null
echo "PATH=$PATH:/usr/local/mysql/bin">>/etc/profile
source  /etc/profile &>/dev/null
chown -R mysql:mysql /usr/local/mysql/ &>/dev/null
cp support-files/mysql.server  /etc/init.d/mysqld &>/dev/null
chmod x /etc/init.d/mysqld
sed -i -e '1a #chkconfig: 35 50 45' /etc/init.d/mysqld
cd $dest
rm -fr /usr/src/$mysql_dir &>/dev/null
rm -fr $mysql_tar

新增用户

192.168.0.102

#启动服务

ansible db -m user -a 'name=dba shell=/bin/bash groups=admins,dbagroup

注意:在 /etc/ansible/hosts 中直接定义连接时候的密码不安全,一般建议基于 ssh 的密钥认证方式实现

/usr/sbin/chkconfig --add mysqld
/etc/init.d/mysqld start

append=yes home=/home/dba/ state=present'

3.playbooks

3)准备好安装包

ansible db -m user -a 'name=dba groups=ddd append=no'  #

(1) 核心元素

cmake-2.8.6.tar.gz    mysql-5.6.40.tar.gz放到与脚本同一目录下

变更用户属性

Tasks 任务、 Variables 变量、 Templates 模板、 Handlers 处理器、 Roles 角色

4)ansible-playbook setup.yaml

ansible db -m user -a 'name=dba state=absent remove=yes'  #

(2)playbooks 中 定义任务:

剩下的时间,你可以喝杯茶了,休息一下。两台机器部署完成,登录下机器看是否服务启动

删除用户

- name: task description     注释 描述信息

mysql -uroot  -p123456  -h ip

ansible db -m user -a "name=tom shell=/bin/bash password=to32cxooiudsof

module_name: module_args   声明模块:定义 ansible 模块参数

成功登录。

update_password=always" ##

澳门新萄京官方网站 10

 

变更密码,密码必须自己

(3) ansible-playbook 执行 命令:

 

sha-512

ansible-playbook  <filename.yml> ...  [options]

 

生成

澳门新萄京官方网站 11

 

ansible xx -m win_user -a "name=stanly password=xxxxxxx group=Administrators" 

4.playbook--- 变量

 

##win

(1)变量命名:字母、数字和下划线组成,仅能以字母开头;

 

用户

(2)变量种类:

 

ansible xx -m mysql_user -a "login_host=localhost login_password=123456

1) facts:由远程主机发回的主机 特有的 属性信息,这些信息被保存在ansible变量中;无须 声明 ,可直接调用;

 

login_user=root name=stanly password=123456 priv=zabbix.*:ALL state=present"

2)自定义变量:

 

###

通过命令行传递:ansible-playbook  test.yml  --extra-vars "host=www user=test"

 

新增

通过roles传递

 

mysql

3) 主机变量:定义在inventory中的主机之后的变量; 直接传递给单个主机的变量

 

用户

实例:

 

###########################################################

[root@localhost ~]# vim /etc/ansible/hosts 中直接定义在主机之后

 

##yaml

[web]

 

语法

192.168.0.101    host=mail

 

不要使用

192.168.0.102

 

tab

192.168.0.103

相同阶层的元素左对齐

4) 组变量:定义在inventory中的组上的变量 ( 例如在默认的文件 /etc/ansible/hosts 上编辑 )

##########

[group_name:vars]

########playbook

var1=value

语法

var2=value

---  #

注意:组名要事先存在,实例如下:

开头

[websrvs]

- hosts: webservers

192.168.0.101

vars:

192.168.0.102

http_pot: 80

[websrvs:vars]

max_clients: 222

host=mail

remote_user: root

变量使用示例:

tasks:

[root@localhost~]# vim useradd.yml

- name: ensdlfjsd

-    hosts: websrvs

yum: pkg=httpd state=latest

remote_user: root

- name: xx

vars:

template: src=/srv/httpd.j2 dest=/etc/httpd.conf

username: testuser

notify: restart apache

password: xuding

- name: xx

tasks:

service: name=httpd state=started

-name: add user

handlers:

user: name={{ username }} state=present

- name: restart apache

-name: set password

service: name=httpd state=restarted

shell: /bin/echo {{ password }} |/usr/bin/passwd --stdin {{ username }}

#################################

注释:

############shellplaybook

1) {{ }} 调用变量


2) #ansible-playbook /PATH/TO/SOME_YAML_FILE  { -eVARS|--extra-vars=VARS}     变量的重新赋值调用方法

- hosts: all

[root@localhost ~]# ansible-playbookuseradd.yml --extra-vars "username=Ubuntu"

tasks:

5.playbook---  tasks

- name: "setup apache"

(1) 条件测试:

command: yum install --quiet -y httpd httpd-devel

在某task后面添加when子句即可实现条件测试功能;when语句支持Jinja2语法;

- name: "copy configure"

    实例 : 当时 RedHat 系列系统时候调用 yum 安装

command: cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf

tasks:

command: cp /tmp/httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf

-name: install web server package

command: service httpd start

yum: name=httpd state=present

command: chkconfig httpd on

when: ansible_os_family == "RedHat"

####################################################ansible-playbook

(2) 迭代: item

./playbook.yml

在task中调用内置的item变量;在某task后面使用with_items语句来定义元素列表;

ansible-playbook --limit xx.com

tasks:

ansible-playbook --list-hosts  #

-name: add four users

列出哪些主机受影响

user: name={{ item }}  state=present

--remote-user=tom

with_items:

#########node.js

-testuser1

不全

-testuser2


-testuser3

- hosts: all

-testuser4

tasks:

注意:迭代中,列表中的每个元素可以为字典格式;

- name: gpg

实例:

rpm_key: "key={{ item }} state=present"

-name: add two users

with_items:

user: name={{ item.name }}  state=present groups={{ item.groups }}

- ""

with_items:

- name: install remi repo

- { name: 'testuser5', groups: 'wheel' }

command: "rpm -Uvh --force {{ item.href }} creates={{ item.creates }}"

- { name: 'testuser6', groups: 'root' }

with_items:

6.playbook--- handlers: 处理器;触发器

- href: ""

只有其关注的条件满足时,才会被触发执行 的任务;

- creates: "/etc/yum.repos.d/remi.repo"

实例:配置文件发生改变触发重启服务

yum: name=epel-release state=present

-hosts: websrvs

service: name=iptables state=stopped

remote_user: root

service: name=firewalld state=stopped

tasks:

yum: name=npm state=present enablerepo=epel

-name: install httpd

command: npm config set registry

yum:name=httpd state=present

command: npm config set strict-ssl false

-name: install config file

npm: name=forever global=yes state=latest

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

file: "path={{ node_apps_location }} state=directory"

notify: restart httpd

copy: "src=app dest={{ node_apps_location }}"

-name: start httpd service

npm: "path={{ node_apps_location }}/app"

service: name=httpd state=started

########################################################ansible-playbook

handlers:

--extra-vars="node_apps_location=/usr/local/opt/node"

-name: restart httpd

###ansible

service: name=httpd state=restarted

安装部署

7.playbook 模板

drupal

templates:

playbook-to-automate-drupal-installation-on-ubuntu-14-04/

用于生成文本文件(配置文件);模板文件中可使用jinja2表达式,表达式要定义在{{}},也可以简单地仅执行变量替换;

###ansible

roles:

安装部署

roles用于实现“代码复用”;

tomcat  

roles以特定的层次型格式组织起来的playbook元素(variables,tasks, templates, handlers);

可被playbook以role的名字直接进行调用;

###ansible

用法 :在 roles/ 下建立 [group_name] 子目录,并非全部都要创建;例如:

安装部署

/etc/ansible/roles/ (在 /etc/ansible/ansible.cfg 定义 roles 目录)

JDK 

webserver/

###handler

files/:此角色中用到的所有文件均放置于此目录中;

模块

templates/:Jinja2模板文件存放位置;

handlers:

tasks/:任务列表文件;可以有多个,但至少有一个叫做main.yml的文件;

- name: restart apache

handlers/:处理器列表文件;可以有多个,但至少有一个叫做main.yml的文件;

service: name=apache2 state=restarted

vars/:变量字典文件;可以有多个,但至少有一个叫做main.yml的文件;

notify: restart memcached

meta/:此角色的特殊设定及依赖关系;

- name: restart memcached

使用 Ansible 高效交付 Docker 容器  http://www.linuxidc.com/Linux/2015-10/124233.htm

service: name=memcached state=restarted

使用Ansible批量管理远程服务器  http://www.linuxidc.com/Linux/2015-05/118080.htm

notify:

Ansible安装配置与简单使用  http://www.linuxidc.com/Linux/2015-07/120399.htm

- restart apache

在 CentOS 7 中安装并使用自动化工具 Ansible  http://www.linuxidc.com/Linux/2015-10/123801.htm

- restart memcached

Ansible和Docker的作用和用法  http://www.linuxidc.com/Linux/2014-11/109783.htm

###################

Ansible批量搭建LAMP环境 http://www.linuxidc.com/Linux/2014-10/108264.htm

ansible-playbook xx.yml --extra-vars "foo=bar"

Ansible :一个配置管理和IT自动化工具  http://www.linuxidc.com/Linux/2014-11/109365.htm

ansible-playbook xx.yml --extra-vars "@xx.json"

Ansible 的详细介绍:请点这里
Ansible 的下载地址:请点这里

#

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-07/133466.htm

主机变量

澳门新萄京官方网站 12

host1 xx=bar  {{ hostvars['host1']['xx'] }}

#gather_facts: no

##

在远程主机上

/etc/ansible/xx.fact

,则

setu

模块将返回

fact

的内容

[users]

admin=xx

###

##

条件判断

- name:

[task xxx]

when: software_version.split('.')[0] == '4'

##

##register

- command: my-app --status

register: myapp_result

-command: do-something-to-my-app

when: "'ready' in myapp_result.stdout"

#myapp_result.stdout.find('xxx') == -1

####################

##

如果

PHP

7

,则降级

- shell: php --version

register: php_version

- shell: yum -y downgrade php*

when: "'7.0' in php_version.stdout"

#####

####

如果主机的

hosts

不存在,就传一个文件过去

- stat: path=/etc/hosts

register: hosts_file

- copy: src=path/local/file dest=/path/remote/file

when: hosts_file.stat.exists == false

################################

#

交互

hosts: all

vars_prompt:

- name: user

prompt: "what is your name"

#######confirm

为用户输入两次

#########wait_for

模块 

delegate_to

模块

tags

标签 

block

块功能 

roles

功能 

jinja2

语法

#

#######################

######include

功能

tasks:

- include: xx.yml


- include: xx.yml

- include: yy.yml

when: extra_file.stat.exists

################################

ansible-galaxy install username.rolename

################################################################################

####

ansible all -i inventory.py -m ping  #

动态创建主机

本文由澳门新萄京官方网站发布于澳门新萄京官方网站,转载请注明出处:ansible自动化运维入门,Ansible权威指南笔记

关键词: