基于extra vars参数I需要写入变量值ansible playbook
ansible-playbook playbook.yml -e "param1=value1 param2=value2 param3=value3"
Run Code Online (Sandbox Code Playgroud)
如果只通过了param1
myvariable: 'param1'
Run Code Online (Sandbox Code Playgroud)
如果只有param1,则param2通过
myvariable: 'param1,param2'
Run Code Online (Sandbox Code Playgroud)
如果传递了param1,param2,param3,那么变量值将是
myvariable: 'param1,param2,param3'
Run Code Online (Sandbox Code Playgroud)
当我尝试通过模板动态创建变量时,我的playbook总是采用先前的变量值.但在 dest=roles/myrole/vars/main.yml其写作正确的价值.
我在这里尝试一下
- hosts: local
user: roop
gather_facts: yes
connection: local
tasks:
- template: src=roles/myrole/templates/myvar.j2 dest=roles/myrole/vars/main.yml
- debug: var=myvariable
roles:
- { role: myrole }
Run Code Online (Sandbox Code Playgroud)
所以里面myrole目录我创建template和vars
- roles
- myrole
- vars/main.yml
- templates/myvar.j2
Run Code Online (Sandbox Code Playgroud)
模板/ myvar.j2
{% if param1 is defined and param2 is defined and param3 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Ansible重新启动Jenkins服务:
- name: Restart Jenkins to make the plugin data available
service: name=jenkins state=restarted
- name: Wait for Jenkins to restart
wait_for:
host=localhost
port=8080
delay=20
timeout=300
- name: Install Jenkins plugins
command:
java -jar {{ jenkins_cli_jar }} -s {{ jenkins_dashboard_url }} install-plugin {{ item }}
creates=/var/lib/jenkins/plugins/{{ item }}.jpi
with_items: jenkins_plugins
Run Code Online (Sandbox Code Playgroud)
但是在第一次运行时,第三个任务会抛出大量的Java错误,包括:Suppressed: java.io.IOException: Server returned HTTP response code: 503 for URL这让我觉得Web服务器(完全由Jenkins处理)还没准备好.有时当我使用我的浏览器访问Jenkins仪表板时,它表示Jenkins尚未就绪,并且它会重新加载,而且确实如此,它工作正常.但我不确定访问该页面是启动服务器的原因,还是什么.
所以我想我需要多次卷曲直到http代码为200?还有其他方法吗?
无论哪种方式,我该怎么做?
你通常如何重启詹金斯?
我想在ansible中使用when评估多个条件,这里是我的剧本:
- name: Check that the SSH Key exists
local_action:
module: stat
path: "/home/{{ login_user.stdout }}/{{ ssh_key_location }}"
register: sshkey_result
- name: Generating a new SSH key for the current user it's not exists already
local_action:
module: user
name: "{{ login_user.stdout }}"
generate_ssh_key: yes
ssh_key_bits: 2048
when: sshkey_result.rc == 1 and ( github_username is undefined or github_username |lower == 'none' )
Run Code Online (Sandbox Code Playgroud)
这是我的var文件供参考:
---
vpc_region: eu-west-1
key_name: my_github_key
ssh_key_location: .ssh/id_rsa.pub
Run Code Online (Sandbox Code Playgroud)
当我尝试执行此剧本时,我收到此错误:
TASK: [test | Check that the SSH Key exists] ********************************** …Run Code Online (Sandbox Code Playgroud) 我想要完成的是在Docker容器中运行命令,该容器已经使用Ansible在Digital Ocean Ubuntu/Docker Droplet上创建.
似乎无法找到任何东西,或者我主要缺少一些东西.这是我的剧本中的Ansible任务.我对Ansible很新,所以任何建议或智慧都会受到高度赞赏.
- name: Test Deploy
hosts: [my-cluster-of-servers]
tasks:
- name: Go Into Docker Container And Run Multiple Commands
docker:
name: [container-name]
image: [image-ive-created-container-with-on-server]
state: present
command: docker exec -it [container-name] bash
Run Code Online (Sandbox Code Playgroud) 我正在使用ansible来部署我的应用程序.我正在使用以下内容从github克隆应用程序:
- name: Deploy site files from Github repository
sudo: yes
git: repo=git@github.com:xyz/abc.git dest=/home/{{deploy_user}}/{{app_name}} key_file=/home/ubuntu/.ssh/id_rsa accept_hostkey=yes force=yes
Run Code Online (Sandbox Code Playgroud)
我想从存储库中克隆一个特定的分支.我阅读了ansible的文档,但找不到克隆特定分支的任何选项.它可以选择克隆版本但不支持分支.
我在远程主机上生成带有ansible的文件,在这一代之后,我想在另一个任务中读取这些文件.
我找不到任何模块用ansible读取远程文件(查找似乎只在本地主机上).
你知道这样的模块吗?
谢谢
编辑:
这是我的用例:
我生成ssh密钥,然后将其添加到github.这些键是由var文件中的对象设置的,所以我像这样循环生成它:
tasks:
- name: Create ssh key
user:
name: "{{sshConfigFile.user}}"
generate_ssh_key: yes
ssh_key_file: ".ssh/{{item.value.file}}"
state: present
with_dict: "{{sshConfiguration}}"
Run Code Online (Sandbox Code Playgroud)
它工作得很好但是如何读取这些键通过API将其发送到github?
在我看来,这两个工具都用于轻松安装和自动配置应用程序.
但是,我限制使用Docker并且根本没有使用Ansible.所以我有点困惑.
每当我搜索这两种技术之间的比较时,我都会找到有关如何组合使用这些技术的详细信息.
想象一下这个ansible剧本:
- name: debug foo
debug: msg=foo
tags:
- foo
- name: debug bar
debug: msg=bar
tags:
- bar
- name: debug baz
debug: msg=baz
tags:
- foo
- bar
Run Code Online (Sandbox Code Playgroud)
我怎么才能只运行debug baz任务?我想说只运行用fooAND 标记的任务bar.那可能吗?
我尝试了这个,但它将运行所有3个任务:
ansible-playbook foo.yml -t foo,bar
Run Code Online (Sandbox Code Playgroud) 在Ansible剧本我想,如果目录并运行的任务不存在.
- name: Check for java exists in /opt
stat: path=/opt/jdk1.8.0_71
register: p
when: p.stat.isdir is defined and p.stat.isdir
Run Code Online (Sandbox Code Playgroud)
但是,我必须做些什么来确保只有在这个目录不存在的情况下才能运行以下任务?
- name: Extract java if dir not existing
command: tar xzf /tmp/jdk1.8.0_71 chdir=/opt
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个只能编译Nginx的Ansible剧本,如果它还没有出现并且在当前版本中.然而,它每次编译都是不可取的.
这就是我所拥有的:
- shell: /usr/local/nginx/sbin/nginx -v 2>&1
register: nginxVersion
- debug:
var=nginxVersion
- name: install nginx
shell: /var/local/ansible/nginx/makenginx.sh
when: "not nginxVersion == 'nginx version: nginx/1.8.0'"
become: yes
Run Code Online (Sandbox Code Playgroud)
该脚本除了每次运行shell脚本以编译Nginx之外都是有效的.nginxVersion的调试输出是:
ok: [server] => {
"var": {
"nginxVersion": {
"changed": true,
"cmd": "/usr/local/nginx/sbin/nginx -v 2>&1",
"delta": "0:00:00.003752",
"end": "2015-09-25 16:45:26.500409",
"invocation": {
"module_args": "/usr/local/nginx/sbin/nginx -v 2>&1",
"module_name": "shell"
},
"rc": 0,
"start": "2015-09-25 16:45:26.496657",
"stderr": "",
"stdout": "nginx version: nginx/1.8.0",
"stdout_lines": [
"nginx version: nginx/1.8.0"
],
"warnings": []
}
}
}
Run Code Online (Sandbox Code Playgroud)
根据文档我在正确的方面,我错过了什么简单的技巧?