Ansible教程-阿里云开发者社区

开发者社区> 开发与运维> 正文

Ansible教程

简介:

安装方式

源码包安装

安装git

yum - y install git

下载源码包并安装

git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup

安装pip

easy_install pip

安装python模块

pip install paramiko PyYAML Jinja2 httplib2

复制配置文件

cd /root/ansible/examples
cp -rf playbooks/ scripts/ /etc/ansible/

yum方式安装

导入阿里云epel yum源

wget http://mirrors.aliyun.com/repo/epel-6.repo

安装repo

yum install ansible

客户端配置

windwos客户端

安装pywinrm

pip install http://github.com/diyan/pywinrm/archive/master.zip#egg=pywinrm

安装kerberos用来连接域账户

apt-get install libkrb5-dev
Apt-get install python-dev
 libexpat1-dev libpython-dev libpython2.7-dev python2.7-dev

pip install kerberos

添加hosts文件

[win]
192.168.1.40

创建inventory环境变量文件

mkdir /etc/ansible/group_vars
touch win.yml
ansible_ssh_user: administrator
ansible_ssh_pass: 1a!
ansible_ssh_port: 5986
ansible_connection: winrm

复制脚本ConfigureRemotingForAnsible.ps1在windows客户端执行启动windows系统winrm服务,并设置服务为自动启动

net start winrm

安装winrm模块依赖的两个模块

wget https://pypi.python.org/packages/source/i/isodate/isodate-0.5.4.tar.gz
wget https://pypi.python.org/packages/source/x/xmltodict/xmltodict-0.10.1.tar.gz

解压后用python setpu.py install执行安装测试

ansible win -m win_ping -vvvv

windows模块

win_feature : 安装和卸载功能
win_get_url : 从给定的 url 下载文件
win_group : 添加和删除本地组
win_msi : 安装和卸载 MSI 文件
win_ping : windows 版本的 ping 模块
win_service : 管理 windows 服务
win_stat : 返回关于 windows 文件的信息
win_user : 管理本地账号

案例

创建用户acai,密码1a@

ansible win -m win_user -a "name=acai password=1a@"

Linux客户端

ansible管理linux服务器可以使用两种方式:使用ssh双机互信和通过在配置文件中指定密码

使用ssh互信的方式管理主机

ssh-keygen
scp id_rsa.pub root@client:/root/.ssh/authorized_keys

使用变量的方式管理主机

mkdir /etc/ansible/group_vars
vi test
ansible_ssh_user:root
ansible_ssh_pass:123456
ansible_ssh_port:22

添加host

[linux]
192.168.1.1

测试

ansible linux -m ping -vvvv

linux模块

file模块

参数

group:定义文件/目录属组
owner:定义文件目录属主
mode:定义文件目录的权限
path:定义文件目录的路径
recurse:递归设置文件的属性,只对目录有效
state:定义文件状态(state状态有三个选项directory:如果目录不存在则创建、touch:如果文件不存在则创建、absent:删除文件或目录)

案例

查看远程主机的文件权限
ansible test -m command -a 'ls -al /root/aaa'
192.168.1.16 | success | rc=0 >>
-rw-r--r--. 1 root root 86 Mar  9 19:03 /root/aaa
#将文件权限修改为777
ansible test -m file -a 'dest=/root/aaa mode=777'

copy模块

参数

src:源文件
dest:目标路径
backup:覆盖前是否备份原文件
owner:设置文件目录的属主
group:设置文件目录的属组
mode:设置文件目录的权限

案例

复制/root/aaa文件到主机/root目录下 
ansible test  -m -a  copy 'src=/root/aaa dest=/root/'
查看复制文件
ansible test -m command -a 'ls /root/'

cron模块

参数

backup:对远程主机上原任务计划内容修改之前备份
day:日
hour:小时
minute:分钟
month:月
weekday:周
job:要执行的文件,依赖于state=present
name:该任务的描述
special_time:指定什么时候执行(参数:reboot、yearly、annually、monthly、weekly、daily、hourly)
sate:确认该任务计划是创建还是删除
user:以哪个用户的身份执行

案例

创建一个计划任务
 ansible test -m cron -a 'name="cron_test" minute=*/3 hour=* day=* month=* weekday=* job="/usr/sbin/ntpdate cn.ntp.org.cn"'
查看创建的任务计划
ansible test -m command -a 'crontab -l'
192.168.1.16 | success | rc=0 >>
#Ansible: cron_test
*/3 * * * * /usr/sbin/ntpdate cn.ntp.org.cn

