Ansilbe是一个部署一群远程主机的工具。远程的主机可以是远程虚拟机或物理机, 也可以是本地主机。
Ansilbe通过SSH协议实现远程节点和管理节点之间的通信。理论上说,只要管理员通过ssh登录到一台远程主机上能做的操作,Ansible都可以做到。
Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

1)Virtual BOX使用默认选项来安装
2)安装images



网络设置成:网桥网络,否则容易出问题


安装sftp 插件

ctrl+shift+p 打开,输入sftp,编辑配置文件
ctrl+shift+p 输入sftp 选择同步到本地

选择同步的文件夹

任何在本地主机创建的内容,都可以右键进行同步。
错误提示表明,在连接到远程主机ansible-node1时,您正在尝试使用 SSH 密码进行身份验证,但是Ansible在主机密钥检查(Host Key Checking)启用的情况下无法进行此操作,因为sshpass不支持主机密钥检查
"ssh-keyscan ansible-node1"命令用于扫描远程服务器"ansible-node1"的SSH公钥。
">> ~/.ssh/known_hosts" 命令用于将扫描到的公钥添加到当前用户的 SSH known_hosts 文件中。">>" 符号用于将输出追加到文件末尾,而不是覆盖整个文件。
inventory.ini(设备清单配置文件)
命令解释

组成:

当变量比较多的时候,或者变量需要在多个playbook中重用的时候,可以把变量放到一个单独的文件中。通过关键字var_files把文件中定义的变量引入playbook中,使用变量的方法和在本文件中定义的变量相同。
下载虚拟机和镜像
系统版本:CentOS 7-1804 64bit from osboxes注意一定要选择64bit,32位yum安装必然失败
1)Virtual BOX使用默认选项来安装
2)安装images



网络设置成:网桥网络,否则容易出问题

退出
键盘右边的ctrl
默认的账号和密码
osboxes
osboxes.org
这样就不用花费时间来安装OS系统了,直接打开就可以用了。生成快照:点击备份生成系统快照,防止出错,无法返回。
安装Ansible
sudo yum install epel-release
sudo yum repolist
sudo yum install ansible
ansible --version
设置一:修改hostname
ansible-node1
ansible-node2
ansible-controller
设置二:修改hostsvim /etc/hostsansible-node1
ansible-node2
ansible-controller
编译器设置
新建文件夹使用的sftp 进行同步

安装sftp 插件

ctrl+shift+p 打开,输入sftp,编辑配置文件
{
"name": "My Server",
"host": "192.168.0.108",
"protocol": "sftp",
"port": 22,
"username": "osboxes",
"remotePath": "/home/osboxes/ansible-code",
"uploadOnSave": true,
"useTempFile": false,
"openSsh": false
}
在108主机上,创建ansible-code文件夹ctrl+shift+p 输入sftp 选择同步到本地

选择同步的文件夹

任何在本地主机创建的内容,都可以右键进行同步。
删除远程的文件

安装ansible用于编写palybook给出提示
.
ping主机

安装ansible用于编写palybook给出提示
.

ping主机
#inventor.ini 配置文件
ansible-node1 ansible_connection=ssh ansible_user=osboxes ansible_ssh_pass=osboxes.org
使用ansible pingansible all -m ping -i inventory/inventory.ini
错误处理ansible-node1 | FAILED! => {
"msg": "The module pingg was not found in configured module paths"
}
错误的原因错误提示表明,在连接到远程主机ansible-node1时,您正在尝试使用 SSH 密码进行身份验证,但是Ansible在主机密钥检查(Host Key Checking)启用的情况下无法进行此操作,因为sshpass不支持主机密钥检查
"ssh-keyscan ansible-node1"命令用于扫描远程服务器"ansible-node1"的SSH公钥。
">> ~/.ssh/known_hosts" 命令用于将扫描到的公钥添加到当前用户的 SSH known_hosts 文件中。">>" 符号用于将输出追加到文件末尾,而不是覆盖整个文件。
ssh-keyscan ansible-node1 >> ~/.ssh/known_hosts

inventory.ini(设备清单配置文件)
命令解释
ansible all -m ping -i inventory/inventory.ini
更具体地说,-m ping 参数指定要使用 Ansible 的 ping
模块进行操作。这个模块会在远程主机上执行一个简单的 ping
命令,以测试主机是否可达。
all 参数表示要对 inventory.ini
文件中的所有主机执行操作。在 Ansible 中,inventory
文件用于指定主机和主机组,以便可以针对它们执行操作。
-i inventory/inventory.ini 参数
-i inventory/inventory.ini 参数
指定 Ansible 使用 inventory.ini
文件作为主机清单,以便在其中查找要操作的主机。在这种情况下,Ansible 将使用
inventory.ini 文件中列出的所有主机执行 ping 操作。
更加详细的内容和实现,可以自己查实例。
配置sshkey 登录节点
在controller 生成ssh key
ssh-keygen
默认enter


