安装方式
源码包安装
安装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 条件判断
- 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
- 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节点安装软件包