group模块

参数

home:指定家目录,需要createhome为yes
groups:用户组
uid:用户uid
password:用户密码
name:用户名
createhome:是否创建家目录
system:是否创建为系统用户
remove:sate=absent时,删除家目录
state:创建或者删除
shell:指定用户shell环境

案例

创建一个gid为2016,group名字为acai的组
ansible test -m group -a 'gid=2016 name=acai'
user模块

创建用户test_user,并加入acai组
ansible test -m user -a 'name=test_user groups=acai state=present'
删除创建的用户
ansible test -m user -a 'name=test_user state=absent remove=yes'

template模块

template使用了Jinjia2格式作为文件模版,进行文档内变量的替换的模块。它的每次使用都会被ansible标记为”changed”状态。
使用template模块后,ansible会在当前role路径下templates目录中文件copy到相应目录,若该文件存在替换变量时,ansible会根据配置替换该变量。

template参数

参数 可选项 备注
backup yes/no
src 文件源地址
dest 文件目的地址
mode 设置远程节点上的template文件权限。类似Linux中chmod的用法
owner 设置远程节点上的template文件所属用户
group 设置远程节点上的的template文件的所属用户组

案例:

在templates目录下创建chrony.conf.j2文件并替换以下变量
allow {{ cluster_network }}
{{ cluster_network }} 代表是由ansible引入的一个变量,该变量可在group_vars目录下文件中调用,eg:

cat group_vars/all 
---
#k8s cluster api network
#eg: cluster_network : 192.168.1.0/24
cluster_network : 192.168.1.0/24

当ansible执行该任务后,被copy的配置文件会被替换为cluster_network变量的值。

yum模块

参数

enablerepo:启动某个源
name:要操作软件包的名字,也可以传递一个url和本地路径
state:定义软件包的状态(present:安装、absent:删除、latest:安装最新的)

案例

安装httpd服务
ansible test -m yum -a 'state=present name=httpd'

service模块

参数

enabled:是否开机启动 yes|no
name:服务名称
runlevel:运行级别
sleep:如果执行了restarted,在stop和start之间沉睡几秒
state:对服务执行启动,停止,重启,重新加载等

案例

启动httpd服务,并设置开机自动启动
ansible test -m service -a 'name=httpd state=started enabled=yes'

script模块

ansible test -m script -a '/root/aaa.sh'

ping模块:(测试主机网络)

ansible test -m ping 

command模块

参数

creates:一个文件名,当该文件存在则命令不执行
free_form:要执行的Linux指令
chdir:在执行指令之前,先切换到该指定的目录
removes:一个文件名,如果文件不存在,则该选项不执行
ansible test -m command -a 'hostname'

raw模块

ansible test -m raw -a 'cat /root/aaa'

get_url模块

案例

下载文件到本地/tmp
ansible test -m get_url -a 'url=http://mirrors.aliyun.com/centos/timestamp.txt dest=/tmp'

setup模块

收集系统所有信息
ansible test -m setup
收集系统所有信息,以主机名为文件名分别保存
ansible test -m setup --tree /tmp/host
收集系统网卡信息
ansible test -m setup -a 'filter=ansible_eth[0-2]' --tree host
收集系统内存信息
ansible test -m setup -a 'filter=ansible_*_mb'

lineinfile模块

该模块用于从一个文件中搜索一行,确保该行存在或删除该行。lineinfile模块主要用于改变一个文件的一行。如果想要改变文件中相似的多行,可以使用replace模块。如果想要插入/更新/删除一个行块,可以使用blockinfile模块。
参数

backup    用于创建一个包含时间戳信息的备份文件。以便在错误的修改了文件的时候,能够找回原始的文件。
create    与state=present一起使用。如果指定了这个参数,当要修改的文件不存在的时候,会创建它。否则会报错。
dest    要修改的文件
insertbefore    当regexp不匹配文件中的任何行的时候,会将line参数所指定的行,插入到insertbefore所指定的正则表达式匹配的行中的最后一行的前面,当insertbefore所指定的正则表达式不匹配任何行时,会插入到文件的末尾
insertafter    与insertbefore类似,不同的是,insertbefore会将新行插入到其所指定的正则表达式匹配的行中的最后一行的前面,而insertafter是插入到后面。
line    要插入或者替换的行。如果设置了backrefs参数,那么line中可以包含 位置分组 或 命名分组,lineinfile模块会使用regexp捕获的分组填充它们。
mode    用来指定文件的权限,比如mode=0644 或 mode='a+x'
owner 和 group    用来指定文件的属主 和 属组。(可能需要使用-b提权)
regexp    用于搜索文件中的每一行的正则表达式。对于state=present,这个正则表达式所匹配的行中的最后一行会被替换;对于state=present,会删除所有匹配的行。
state    用于设置 新增或替换一行,还是删除行

