我想在AWS上设置MySQL服务器,使用Ansible进行配置管理.我正在使用Amazon的默认AMI(ami-3275ee5b),它yum用于包管理.
当下面的Playbook被执行时,一切顺利.但是当我第二次运行它时,任务Configure the root credentials失败了,因为MySQL的旧密码不再匹配,因为它上次运行这个Playbook时已经更新了.
这使得Playbook非幂等,我不喜欢.我希望能够根据需要多次运行Playbook.
- hosts: staging_mysql
user: ec2-user
sudo: yes
tasks:
- name: Install MySQL
action: yum name=$item
with_items:
- MySQL-python
- mysql
- mysql-server
- name: Start the MySQL service
action: service name=mysqld state=started
- name: Configure the root credentials
action: command mysqladmin -u root -p $mysql_root_password
Run Code Online (Sandbox Code Playgroud)
什么是解决这个问题的最佳方法,这意味着使Playbook具有幂等性?提前致谢!
在我local.yml能够运行剧本和参考变量group_vars/all但我无法访问其中的变量group_vars/phl-stage.我们假设如下.
ansible-playbook -i phl-stage site.yml
Run Code Online (Sandbox Code Playgroud)
我有一个变量,让我们称之为deploy_path每个环境都不同.我把变量放在里面group_vars/< environment name >.如果我group_vars/phl-stage在vars_files其中包含文件,但我会认为组文件会自动加载?
site.yml
- include: local.yml
Run Code Online (Sandbox Code Playgroud)
local.yml
- hosts: 127.0.0.1
connection: local
vars_files:
- "group_vars/perlservers"
- "group_vars/deploy_list"
Run Code Online (Sandbox Code Playgroud)
group_vars/PHL级
[webservers]
phl-web1
phl-web2
[perlservers]
phl-perl1
phl-perl2
[phl-stage:children]
webservers
perlservers
Run Code Online (Sandbox Code Playgroud)
目录结构:
group_vars
all
phl-stage
phl-prod
site.yml
local.yml
Run Code Online (Sandbox Code Playgroud) 我们有一个Ansible角色需要在handlers/main.yml任务文件中运行三个任务,但它只运行第一个任务.如何强制它运行其他两个任务?ignore如果第一个任务失败,我确实有标志.
该tasks/main.yml文件看起来像:
- name: openfire | Copy plugins into openfire/plugins
copy: src={{ srcdir }}/xmpp/{{ item }} dest=${bindir}/openfire/plugins/{{ item }}
with_items:
- x.jar
- y.jar
sudo: yes
sudo_user: ${tomcat_user}
notify: restart openfire
- name: openfire | Copy jars into openfire/lib
copy: src={{ srcdir }}/xmpp/{{ item }} dest=${bindir}/openfire/lib/{{ item }}
with_items:
- a.jar
- b.jar
sudo: yes
sudo_user: ${tomcat_user}
notify: restart openfire
Run Code Online (Sandbox Code Playgroud)
该handlers/main.yml文件看起来像:
- name: restart openfire
service: name=openfire state=stopped
ignore_errors: true
sudo: yes …Run Code Online (Sandbox Code Playgroud) 我有许多环境,需要定制一堆文本文件才能让mule这样的东西与正确的端点对话.
对于这种环境,这有效:
ansible-playbook test03.yml
Run Code Online (Sandbox Code Playgroud)
环境(来自ansible的观点)之间的唯一区别是./roles/esb/vars/main.yml中包含的信息.
我已经考虑过使用svn为每个环境保留一个vars/main.yml,所以每次我需要配置一个环境时,我会检查角色,然后在运行上面的命令之前检查该环境的vars/main.yml.
对我而言,不是一个优雅的解决方案 我怎么能做得更好?
目录结构
./test03.yml
./roles/esb/vars/main.yml
./roles/esb/tasks/main.yml
./roles/esb/templates/trp.properties.j2
Run Code Online (Sandbox Code Playgroud)
./test03.yml
---
- hosts: test03-esb
gather_facts: no
roles:
- esb
Run Code Online (Sandbox Code Playgroud)
./roles/esb/vars/main.yml
---
jndiProviderUrl: 'jnp://mqendpoint.company.com:1099'
trp_endpoint_estask: 'http://tmfendpoint.company.com:8080/tmf/estask'
trp_endpoint_builderQ: 'jnp://mqendpoint.company.com:1099'
Run Code Online (Sandbox Code Playgroud)
./roles/esb/tasks/main.yml
---
- name: replace variables in templates
template: src=trp.properties.j2 dest=/path/to/mule/deploy/conf/trp.properties
Run Code Online (Sandbox Code Playgroud)
./roles/esb/templates/trp.properties.j2
trp.endpoint.estask={{ trp_endpoint_estask }}
trp.endpoint.builderQ={{ trp_endpoint_builderQ }}
Run Code Online (Sandbox Code Playgroud) 我正在整理一个旨在构建网络服务器的Ansible Playbook.但是我在尝试使用时遇到困难,with_fileglob因为Ansible一直在报告它正在跳过nginx vhost文件的副本.
我的脚本看起来像这样:
- name: Nginx | Copy vhost files
copy: src={{ item }} dest=/etc/nginx/sites-available owner=root group=root mode=600
with_fileglob:
- "{{ templates_dir }}/nginx/sites-available/*"
notify
- nginx-restart:
Run Code Online (Sandbox Code Playgroud)
{{ templates }}已在别处定义为角色/公共/模板.在这个目录中,我有一个名为webserver1的文件,我希望Ansible可以复制到该文件中/etc/nginx/sites-available/
我发现其他人在讨论这个问题,但没有任何回复帮助我解决这个问题.为什么Ansible会跳过文件?
编辑:我应该指出我想使用with_fileglob(而不是直接复制),因为我希望将来迭代其他虚拟主机.
我正在Ansible为我的项目使用一些基础设施管理问题.我使用Linux客户端实现了这项任务,比如说从Ansible服务器复制bin文件并将其安装在客户机上.这涉及我的剧本中的任务,使用正常的Linux命令,如ssh,scp,./ bin等,
现在我想在Windows客户端中实现相同的功能.我找不到任何好的文档来试试.如果你们中的任何人尝试过将Ansible与Windows客户端一起使用,那么如果您可以分享程序或原型或任何信息来开始并进一步解决我的问题,那将会很棒.
我跑Ansible 1.8.2.我在另一个系统上创建了一个拱形文件.在该系统上它没有任何问题.但是,当我在本地系统上运行它时,我收到以下错误:
$» ansible-vault --debug view vars/vaulted_vars.yml
Vault password:
Traceback (most recent call last):
File "/usr/bin/ansible-vault", line 225, in main
fn(args, options, parser)
File "/usr/bin/ansible-vault", line 172, in execute_view
this_editor.view_file()
File "/usr/lib/python2.7/site-packages/ansible/utils/vault.py", line 280, in view_file
dec_data = this_vault.decrypt(tmpdata)
File "/usr/lib/python2.7/site-packages/ansible/utils/vault.py", line 136, in decrypt
data = this_cipher.decrypt(data, self.password)
File "/usr/lib/python2.7/site-packages/ansible/utils/vault.py", line 545, in decrypt
data = unhexlify(data)
TypeError: Odd-length string
ERROR: Odd-length string
Run Code Online (Sandbox Code Playgroud)
我试图手动输入密码或复制粘贴它,但错误仍然发生.
这里发生了什么以及如何解决此错误?
是否可以with_first_found在with_items循环中使用,例如:
- template:
dest=/foo/{{ item.name }}-{{ item.branch | default('master') }}
src={{ item }}
with_first_found:
- {{ item.name }}-{{ item.branch | default('master') }}
- {{ item.name }}.j2
- apache_site.j2
with_items: apache_sites
Run Code Online (Sandbox Code Playgroud)
似乎无法使其正常使用with_nested.
我正在使用Ansible的unarchive模块,但似乎并没有提取war文件.它适用于.tar.
还有一个开关setype:"键入SELinux文件上下文的一部分",我不确定是否可以用来将文件类型设置为war.
我试过这个:
-name: Unpack war
unarchive: src=~/wars/mywar.war
dest=/tmp/deploy
setype=war
copy=no
Run Code Online (Sandbox Code Playgroud)
它给出了错误: msg: Failed to find handler to unarchive. Make sure the required command to extract the file is installed.
当我不使用'setype'时,我再次得到完全相同的错误.
如何使用Ansible提取war文件?
我有Android 5.0.1(API级别21).
我正在使用NewRelic应用程序版本1.9.3.(如果需要,我可以提供此版本的apk).
从更新1.9.4开始READ_EXTERNAL_STORAGE,他们的应用程序开始要求访问,即" 照片/媒体/文件 "权限.
当我联系该公司以获取此许可要求的解释时,他们表示这是" 必须 "访问存储在外部SD卡上的铃声/通知.但是,我一直在我的可移动SD卡上保留我的自定义铃声和通知,我一直能够在这个应用程序中使用它们,而无需要求此权限.
如果没有此权限,此应用程序如何才能访问我的铃声?或者该公司对此许可的解释是否不合理?
ansible ×9
amazon-ec2 ×1
android ×1
client ×1
command-line ×1
handler ×1
mysql ×1
permissions ×1
roles ×1
ubuntu ×1
windows ×1