栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

ansible

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ansible

ansible_connection #ssh连接的类型 local ssh paramiko,默认是ssh ansible_ssh_pass #ssh连接时的密码 ansible_ssh_private_key_file #秘钥文件路径 如果不想使用ssh-agent管理秘钥文件时可以使用此选项 ansible_ssh_executable #如果ssh指令不在默认路径中 可以使用该变量来定义其路径// - 自定义主机变量
# 变量优先级
inventory -- group_vars -- host_vars -- register -- vars -- vars_files -- cmdlines
①、在配置文件中定义
- 在inventory中定义(变量优先级最低) webserver nginx
# 修改配置文件
[root master ansible]# head /etc/ansible/hosts 
[agent]
agent1 webserver nginx
agent2
agent3
# 编写yml
[root master ansible]# cat debug.yml 
- hosts: agent1
 tasks: 
 - name: debug message
 debug:
 msg: {{ webserver }} 
# 测试
[root master ansible]# ansible-playbook debug.yml 
PLAY [agent1] *******************************************************************************
TASK [Gathering Facts] **********************************************************************
ok: [agent1]
TASK [debug message] ************************************************************************
ok: [agent1] {
 msg : nginx 
PLAY RECAP **********************************************************************************
agent1 : ok 2 changed 0 unreachable 0 failed 0 skipped 0 rescued 0 ignored 0 
②、在playbook中定义
- 通过vars关键字定义变量
- 通过vars_files关键字引入变量文件
- 通过vars关键字定义变量
# 通过vars关键字定义变量实例
[root master ansible]# cat debug2.yml 
- hosts: agent1
 vars: 
 webserver: html
 tasks: 
 - name: debug message
 debug:
 msg: {{ webserver }} 
# 运行测试
[root master ansible]# ansible-playbook debug2.yml 
PLAY [agent1] *******************************************************************************
TASK [Gathering Facts] **********************************************************************
ok: [agent1]
TASK [debug message] ************************************************************************
ok: [agent1] {
 msg : html 
PLAY RECAP **********************************************************************************
agent1 : ok 2 changed 0 unreachable 0 failed 0 skipped 0 rescued 0 ignored 0 
- 通过vars_files关键字引入变量文件
 变量的定义格式成键值对出现 键值对之间可以嵌套 形成一个大字典
③、目录定义变量
- 通过host_vars和group_vars目录定义变量
# 在/etc/ansible下 其结构如下
[root master ansible]# tree
├── ansible.cfg
├── debug.yml
├── group_vars
├── hosts
├── host_vars
│ └── agent1
├── register.yml
└── roles
# 在ansible文件夹创建host_vars目录
# host_vars下创建指定主机的文件名文件 在文件中指定变量
# example: (给主机3创建web mysql变量)
[root master ansible]# mkdir /etc/ansible/host_vars/
[root master ansible]# vim /etc/ansible/host_vars/agent3
web: mysql
[root master ansible]# vim debug2.yml
- hosts: agent3
 tasks:
 - name: debug message
 debug:
 msg: {{ web }} 
测试结果如下:
[root master ansible]# ansible-playbook debug2.yml 
PLAY [agent3] *******************************************************************************
TASK [Gathering Facts] **********************************************************************
ok: [agent3]
TASK [debug message] ************************************************************************
ok: [agent3] {
 msg : mysql 
PLAY RECAP **********************************************************************************
agent3 : ok 2 changed 0 unreachable 0 failed 0 skipped 0 rescued 0 ignored 0 
# 在ansible文件夹创建group_vars目录 必须是组名 定义方式和vars一样
④、注册变量
- 将某一条任务执行的结果保存下来 通过register关键字来实现讲某一任务保存为一个变量
#examples
[root master ansible]# cat register.yml
- hosts: agent1
 tasks:
 - name: ls
 shell: ls /tmp
 register: result
 - name: debug
 debug:
 msg: {{ result }} 
 - debug:
 msg: {{ result.rc }} 
#关于输出的debug说明
 changed: ansible基于此来判断是否发生了状态改变
 cmd: 被调用的命令
 failed: 是否运行失败
 delta: 任务执行的时间
 rc: 返回值 0为正常 非0为异常
 stderr: 错误结果输出 输出值是一个字符串
 stderr_lines: 错误结果输出 输出值是一个列表
 stdout: 正确结果输出 输出值是一个字符串
 stdout_lines: 正确结果输出 输出值是一个列表 # 可以对列表进行循环取值
## register.yml 执行结果 (经供参考)
[root master ansible]# ansible-playbook register.yml 
PLAY [agent1] *******************************************************************************
TASK [Gathering Facts] **********************************************************************
ok: [agent1]
TASK [ls] ***********************************************************************************
changed: [agent1]
TASK [debug] ********************************************************************************
ok: [agent1] {
 msg : {
 changed : true,
 cmd : ls /tmp ,
 delta : 0:00:00.002672 ,
 end : 2021-06-06 05:42:08.336638 ,
 failed : false,
 rc : 0,
 start : 2021-06-06 05:42:08.333966 ,
 stderr : ,
 stderr_lines : [],
 stdout : ansible_command_payload_9vxnktnpnansible_command_payload_ghdfsyvcnsystemd-private-ad6599e08cee40dd831f840406dfd453-bluetooth.service-r7lrRVnsystemd-private-ad6599e08cee40dd831f840406dfd453-chronyd.service-5Y5DJOnsystemd-private-ad6599e08cee40dd831f840406dfd453-colord.service-gpKvoYnsystemd-private-ad6599e08cee40dd831f840406dfd453-httpd.service-8D5kA0nsystemd-private-ad6599e08cee40dd831f840406dfd453-ModemManager.service-eoY0lTnsystemd-private-ad6599e08cee40dd831f840406dfd453-rtkit-daemon.service-GslSWQnvmware-root_1004-2957649132nvmware-root_1018-2990547707 ,
 stdout_lines : [
 ansible_command_payload_9vxnktnp ,
 ansible_command_payload_ghdfsyvc ,
 systemd-private-ad6599e08cee40dd831f840406dfd453-bluetooth.service-r7lrRV ,
 systemd-private-ad6599e08cee40dd831f840406dfd453-chronyd.service-5Y5DJO ,
 systemd-private-ad6599e08cee40dd831f840406dfd453-colord.service-gpKvoY ,
 systemd-private-ad6599e08cee40dd831f840406dfd453-httpd.service-8D5kA0 ,
 systemd-private-ad6599e08cee40dd831f840406dfd453-ModemManager.service-eoY0lT ,
 systemd-private-ad6599e08cee40dd831f840406dfd453-rtkit-daemon.service-GslSWQ ,
 vmware-root_1004-2957649132 ,
 vmware-root_1018-2990547707 
TASK [debug] ********************************************************************************
ok: [agent1] {
 msg : 0 
PLAY RECAP **********************************************************************************
agent1 : ok 4 changed 1 unreachable 0 failed 0 skipped 0 rescued 0 ignored 0 
⑤、命令行定义变量
- cmdline定义的变量高于一切 优先级最高 
写法: ansible-playbook debug.yml -e webserver mysql 
 ansible-playbook debug.yml --extra-vars { webserver : mysql , test : user } 
# example
[root master ansible]# cat debug.yml 
- hosts: agent1
 tasks: 
 - name: debug message
 debug:
 msg: {{ webserver }} 
# 正常情况变量为httpds
[root master ansible]# ansible-playbook debug.yml 
PLAY [agent1] *******************************************************************************
TASK [Gathering Facts] **********************************************************************
ok: [agent1]
TASK [debug message] ************************************************************************
ok: [agent1] {
 msg : httpds 
PLAY RECAP **********************************************************************************
agent1 : ok 2 changed 0 unreachable 0 failed 0 skipped 0 rescued 0 ignored 0 
# 在命令行指定变量后 变量修改为了mysql
[root master ansible]# ansible-playbook debug.yml -e webserver mysql 
PLAY [agent1] *******************************************************************************
TASK [Gathering Facts] **********************************************************************
ok: [agent1]
TASK [debug message] ************************************************************************
ok: [agent1] {
 msg : mysql 
PLAY RECAP **********************************************************************************
agent1 : ok 2 changed 0 unreachable 0 failed 0 skipped 0 rescued 0 ignored 0 
2、ansible变量之fact 魔法变量 - fact变量 ①、fact简介

ansible有一个模块叫setup 用于获取远程主机的相关信息 并可以将这些信息作为变量在playbook里进行调用。而setup模块获取这些信息的方法就是依赖于fact

- setup模块用法
# 查看所有的fact信息
ansible test -m setup
# 查看网卡的信息
ansible test -m setup -a filter ansible_ens160 
# 查看主机内存信息
ansible test -m setup -a filter ansible_*_mb 
# 讲所有主机的信息输入到/tmp/facts目录下 每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的主机名)生成为主机名的json文件
ansible all -m setup --tree /tmp/facts
- facts数据中经常获取的信息 关键字说明ansible_python_versionansible_ethoansible_distribution显示是何操作系统ansible_distribution_major_version显示系统主版本号ansible_devices显示磁盘设备信息ansible_lvm显示lvm相关信息ansible_memtotal_mb显示系统总内存ansible_kernel显示内核版本ansible_ens160显示网卡ansible_fqdn显示主机fqdn(Fully Qualified Domain Name)全限定域名ansible_hostname显示主机名 - ansible-facts
facts数据的顶级key为ansible_facts 在引用时将其包含在变量表达式中。但自动收集的facts比较特
殊 它以ansible_facts作为key ansible每次收集后会自动将其注册为变量 所以facts中的数据可以
直接通过变量引用 甚至连顶级key ansible_facts都要省略。
*例如引用ipv4的地址
 ansible_ens160.ipv4.address
 或者写成 
 ansible_facts.ens160.ipv4.address
 而不能写成 
 ansible_facts.ansible_ens160.ipv4.address
- 如何开启关闭收集facts
# 如果不需要用到facts数据 那么我们可以关闭收集facts的功能。也可以用setup模块主动收集facts
- host: agent1
 gather_facts: false # 关闭自动收集facts,默认是开启
 tasks: 
 - name: test gather facts
 setup: 
②、自定义fact
- ansible支持为某个主机定制fact 称为本地fact。本地fact默认存放在/etc/ansible/facts.d目录下 且类型为ini格式或json格式时 ansible会自动识别。(以这种形式加载的fact是key为ansible_local的特殊变量)
- 在ansible主控端定义一个ini格式的custom.fact文件
[root master ansible]# cat custom.fact 
[custom]
package httpd
service httpd
state httpd
# 编写playbook 将fact文件发送个被控端 文件必须发送到/etc/ansible/facts.d/下
[root master ansible]# cat def_facts.yml 
- hosts: agent1
 tasks:
 - name: create dir
 file: 
 path: /etc/ansible/facts.d/
 state: directory 
 - name: copy custom facts to agent
 copy: 
 src: /etc/ansible/custom.fact
 dest: /etc/ansible/facts.d/custom.fact
 - name: debug custom.state
 debug:
 msg: {{ ansible_local.custom.custom.state }} 
# 测试变量定义是否成功
[root master ansible]# ansible-playbook facts2.yml 
PLAY [agent1] ******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [agent1]
TASK [get custom.package] ******************************************************
ok: [agent1] {
 msg : {
 package : httpd ,
 service : httpd ,
 state : httpd 
PLAY RECAP *********************************************************************
agent1 : ok 2 changed 0 unreachable 0 failed 0 skipped 0 rescued 0 ignored 0 
③、set-fact(用处不大)
# set_fact模块 用于拼接变量
- hosts: agent1
 tasks:
 - name: test set_fact
 set_fact: 
 version: : {{ ansible_distribution }} - {{ ansible_distribution_version }} 
 - name: debug
 debug: 
 msg: {{ version }} 
# 测试结果如下(拼接完成)
TASK [debug] ***********************************************************************************
ok: [agent1] {
 msg : RedHat - 8.2 
④ 、lookup生成变量 1、[file]
可以将文件 主控端 的内容赋值给一个变量
 {{ lookup( file , /root/.ssh/id_rsa.pub ) }} 
2、[pipe]
可以将命令执行 主控端 的结果赋值给一个变量 
 {{ lookup( pipe , data %Y%m%d%H%M%S ) }} 
3、[env]
可以获取主控端的环境变量 
 {{ lookup( env , HOSTNAME ) }} 
4、测试
# playbook
[root master ansible]# cat lookup.yml 
- hosts: agent1
 vars: 
 key_ssh: {{ lookup( file , /root/.ssh/id_rsa.pub ) }} 
 date: {{ lookup( pipe , date %Y%m%d%H%M%S ) }} 
 env: {{ lookup( env , HOSTNAME ) }} 
 tasks: 
 - debug: 
 msg: {{ key_ssh }} 
 - debug: 
 msg: {{ date }} 
 - debug:
 msg: {{ env }} 
# 执行结果
[root master ansible]# ansible-playbook lookup.yml 
PLAY [agent1] **********************************************************************************
TASK [Gathering Facts] *************************************************************************
ok: [agent1]
TASK [debug] ***********************************************************************************
ok: [agent1] {
 msg : ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDsks4c6iusGmBwAVG9ui8iRW5mkvWmWcu59sZBvWWcg0q0d4pLGh44TWTAokh2KOXhu6ni59DTUlAf0CvXTQXbkIfWGEeHbsQpfO7qM67Jlot5ehgM2jPxtzT9ENmWabeMgWd8lqMz0iIg87q0cBitAZgh1yYuUSmccUqUF0mD6UOvsrsymFjBhsyqKmjpdO822fJ3KtBEoHIkd9dYcsCrH1hgFwb3nS0Oy7XoYJWUvQ1fXn V4R//jOioE8seI3r2hOB6AEi6no4hARutJTssckrWW7B2oXgbVFygwhL/t4RhUeYnv6o2ZXJHhT/dxbuaA1XW/ytzMRpCWW1iGCb/R/ilTUJ0BS22VnF82R50frHwmZ1nXny25LSacCezn RZCgg034aY9sqKvUuWiIPV1xDB3iXtY7SQo/8 TtX8d5xv95Hj8grAwgLn3zzYsQCU5qNECfHqBWAnuy4FgQD1 OeiF4M04XumuUSbqLlDqdaMYV8lDHcp 8lwARpjbrs root master 
TASK [debug] ***********************************************************************************
ok: [agent1] {
 msg : 20210614002841 
TASK [debug] ***********************************************************************************
ok: [agent1] {
 msg : master 
PLAY RECAP *************************************************************************************
agent1 : ok 4 changed 0 unreachable 0 failed 0 skipped 0 rescued 0 ignored 0 
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/267341.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号