ssh-copy-id -i my_key.pub user@remote_server
解释:将把公钥添加到 "remote_server" 上 "user" 账户的 authorized_keys
文件中,允许您使用 "my_key" 私钥在不需要密码的情况下登录到该服务器
ssh-copy-id -i id_rsa.pub osboxes@node1
授权后,就不需要使用密码就也可以登录的对应的ssh.#inventory.ini 配置
ansible-node1 ansible_connection=ssh ansible_user=osboxes
ansible-node2 ansible_connection=ssh ansible_user=osboxes
ansible all -m ping -i inventory.ini --private-key=/home/osboxes/.ssh/id_rsa

Ansible-playbook
# yaml 文件三种形式
#键值结构
key:value
name:"Ansible"
#列表层级结构
moudle:
- "NetWork"
- "Linux server"
#字典形式
pulguins:
action_plugin:ture
cache_plugin:true
Ansible Playbook 是一种用于自动化配置、部署和管理 IT
系统的脚本语言和工具。它使用 YAML 文件格式描述系统配置和操作流程,通过
Ansible 引擎执行这些操作,实现自动化管理。组成:
- hosts:为主机的IP,或者主机组名,或者关键字all[需要控制和操作的主机或者分组]
- remote_user: 以哪个用户身份执行
- vars: 用于定义变量
- tasks: playbook的核心,定义顺序执行的动作action。每个action调用一个ansbile module,通过module 来实现
- action 语法: module: module_parameter=module_value
- moudle :表示命令,后面表示参数,moulde通过具体的配置参数,来执行相关action 最终完成任务
有yum、copy、template等,module在ansible的作用,相当于bash脚本中yum,copy这样的命令
常见的用法,自己可以查:
handers:
是playbook的event,默认不会执行,在action里触发才会执行。多次触发只执行一次
注意:同一个Playbook 可以写入多个服务器的执行脚本
---
- hosts: web
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: pkg=httpd state=latest
- name: Write the configuration file
template: src=templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify:
- restart apache
- name: Write the default index.html file
template: src=templates/index.html.j2 dest=/var/www/html/index.html
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted
debug 消息---
- name: Hello World
hosts: localhost
tasks:
- name: Hello World
debug:
msg: "Hello World"

Playbook 变量
用户可以在Playbook中,通过vars关键字自定义变量,使用时用{{
}}引用以来即可。
Playbook中定义和使用的变量的方法
例如下面的例子中,用户定义变量名为http_port,其值为为80。在tasks
firewalld中,通过{{ http_port }}引用。
---
- hosts: web
vars:
http_port: 80
remote_user: root
tasks:
- name: insert firewalld rule for httpd
firewalld: port=\{\{ http_port \}\}/tcp permanent=true state=enabled immediate=yes
把变量放在单独的文件中。当变量比较多的时候,或者变量需要在多个playbook中重用的时候,可以把变量放到一个单独的文件中。通过关键字var_files把文件中定义的变量引入playbook中,使用变量的方法和在本文件中定义的变量相同。
- hosts: web
remote_user: root
vars_files:
- vars/server_vars.yml
tasks:
- name: insert firewalld rule for httpd
firewalld: port=\{\{ http_port \}\}/tcp permanent=true state=enabled immediate=yes
变量文件vars/server_vars.yml的内容为:http_port: 80定义和使用复杂变量有时候我们需要使用的变量的值不是简单的字符串或者数字,而是一个对象。这时候定义的语法如下,格式为YAML的字典格式:
foo:
field1: one
field2: two
访问复杂变量中的子属性,可以利用中括号或者点号:foo['field1']
foo.field1
YAML的陷阱
YAML的陷阱是某些时候YAML和Ansible
Playbook的变量语法不能在一起好好工作了。这里仅发生在指冒号后面的值不能以{开头的时候,如果有必要以{开头,必须加上引号。总之在YAML值的定义中,如果提示YMAL语法错误,都可以尝试下加入引号来解决。
下面的代码会报错:
下面的代码会报错:
- hosts: app_servers
vars:
app_path: \{\{ base_path \}\}/22
解决办法:要在”{ “开始的值加上引号:- hosts: app_servers
vars:
app_path: "\{\{ base_path \}\}/22"
更多高级语法,和高级用法。参考:https://getansible.com/- 对ansible配置文件里面的关键字不能完整理解,还可以参考关键词解释列表:http://docs.ansible.com/ansible/intro_configuration.html#explanation-of-values-by-section
- Ansible官方提供了一些比较常用的、经过测试的Playbook例子https://github.com/ansible/ansible-examples
- Playbook分享平台此外,Ansible还提供了Playbook的分享平台,上面的例子是Ansible用户自己上传的。你如果在没有思路的情况下参考下吧,不过一定要再重新严谨的测试下。https://galaxy.ansible.com/
- 高级用法参考:https://getansible.com/