案例

1.删除passwd文件开头为root的行
ansible test -m lineinfile -a "dest=/root/passwd state=absent regexp='^root'"
2.修改selinux配置文件SELINUX=disabled
ansible test -m lineinfile -a "dest=/etc/selinux/config regexp='^SELINUX=.*' line='SELINUX=disabled' state=present"
3.添加hosts解析
ansible test -m lineinfile -a "dest=/etc/hosts line=172.16.1.10\ttest" state=present

systemd模块

systemd模块就是使用systemctl来管理centos7系统服务
模块参数

参数名称 可选值 备注
name yes/no 服务名称
enabled yes/no 是否设置开机启动
state started、stopped、restarted、reload 对服务执行的动作

docker_container模块

参数

参数 可选项 描述
command 容器启动时执行的命令可以是字符串,也可以是列表
hostname 容器hostname
image 容器镜像
name 容器名称
env 容器环境变量
network_mode bridge、host、none 容器的网络模式
pull 下载镜像到本地
read_only 挂载容器根文件系统为只读
restart 重启容器
restart_policy no、on-failure、always、unless-stopped 重启容器策略
state absent、present、stopped、started 容器运行状态
volume_driver volume driver
volumes 容器共享宿主机的目录,例如:volumes: /opt:container:/opt

创建容器

- name: start docker registry
  docker_container:
    name: registry
    image: registry:2
    ports: 
      - 4000:5000
      - 80:80
    state: started
    restart_policy: always
    volumes: 
      - /opt/t2cp:/var/lib/registry
      - /etc/test:/etc/test

重启容器

- name: restart docker registry
  docker_container:
    name: registry
    image: registry:2
    state: started
    restart: yes
    ports: 4000:5000

Playbooks

playbooks定义

Playboos:简单说就是定义一个配置文件,文件中写入你需要安装的服务,配置文件,变量等信息。可以安装事先定义好的机制完成一个任务

yml脚本语法

a、用“---”开始
b、在冒号之后,必须存在一个空格
c、name和service必须对齐
d、hosts和tasks必须对齐
e、在书写key和value的时候,不能存在空格

playbooks组成部分

target section:定义要执行playbook的远程主机组
variable section:定义playbook运行时需要的变量
task section:定义要在远程主机上执行任务列表
handler section:定义task执行完成以后需要调用的任务
target section参数
hosts:远程主机组
user:执行该任务的用户
sudo:设置为yes的时候,执行任务的时候使用root权限
sudo_user:如果设置为tshare365,执行的时候会使用tshare365用户权限
connection:通过什么方式连接到远程主机,默认ssh
gather_facks:是否启用在远程主机执行setup模块,默认会执行。可用同setup模块获取远程主机的信息,在定义变量的时候使用。
variadble section参数
vars:定义格式 变量名:变量值
vars_files:指定变量文件
vars_prompt:用户交互模式自定义变量
setup:模块取远程主机的值
task section参数
name:输出到屏幕的信息
action:定义执行的动作调用ansible的模块
copy:复制本地文件到远程主机
template:复制本地文件到远程主机也可以在本地文件中调用变量
service:定义服务的状态

案例

#playbooks中定义变量
---
 - hosts: web
   vars: 
 http_port: 80


#ping主机hadoop
---
- hosts: hadoop
  tasks: 
  - name: ping host
ping: 

实例:判断nginx服务是否正常运行

---
- hosts: hadoop
  tasks: 
  - name: 
service: name=httpd state=running

实例:判断selinux的状态

---
- hosts: hadoop
  tasks: 
  - name: 
command: /sbin/setenforce 0

ansible-playbook 条件判断

  1. when条件判断:只条满足when的条件时才执行对应的tasks
---
- hosts: master
  tasks:
  - name: test host IP address
    debug: 'msg="{{ ansible_default_ipv4.address }}"'
    when: ansible_default_ipv4.address == "192.168.1.11"
代码介绍:
当满足条件ansible_default_ipv4.address == "192.168.1.11"时,触发task

