ansible为时间戳定义变量

ansible为时间戳定义变量,ansible,Ansible,在ansible中设置一个带有时间戳的变量以便在我的剧本中使用它时,我遇到了麻烦。 我想要实现的是在两台服务器中使用发布文件夹名称,并使用相同的时间戳标记一个新的db mysql> show databases; +---------------------------------------------------------------+ | Database | +-------

在ansible中设置一个带有时间戳的变量以便在我的剧本中使用它时,我遇到了麻烦。 我想要实现的是在两台服务器中使用发布文件夹名称,并使用相同的时间戳标记一个新的db

mysql> show databases;
+---------------------------------------------------------------+
| Database                                                      |
+---------------------------------------------------------------+
| information_schema                                            |
| dummy                                                         |
| mysql                                                         |
| performance_schema                                            |
| test_20170314173819Z                                          |
+---------------------------------------------------------------+
我在/ansibleproject/vars/中的一个名为common.yml的文件中定义这些变量

timestamp: "{{lookup('pipe', 'date +%Y%m%d%H%M%SZ')}}"
release_name: '{{ repo_tag }}_{{timestamp}}'
new_db_name: '{{release_name}}'
然后,在一个任务文件上,我创建了如下目录:

- name: "Create new release folder"
  file: path={{new_release_path}} state=directory mode=2775 owner=deployment group=deployment
  become: yes
- name: "Prepare db user rights"
  shell: echo "CREATE DATABASE \`{{new_db_name}}\` CHARACTER SET utf8 COLLATE utf8_general_ci; " > db_create.sql
  when: inventory_hostname ==  groups['app'][0]

- name: "Create new database for new release"
  shell: mysql -h {{mysql_server}} -u{{mysql_username}} -p{{mysql_password}} < db_create.sql
  when: inventory_hostname ==  groups['app'][0]
在一个单独的任务文件中,我创建了如下db:

- name: "Create new release folder"
  file: path={{new_release_path}} state=directory mode=2775 owner=deployment group=deployment
  become: yes
- name: "Prepare db user rights"
  shell: echo "CREATE DATABASE \`{{new_db_name}}\` CHARACTER SET utf8 COLLATE utf8_general_ci; " > db_create.sql
  when: inventory_hostname ==  groups['app'][0]

- name: "Create new database for new release"
  shell: mysql -h {{mysql_server}} -u{{mysql_username}} -p{{mysql_password}} < db_create.sql
  when: inventory_hostname ==  groups['app'][0]
但是db名称具有不同的时间戳

mysql> show databases;
+---------------------------------------------------------------+
| Database                                                      |
+---------------------------------------------------------------+
| information_schema                                            |
| dummy                                                         |
| mysql                                                         |
| performance_schema                                            |
| test_20170314173819Z                                          |
+---------------------------------------------------------------+
我读过关于“set_fact”来设置时间戳的文章,但这似乎在主机上起作用

有没有办法使它在服务器和数据库上保持一致


关于,

这是预期的行为,因为变量在使用时是模板化的,而不是在“定义”时(它们实际上没有定义)。
因此,对每个任务执行日期+%Y%m%d%H%m%SZ(在不同的原因时间)

如果需要一致性,请使用
set\u fact
生成持久事实:

- set_fact:
    timestamp: "{{ lookup('pipe', 'date +%Y%m%d%H%M%SZ') }}"
在此之后,
时间戳
是一个带有管道结果的普通字符串,而不是像您的例子中那样的Jinja表达式


您可以为每个主机或仅为
localhost
创建此事实,并从其他主机以
hostvars['localhost']的形式访问它。时间戳

设置一次并从那里使用它的好主意!谢谢你的邀请。我能够通过localhost的事实实现我想要的。这就是我做的:site.yml
-hosts:localhost任务:-name:“获取当前时间戳”set_-fact:timestamp_-fact:“{{lookup('pipe',date+%Y%m%d%H%m%SZ')}}”
vars/common.yml
时间戳:{{hostvars['localhost'].timestamp\u-fact}}”
我不确定“定义”是否多余在vars文件中再次添加时间戳,但它使以后在任务文件中使用{{timestamp}更容易访问它。这不起作用。。。使用ansible v2.5.5,即使使用set_事实,时间戳仍在更新中