Ansible 系列命令
Ansible-vault
- 管理加密解密yml文件
- ansible-vault [create|decrypt|edit| encrypt|rekey |view]
- ansible-vault encrypt hello.yml加密
- ansible-vault decrypt hello.yml解密
- ansible-vault view hello.yml查看
- ansible-vault edit hello.yml 编辑加密文件
- ansible-vault rekey hello.yml修改口令
- ansible-vault create new.yml创建新文件
ansible-vault encrypt hello.yml # 加密
ansible-vault decrypt hello.yml # 解密
Ansible-console
- 可交互执行命令,支持tab
root@test (2)[f:10] $
执行用户@当前操作的主机组(当前组的主机数量)f:并发数]$
设置并发数: forksn 例如: forks 10
切换组: cd主机组 例如: cd web
列出当前组主机列表: list
列出当前组主机列表: list
- 示例
root@all (2)[f:5]$ list
root@all (2)[f:5]$ cd appsrvs
root@appsrvs (2)[f:5]$ list
root@appsrvs (2)[f:5]$ yum name=httpd state=present
root@appsrvs (2)[f:5]$ service name=httpd state=started
Ansible-galaxy
- 连接
https://galaxy.ansible.com
下载相应的roles - 列出所有已安装的galaxy
- ansible-galaxy list
- 安装galaxy
- ansible-galaxy install geerlingguy.redis
- 删除galaxy
- ansible-galaxy remove geerlingguy.redis
Ansible PlayBook
- 使用Ad-hoc方式点对点命令执行,可以管理远程主机,如果服务器数量很多,配置信息比较多,可以利用Ansible PlayBook编写剧本,从而以更加简单的方式实现任务处理的自动化与流程化
- PlayBook是一个或多个"play"组成的列表,play的主要功能是为Ansible中的task定义好的角色,指定剧本对应的服务器
- task是一个任务,task调用Ansible各种模块module,将多个play组织在一个PlayBook剧本中,然后组成一个非常完整的流程控制集合
- 基于Ansible PlayBook还可以收集命令、创建任务集,这样能够大大降低管理工作的复杂程度,PlayBook采用YAML语法结构,易于阅读,方便配置
- YAML(yet another markup language)是一种直观的能被电脑识别的数据序列化格式,是一个容易阅读容易和脚本语言交互,用来表达资料序列的编程语言
- YAML语法
- 在单一档案中,可用连续三个连字号(一)区分多个档案。 另外,还有选择性的连续三个点号
- 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
- 使用#号注释代码
- 缩进必须是统-的 ,不能空格和tab混用
- 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结
- YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写的,k/v的值均需大小写敏感
- k/v的值可同行写也可换行写。同行使用:分隔
- v可是个字符串,也可是另一个列表
- 一个完整的代码块功能需最少元素需包括name: task
- 一个name只能包括一个task
- YAML文件扩展名通常为yml或yaml
- YAML使用空白字符和分行来分隔资料,适合用grep、Python、Perl、Ruby操作
- YAML的语言特性
- 可读性强
- 和脚本语言的交互性好
- 使用实现语言的数据类型
- 一致的信息模型
- 易于实现
- 可以基于流来处理
- 可扩展性强
- PlayBooks组件内容
- target:定义PlayBook的远程主机组
- variable:定义PlayBook使用的变量
- task:定义远程主机上执行的任务列表
- play的主体部分是task list.task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个.在运行自下而下某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在更正playbook后重新执行一次即可
- task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致
- 每个task都应该有其name ,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出
- 某任务的状态在运行后为changed时,可通过"notify" 通知给相应的handlers
- 任务可以通过"tags "打标签,而后可在ansible- -playbook命令上使用-t指定进行调用
- handler:定义task执行完成以后需要调用的任务,例如配置文件被改动,则启动handler任务重启相关联的服务
- target常用参数
- hosts:定义远程主机组
- Websrvs:dbsrvs 两个组的并集
- Websrvs:&dbsrvs 两个组的交集
- webservers:!phoenix 在websrvs组,但不在dbsrvs组
- remote_user:执行该任务的用户
- sudo:设置为yes的时候,执行任务使用root权限
- sudo_user:指定sudo普通用户
- connection:默认基于SSH连接客户端
- gather_facks:获取远程主机facts基础信息
- hosts:定义远程主机组
- variable常用参数
- vars:定义格式,变量名:变量值
- vars_files:指定变量文件
- vars_prompt:用户交互模式自定义变量
- setup:模块取远程主机的值
- task常用参数
- name:任务显示名称即屏幕显示信息
- action:定义执行的动作
- copy:复制本地文件到远程主机
- template:复制本地文件到远程主机,可以引用本地变量
- service:定义服务的状态
- template模板,可替换模板文件中的变量并实现一些简单逻辑的文件
- Handlers和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
- handlers和notify结合使用触发条件:
- 是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作
- Notify此action可用于在每个play的最后被触发,这样可避免多次有改变发生在notify中列出的操作称为handler ,也即notify中调用handler中定义的操作在notify中列出的操作称为handler ,也即notify中调用handler中定义的操作
- handlers和notify结合使用触发条件:
- tags标签指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断.例:ansible-playbook -t tagsname useradd.yml
- YAML的语言特性
PlayBook变量
变量名:仅能由字母、数字和下划线组成,且只能以字母开头
-
变量来源:
-
ansible setup facts远程主机的所有变量都可直接调用
- setup: 查看被管理管理主机信息的键值对 , 可以引用setup模块的变量
- ansible -m setup 10.0.0.203
-
在/etc/ansible/hosts中定义
- 普通变量:主机组中主机单独定义,优先级高于公共变量
- 公共(组)变量:针对主机组中所有主机定义统一变量
-
通过命令行指定变量,优先级最高
- ansible-playbook -e varname=value
-
在playbook中定义
vars: - var1: value1 - var2: value2
在role中定义
-
ansible 10.0.0.203 -m hostname -a "name=node10.0.0.203" # 修改的值就在setup中
PlayBook常见选项
- --check 只检测可能会发生的改变,但不真正执行操作
- --list-hosts 列出运行任务的主机
- --limit 主机列表只针对主机列表中的主机执行
- -V 显示过程-VV -VVV 更详细
- --list-tags 列出运行任务的标签
PlayBook的使用
-
案例一:简单使用
- 创建并编辑hosts.yml文件
--- - hosts: web remote_user: root tasks: - name: create new file file: name=/data/newfile state=touch - name: create new user user: name=test111 shell=/sbin/nologin - name: install package yum: name=httpd - name: copy file copy: src=/var/www/html/index.html - name: start service service: name=httpd state=started enabled=yes
- ansible-playbook -C hosts . yml # 预执行playbook
- ansible-playbook hosts . yml # 正常执行playbook
-
案例二:使用相对路径
--- - hosts: websrvs remote_ user: root tasks: - name: Install httpd yum: name=httpd state= present - name: Install configure file copy: src=files/httpd.conf dest=/etc/httpd/conf/ - name: start service service: name=httpd state= started enabled=yes # files的相对路径为家目录下的ansible/files
-
案例三:handler与notify触发条件
- 本地下载httpd包,yum install httpd -y
- 当修改本地配置文件后再次运行ansible-playbook httpd.yml,notify会监控本地/etc/httpd/conf/httpd.conf有没有发生变化,如果有变化则通知handlers来触发它里面的task
--- - hosts: web remote_user: root tasks: - name: install httpd package yum: name=httpd - name: copy conf file copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/ backup=yes notify: restart service - name: start service service: name=httpd state=started enabled=yes handlers: - name: restart service service: name=httpd state=restarted
-
案例四:tags的使用
--- - hosts: web remote_user: root tasks: - name: install httpd package yum: name=httpd tags: inshttpd - name: copy conf file copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/ backup=yes notify: restart service - name: start service service: name=httpd state=started enabled=yes tags: rshttpd handlers: - name: restart service service: name=httpd state=restarted
- ansible-playbook -t rshttpd httpd.yml # -t参数指定运行带有rshttpd标签的task
-
案例五:案例四: 多个动作公用一个tags
--- - hosts: web remote_user: root tasks: - name: install httpd package yum: name=httpd tags: httpd - name: copy conf file copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/ backup=yes notify: restart service - name: start service service: name=httpd state=started enabled=yes tags: httpd handlers: - name: restart service service: name=httpd state=restarted
- ansible-playbook -t httpd httpd.yml # 带有httpd标签的task都会执行
-
案例六:变量的使用
- 在命令行中使用变量(优先级最高)
--- - hosts: web remote_user: root tasks: - name: install package yum: name={{ pak_name1 }} - name: start service service: name={{ pak_name2 }}
ansible-playbook -e 'pak_name1=tree pak_name2=sl' qqq.yml # -e参数指定变量
- 在/etc/ansible/hosts中定义普通变量
[web] 10.0.0.203 http_port=80 10.0.0.204 http_port=81
--- - hosts: web remote_user: root tasks: - name: set hostname hostname: name=www{{http_port}}
- 在/etc/ansible/hosts中定义公共(组)变量
[web] 10.0.0.203 http_port=80 10.0.0.204 http_port=81 10.0.0.204 [web:vars] http_port=82 # 10.0.0.204默认使用组变量,优先级比普通变量低
--- - hosts: web remote_user: root tasks: - name: set hostname hostname: name=www{{http_port}}