案例: 判断chrony配置文件是否存在,如果存在则跳过;如果不存在则复制配置文件

- name: chrony check is exits
  stat: path=/etc/chrony.conf.bak
  register: chrony_conf_status
  #先用register获取chrony.conf.bak文件的状态
- name: backup chrony conf
  copy: src=/etc/chrony.conf dest=/etc/chrony.conf.bak
  when: chrony_conf_status.stat.exists == False
  #判断配置文件是否存在如果存在则不执行该task
  1. changed_when:先执行task,并对task返回的值进行判断,当满足changed_when指定的条件时说明是执行成功的
---
- hosts: master
  tasks:
  - name: check hostname
    shell: "hostname"
    changed_when: ansible_hostname == "master01"

ansible-playbook 循环控制

with_items标准循环

用于循环多个重复任务

---
- hosts: master
  tasks:
  - name: create {{ item }} file
    shell: "touch /tmp/{{ item }}"
    with_items:
      - aaa
      - bbb
      - ccc
代码解释:
通过with_items变量中的值在shell命令中遍历循环

ansible-playbook role

Roles 可以降低 Playbooks 的复杂性,更可以增加 Playbooks 的可用性。

role的目录结构
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml
使用role

创建一个role

ansible-galaxy init base
备注:
ansible-galaxy 是管理 Roles 的指令

创建一个部署高可用k8s项目

基础配置

创建项目目录

mkdir ansible_k8s

创建项目目录

├── deploy.yml
├── group_vars
│   └── all
├── inventory
│   └── hosts
├── roles
│  
└── scripts

编写hosts

cat inventory/hosts 
[master]
master0[1:2]

[node]
node11[1:2]

[master:vars]
ansible_ssh_user=root
ansible_ssh_pass=123

创建一个base role

ansible-galaxy init base

编写deploy.yml

 cat deploy.yml 
---

- hosts: master
  roles:
  - base

在base role里编写一个测试节点网络连通性的task

 cat roles/base/tasks/main.yml 
---
- name: ping test network
  ping:

规划role

服务 所在节点
haproxy master
keepalived master
etcd master
flannel master、node
kube-api、kube-scheduler、kube-controller-manager master
kube-proxy、kubelet node

k8s服务介绍

etc 一个高可用K/V键值对存储和服务发现系统
flannel 实现夸主机的容器网络通信
kube-api 提供k8s集群API
kube-controller-manager 管理集群服务
kube-scheduler 调度容器,分配到node节点
kubelet 在node节点根据配置文件中定义好的参数启动容器
kube-proxy 提供网络代理服务

根据规划创建role

.
├── base
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│       └── main.yml
├── etcd
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│       └── main.yml
├── flannel
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│       └── main.yml
├── haproxy
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│       └── main.yml
├── keepalived
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│       └── main.yml
├── kube-api
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│       └── main.yml
├── kube-controller-manager
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│       └── main.yml
├── kubelet
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│       └── main.yml
├── kube-proxy
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│       └── main.yml
└── kube-scheduler
    ├── defaults
    │   └── main.yml
    ├── files
    ├── handlers
    │   └── main.yml
    ├── meta
    │   └── main.yml
    ├── README.md
    ├── tasks
    │   └── main.yml
    ├── templates
    ├── tests
    │   ├── inventory
    │   └── test.yml
    └── vars
        └── main.yml

编写基础配置task

cat roles/base/tasks/main.yml 
---
- name: ping test network
  ping:

- name: copy hosts configure files to nodes
  copy: src=/etc/hosts dest=/etc/hosts mode=600

- name: setings selinux disabled
  shell: "sed -i '7s/enforcing/disabled/g' /etc/selinux/config"

- name: backup repos
  file: path=/etc/yum.repos.d state=directory

- name: download yum repo file
  get_url: url=http://mirrors.aliyun.com/repo/{{ item }} dest=/etc/yum.repos.d
  register: repos
  with_items:
    - Centos-7.repo
    - epel-7.repo

- name: settings yum repo
  shell: "sed -i '/aliyuncs/d' /etc/yum.repos.d/{{ item }}"
  with_items:
    - Centos-7.repo
    - epel-7.repo

- name: yum clean all
  shell: yum clean all

- name: yum makecache
  shell: yum makecache

master节点安装软件包

---
- name: master node install packages
  yum: name={{ item }} state=latest
  with_items:
    - etcd
    - kubernetes-master 
    - ntp
    - flannel

node节点安装软件包

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章